Vengineerの妄想

人生を妄想しています。

Google Edge TPU のデバイスドライバを見つけました

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった

このツイートで、Google Edge TPU DevBoardのデバイスドライバと Pixel 4に入っているASICのデバイスドライバがあるのを知りました。

 まずは、DevBoardのデバイスドライバ。。。

実は、M.2 or Mini PCIe の Get stated のログとして、出てきているんですよ。

coral.withgoogle.com

この部分、引用しますね。

sudo sh -c "echo 'SUBSYSTEM==\"apex\", MODE=\"0660\", GROUP=\"apex\"' >> /etc/udev/rules.d/65-apex.rules"
sudo groupadd apex
sudo adduser $USER apex

 デバイスドライバの名前は、apex です。

早速、Linux 内のデバイスドライバを見てみましょう。

だいたい良くわからないものは、misc に居るんですが、apex は、staging/gasket にあります。

このディレクトリ内の、apex.hapex_driver.c が apex のデバイスドライバですね。

apex_driver.c の中に、VendorIDとDeviceIDが次のように定義されています。

#define APEX_PCI_VENDOR_ID 0x1ac1
#define APEX_PCI_DEVICE_ID 0x089a

これ、M.2 or PCIe Mini の解説のログの値と一致しますね。

03:00.0 System peripheral: Device 1ac1:089a

ということで、これが Google Edge TPU のデバイスドライバ、確定です。

コードを追って分かったこと。

  1. BAR2を使っていて、1MBメモリ空間(他のBARは使っていない)
  2. BAR2を3つの空間(0x40000、0x44000、0x48000)に分けて使用
  3. 各領域は、4KB(0x1000)
  4. 14種類の割り込みが来る
  5. ioctlは、1種類(APEX_IOCTL_GATE_CLOCK)
  6. sysfsがある
  7. デバイスドライバは、module

その他の処理は、gasket_core.{h,c} の中で色々やっています。

https://github.com/torvalds/linux/blob/master/drivers/staging/gasket/gasket_core.c

 この gasket の中でも、ioctl と sysfs があります。

 結構、いろいろなことをやっていますね。ソースコード解析職人の出番ですかね。

明日は、Pixel 4のASICのデバイスドライバを見ていきます。

お楽しみに。