Vengineerの戯言

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

Google Tensor内のEdgeTPUのデバイスドライバ

はじめに

水曜日(11/3) に Google Tensor について、ハードウェアスペックについて書き込ました。

Google Pixel 6/6 Proに搭載されているGoogle Tensor(開発コード名はGS101)というSoC。そのSoCには、EdgeTPUも載っています。 今日は、搭載されている EdgeTPU のデバイスドライバソースコードを見つけたので、ちょっと掘ってみました。

ざっくりわかったこと

GS101のEdgeTPUのデバイスドライバソースコードを眺めていたら、タイル数は16っぽい。かつ、アーキテクチャは 単体のEdgeTPU、Pixel 4のASICのEdgeTPUと同じっぽです。

デバイスドライバ的には、Mailbox経由でEdgeTPU側のCPUとの通信しているだけなので、EdgeTPU側で何をやってるかまでは不明です。

  • Pixel 4のEdgeTPUは、darwinn
  • Pixel 6のEdgeTPUは、abrolhos

ソースコードの場所

EdgeTPUのデバイスドライバは、ここ にありました。

android/kernel/google-modules/edgetpu

です。

バイス

このファイルに、デバイスドライバ名がありました。

GS101 が Google Tensor のコード名なんでしょうね。

androidの中では、/dev/abolhos を /dev/edgetpu にシンボリックリンクしています。

このファイルに、デバイス名がありますね。

static const struct of_device_id edgetpu_of_match[] = {
    /* TODO(b/190677977): remove  */
    { .compatible = "google,darwinn", },
    { .compatible = "google,edgetpu-gs101", },
    { /* end of list */ },
};

IOCTL

ioctl のファイルは、edgetpu.h です。

  • EDGETPU_MAP_BUFFER
  • EDGETPU_UNMAP_BUFFER
  • EDGETPU_SET_EVENTFD
  • EDGETPU_CREATE_GROUP
  • EDGETPU_JOIN_GROUP
  • EDGETPU_FINALIZE_GROUP
  • EDGETPU_SET_PERDIE_EVENTFD
  • EDGETPU_UNSET_EVENT
  • EDGETPU_UNSET_PERDIE_EVENT
  • EDGETPU_SYNC_BUFFER
  • EDGETPU_MAP_DMABUF
  • EDGETPU_UNMAP_DMABUF
  • EDGETPU_ALLOCATE_DEVICE_BUFFER
  • EDGETPU_CREATE_SYNC_FENCE
  • EDGETPU_SIGNAL_SYNC_FENCE
  • EDGETPU_MAP_BULK_DMABUF
  • EDGETPU_UNMAP_BULK_DMABU
  • EDGETPU_SYNC_FENCE_STATUS
  • EDGETPU_RELEASE_WAKE_LOCK
  • EDGETPU_ACQUIRE_WAKE_LOCK
  • EDGETPU_FIRMWARE_VERSION
  • EDGETPU_GET_TPU_TIMESTAMP
  • EDGETPU_GET_DRAM_USAGE
  • EDGETPU_ACQUIRE_EXT_MAILBOX
  • EDGETPU_RELEASE_EXT_MAILBOX
  • EDGETPU_GET_FATAL_ERRORS

Mailbox

ホストとEdgeTPUは、Mailbox を使って通信しています。このホスト以外にもあるようです。

/* mailbox types */
#define EDGETPU_EXT_MAILBOX_TYPE_TZ        1
#define EDGETPU_EXT_MAILBOX_TYPE_GSA       2
#define EDGETPU_EXT_MAILBOX_TYPE_DSP       3

GSAは、ホストとのMailboxです。TZとDSPは、謎です。

TZは、このファイル内の abrolhos_check_ext_mailbox_args関数では、TZを使っているようです。

おわりに

この部分に、次のようなコメントがありました。 CadenceのエミュレータPalladiumを使っていたんですね。

/* Set extra ludicrously high to 60 seconds for (slow) Palladium emulation. */