はじめに
Google Pixel 8 の SoC (G3) の Edge TPU は 2個というのは、下記のブログで紹介しました。
今回は、デバイスドライバをもう少し掘ってみたので、2個である証拠が見つかりましたので、記録として残します。
リセット関係
リセット関係の edgetpu_mobile_firmware_reset_cpu という関数の中で EDGETPU_REG_RESET_CONTROLという名前のレジスタにアクセスしています。
if (!assert_reset) program_iremap_csr(etdev); for (i = 0; i < EDGETPU_NUM_CORES; i++) edgetpu_dev_write_32_sync(etdev, EDGETPU_REG_RESET_CONTROL + i * 8, assert_reset ? 1 : 0);
また、上記の program_iremap_csr 関数でも同じように2回同じ名前のレジスタにアクセスしています。
static void program_iremap_csr(struct edgetpu_dev *etdev) { const int ctx_id = 0, sid0 = 0x30, sid1 = 0x34; edgetpu_dev_write_32(etdev, EDGETPU_REG_INSTRUCTION_REMAP_SECURITY, (ctx_id << 16) | sid0); edgetpu_dev_write_32(etdev, EDGETPU_REG_INSTRUCTION_REMAP_SECURITY + 8, (ctx_id << 16) | sid1); edgetpu_dev_write_32(etdev, EDGETPU_REG_INSTRUCTION_REMAP_NEW_BASE, EDGETPU_INSTRUCTION_REMAP_BASE); edgetpu_dev_write_32(etdev, EDGETPU_REG_INSTRUCTION_REMAP_NEW_BASE + 8, EDGETPU_INSTRUCTION_REMAP_BASE); edgetpu_dev_write_32(etdev, EDGETPU_REG_INSTRUCTION_REMAP_LIMIT, EDGETPU_INSTRUCTION_REMAP_BASE + SZ_32M); edgetpu_dev_write_32(etdev, EDGETPU_REG_INSTRUCTION_REMAP_LIMIT + 8, EDGETPU_INSTRUCTION_REMAP_BASE + SZ_32M); edgetpu_dev_write_32(etdev, EDGETPU_REG_INSTRUCTION_REMAP_CONTROL, 1); edgetpu_dev_write_32(etdev, EDGETPU_REG_INSTRUCTION_REMAP_CONTROL + 8, 1); }
EDGETPU_REG_INSTRUCTION_REMAP_SECURITY レジスタの値が
- (ctx_id << 16) | sid0 <= sid0 = 0x30
- (ctx_id << 16) | sid1 <= sid1 = 0x34
になっています。sid0 と sid1 が連続ではなく、4つとんでいるのは何か意味するのでしょうかね。
なお、G1/G2のEdge TPUのデバイスドライバでは、program_iremap_csr関数のようなコードはありません。
割り込み関連
G1の割り込みは、下記のように1個
interrupts = <GIC_SPI IRQ_NS_TPU_TPU IRQ_TYPE_LEVEL_HIGH>;
G2の割り込みは、下記のように8個
interrupts = <0 IRQ_MAILBOX_TPU2AP_NS_TPU_0_TPU IRQ_TYPE_LEVEL_HIGH>, <0 IRQ_MAILBOX_TPU2AP_NS_TPU_1_TPU IRQ_TYPE_LEVEL_HIGH>, <0 IRQ_MAILBOX_TPU2AP_NS_TPU_2_TPU IRQ_TYPE_LEVEL_HIGH>, <0 IRQ_MAILBOX_TPU2AP_NS_TPU_3_TPU IRQ_TYPE_LEVEL_HIGH>, <0 IRQ_MAILBOX_TPU2AP_NS_TPU_4_TPU IRQ_TYPE_LEVEL_HIGH>, <0 IRQ_MAILBOX_TPU2AP_NS_TPU_5_TPU IRQ_TYPE_LEVEL_HIGH>, <0 IRQ_MAILBOX_TPU2AP_NS_TPU_6_TPU IRQ_TYPE_LEVEL_HIGH>, <0 IRQ_MAILBOX_TPU2AP_NS_TPU_7_TPU IRQ_TYPE_LEVEL_HIGH>;
G3の割り込みは、16個なので、G2 の倍になっています。
interrupts = <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_0_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_1_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_2_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_3_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_4_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_5_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_6_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_7_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_8_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_9_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_10_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_11_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_12_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_13_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_14_TPU IRQ_TYPE_LEVEL_HIGH>, <0x00 IRQ_MAILBOX_TPU2AP_NS_TPU_15_TPU IRQ_TYPE_LEVEL_HIGH>;
TPUの割り込み、G1 => G2 で変わって、G3では G2 と基本は同じ。
おわりに
G3 の EdgeTPU は、2個である証拠がありましたら、また、ブログに残したいです。