@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそ、すべては、SystemC v0.9公開から始まった
このツイートで、Google Edge TPU DevBoardのデバイスドライバと Pixel 4に入っているASICのデバイスドライバがあるのを知りました。
The device driver of the EdgeTPU in Pixel 4 is different from the Dev board one (apex). The apex, as I noted couple months ago [1] was upstreamed. This Pixel 4 one is packaged in with IPU, DRAM and others [2]. #EdgeTPU
— freedom Koan-Sin Tan (@koansin) 2019年11月28日
[1] https://t.co/ZGLg2QvQHC
[2] https://t.co/wMI9cV0Txh
まずは、DevBoardのデバイスドライバ。。。
実は、M.2 or Mini PCIe の Get stated のログとして、出てきているんですよ。
この部分、引用しますね。
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 です。
だいたい良くわからないものは、misc に居るんですが、apex は、staging/gasket にあります。
このディレクトリ内の、apex.h と apex_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 のデバイスドライバ、確定です。
コードを追って分かったこと。
- BAR2を使っていて、1MBメモリ空間(他のBARは使っていない)
- BAR2を3つの空間(0x40000、0x44000、0x48000)に分けて使用
- 各領域は、4KB(0x1000)
- 14種類の割り込みが来る
- ioctlは、1種類(APEX_IOCTL_GATE_CLOCK)
- sysfsがある
- デバイスドライバは、module
その他の処理は、gasket_core.{h,c} の中で色々やっています。
https://github.com/torvalds/linux/blob/master/drivers/staging/gasket/gasket_core.c
この gasket の中でも、ioctl と sysfs があります。
結構、いろいろなことをやっていますね。ソースコード解析職人の出番ですかね。
明日は、Pixel 4のASICのデバイスドライバを見ていきます。
お楽しみに。