TenstorrentのBlackholeには、4個のARC CPUが搭載されています。このARC上で動いているのが、tt-zephyr-platforms のようです。
今回は、公開されている tt-zephyr-platforms の中を覗いてみます。
NotebookLMの音声概要
tt-zephyr-platforms
今回は、Board の dts (P300) を見てみます。
Board の dts (P300)
P300
最初に、tt_blackhole_dmc.dtsi を includesしています。
/dts-v1/; #include <st/g0/stm32g0b1Xe.dtsi> #include <st/g0/stm32g0b1v(b-c-e)ix-pinctrl.dtsi> #include "tt_blackhole_dmc.dtsi" /* These two I/O have external pull-ups to 1.8V */ &i2c1_scl_pa9 { /delete-property/ bias-pull-up; }; &i2c1_sda_pa10 { /delete-property/ bias-pull-up; };
その下に、chip1 。
コメントを見ると、
- chip0 (right chip) : remote
- chip1 (left chip) : local
/* * Left chip is local (comes up in non bifercation mode) this is referred to as chip1 * in the schematics * Right chip is remote, and is referred to as chip0 */ / { model = "Tenstorrent Blackhole p300 board"; compatible = "tenstorrent,blackhole,p300"; chosen { zephyr,sram = &sram0; zephyr,flash = &flash0; zephyr,code-partition = &slot0_partition; }; chip1: chip1 { compatible = "tenstorrent,bh-chip"; asic_reset { compatible = "zephyr,gpio-line"; label = "Line to asic reset"; gpios = <&gpiob 1 GPIO_ACTIVE_LOW>; }; spi_reset { compatible = "zephyr,gpio-line"; label = "Line to SPI reset"; gpios = <&gpioc 8 GPIO_ACTIVE_LOW>; }; pgood { compatible = "zephyr,gpio-line"; label = "PGOOD signal for asic 1"; gpios = <&gpioc 5 GPIO_PULL_DOWN>; }; therm_trip { compatible = "zephyr,gpio-line"; label = "Thermal trip indicator"; gpios = <&gpioc 9 GPIO_ACTIVE_HIGH>; }; jtag { compatible = "zephyr,jtag-gpio"; status = "okay"; tck-gpios = <&gpiod 9 GPIO_ACTIVE_HIGH>; tdi-gpios = <&gpiod 10 GPIO_ACTIVE_HIGH>; tdo-gpios = <&gpiod 11 GPIO_ACTIVE_HIGH>; tms-gpios = <&gpiod 12 GPIO_ACTIVE_HIGH>; port-write-cycles = <2>; tck-delay = <1>; }; strapping { gpio6 { compatible = "zephyr,gpio-line"; label = "GPIO pin representing strap gpio6"; gpios = <&chip1_strapping 4 GPIO_ACTIVE_HIGH>; }; }; flash = <&chip1_flash>; spi_mux { compatible = "zephyr,gpio-line"; label = "Line to spi mux, drive low to enable dmfw -> eeprom"; gpios = <&gpiob 6 GPIO_ACTIVE_LOW>; }; arc = <&chip1_arc>; };
jtag が付いていますね。
jtag { compatible = "zephyr,jtag-gpio"; status = "okay"; tck-gpios = <&gpiod 9 GPIO_ACTIVE_HIGH>; tdi-gpios = <&gpiod 10 GPIO_ACTIVE_HIGH>; tdo-gpios = <&gpiod 11 GPIO_ACTIVE_HIGH>; tms-gpios = <&gpiod 12 GPIO_ACTIVE_HIGH>; port-write-cycles = <2>; tck-delay = <1>; }; strapping { gpio6 { compatible = "zephyr,gpio-line"; label = "GPIO pin representing strap gpio6"; gpios = <&chip1_strapping 4 GPIO_ACTIVE_HIGH>; }; };
Clock
Clock は、同じです。
&clk_lsi { clock-frequency = <DT_FREQ_K(32)>; status = "okay"; }; &clk_hsi { clock-frequency = <DT_FREQ_M(16)>; status = "okay"; }; &pll { clocks = <&clk_hsi>; div-m = <1>; mul-n = <8>; div-r = <2>; div-q = <2>; div-p = <2>; status = "okay"; }; &rcc { clocks = <&pll>; clock-frequency = <DT_FREQ_M(64)>; ahb-prescaler = <1>; apb1-prescaler = <1>; };
I2C
I2C も同じ
&i2c1 { pinctrl-0 = <&i2c1_scl_pa9 &i2c1_sda_pa10>; pinctrl-names = "default"; status = "okay"; clock-frequency = <I2C_BITRATE_FAST>; ina228: ina228@40 { compatible = "ti,ina228"; reg = <0x40>; status = "okay"; /* max_current / (2^19) */ current-lsb-microamps = <210>; rshunt-micro-ohms = <1000>; }; gpiox0: gpio@38 { compatible = "nxp,pca9554"; reg = <0x38>; status = "okay"; ngpios = <8>; /* external pull-up to 1.8V */ int-gpios = <&gpioa 1 GPIO_ACTIVE_LOW>; gpio-controller; #gpio-cells = <2>; }; gpiox1: gpio@39 { compatible = "nxp,pca9554"; reg = <0x39>; status = "okay"; ngpios = <8>; /* external pull-up to 1.8V */ int-gpios = <&gpioa 1 GPIO_ACTIVE_LOW>; gpio-controller; #gpio-cells = <2>; }; gpiox2: gpio@3a { compatible = "nxp,pca9554"; reg = <0x3a>; status = "okay"; ngpios = <8>; /* external pull-up to 1.8V */ int-gpios = <&gpioa 1 GPIO_ACTIVE_LOW>; gpio-controller; #gpio-cells = <2>; }; gpiox3: gpio@3b { compatible = "nxp,pca9554"; reg = <0x3b>; status = "okay"; ngpios = <8>; /* external pull-up to 1.8V */ int-gpios = <&gpioa 1 GPIO_ACTIVE_LOW>; gpio-controller; #gpio-cells = <2>; }; }; &i2c3 { pinctrl-0 = <&i2c3_scl_pa7 &i2c3_sda_pb4>; pinctrl-names = "default"; status = "okay"; clock-frequency = <I2C_BITRATE_FAST>; compatible = "st,tt-stm32-i2c"; scl-gpios = <&gpioa 7 GPIO_OPEN_DRAIN>; sda-gpios = <&gpiob 4 GPIO_OPEN_DRAIN>; bh_arc: i2c@54 { compatible = "zephyr,i2c-target-eeprom"; reg = <0x54>; status = "okay"; }; aardvark: eeprom@55 { compatible = "zephyr,i2c-target-eeprom"; reg = <0x55>; status = "okay"; }; };
SPI
&spi1 { pinctrl-0 = <&spi1_nss_pa4 &spi1_sck_pb3 &spi1_miso_pa11 &spi1_mosi_pa12>; pinctrl-names = "default"; status = "okay"; flash1: flash@0 { /* base properties */ compatible = "jedec,spi-nor"; status = "okay"; reset-gpios = <&gpioc 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>; /* spi-device properties */ reg = <0>; spi-max-frequency = <7999999>; spi-cpol; spi-cpha; /* jedec,spi-nor properties */ size = <DT_SIZE_M(512)>; /* Size in bits */ /* jedec,spi-nor-common properties */ has-dpd; t-enter-dpd = <3000>; t-exit-dpd = <30000>; jedec-id = [20 bb 20]; }; };
FLASH
FLASH も同じ
&flash0 { /* TODO: * Move slot1_partition to spi flash. * Ensure main flash erase size agrees with minimal subsector erase size of SPI flash, * i.e. 4096 bytes. Currently sectors are 2048 bytes on stm32g071rb and this value is * likely hard-coded in several places. */ /* erase-block-size = <4096>; */ partitions { compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; boot_partition: partition@0 { label = "mcuboot"; reg = <0x00000000 DT_SIZE_K(48)>; read-only; }; slot0_partition: partition@c000 { label = "image-0"; reg = <0x0000c000 (DT_SIZE_K(230) + DT_SIZE_K(2))>; }; slot1_partition: partition@46000 { label = "image-1"; reg = <0x00046000 (DT_SIZE_K(230))>; }; }; };
SMBUS
SMBUSは、ちょっと違いますね。
/* * I2C1_SW_EN is F8 * I2C1 is I2C1 * I2C1 is Chip0 */ &smbus1 { status = "okay"; compatible = "st,tt-stm32-smbus"; chip0_arc: bh_arc@A { compatible = "tenstorrent,bh-arc"; reg = <0xA>; gpios = <&gpiof 8 GPIO_ACTIVE_LOW>; }; };
/* * I2C0_SW_EN is F9 * I2C0 is I2C3 * I2C0 is Chip1 */ &smbus3 { status = "okay"; compatible = "st,tt-stm32-smbus"; chip1_arc: bh_arc@A { compatible = "tenstorrent,bh-arc"; reg = <0xA>; gpios = <&gpiof 9 GPIO_ACTIVE_LOW>; }; };
おわりに
P300の dts を見てみました。
というドキュメントがあります。
このドキュメントにしたがって、build するんですね。