Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

Google Pixel 8 の SoC (G3) の EdgeTPU は2個 (その3)

はじめに

Google Pixel 8 の SoC (G3) の Edge TPU は 2個というのは、下記のブログで紹介しました。

vengineer.hatenablog.com

今回は、デバイスドライバをもう少し掘ってみたので、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個である証拠がありましたら、また、ブログに残したいです。