Vengineerの戯言

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

Google Pixel4のASIC(TPU & IPU)のデバイスドライバ見つけた!

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

昨日の続き、今日は、Pixel 4のASICのデバイスドライバを見てみます。

このブログにも書きましたが、Pixel 4に搭載されているASICには、TPUが入っています。

vengineer.hatenablog.com

このツイートの[2]に、そのデバイスドライバがあります。

 ここ、です。

android.googlesource.com

どうやら、airbrush というデバイスドライバです。こちらは、misc ディレクトリにありますね。

android-msm-coral-4.14-android10-c2f2 とありますね。

これらのファイルのCopyrightには、Samsungとありますね。

これから妄想すると、このASICはSamsung製で回路の一部、特にこのデバイスドライバに関連するところは、Samsung製なんでしょうね。。

 

Pankaj Kumar Dubey さん と Alim Akhtar さん は、Samsung Electronics (インド)でSoCのデバイスドライバを長年やっているようです。

 

https://android.googlesource.com/kernel/msm/+/refs/heads/android-msm-coral-4.14-android10-c2f2/drivers/misc/airbrush/airbrush-chip-info.c

に、

seq_printf(m, " IPU RO: %d\n", get_ipu_ro());

seq_printf(m, " TPU RO: %d\n", get_tpu_ro());

 にあるように、IPU と TPU が出てきます。ビンゴですね。

このファイルを見ると、M0が出てきますね。

https://android.googlesource.com/kernel/msm/+/refs/heads/android-msm-coral-4.14-android10-c2f2/drivers/misc/airbrush/airbrush-bootseq.c

チップには、A0、B0があるようですね。一般的には、A0が最初のサンプルで何も問題がなければいいのですが、不具合等は修正して、B0に進みます。

このFirmware、SPI経由でASICと通信していますね。

 

https://android.googlesource.com/kernel/msm/+/refs/heads/android-msm-coral-4.14-android10-c2f2/drivers/misc/airbrush/airbrush-sm-ctrl.c#345

IPU、TPU、DRAM、MIF(メモリコントローラ?)、FSYS、AONという機能があるようですね。AONって、何でしょうか。

このファイルの上の方に、

#define MAX_AON_FREQ 934000000

とあるので、どうやらプロセッサですね。これだと、934MHzですかね。結構速いですね。WikiChipにあるPixel Visual Coreでは、A53が搭載されているので、AONってA53なんでしょうね。これを変えるといろいろと面倒だからね。となると、こっちのASICも実はSamsung製だったのかな。。。。

en.wikichip.org

また、このファイルをよく見てみると、

IPUの動作周波数は、19.2MHz、50.2MHz、271.8MHz、408.14MHz、543.6MHz、680MHz

BLK_(200, Sleep, Sleep, 3, on, 0_75, off, 0, 0, 0, 0, 0),
BLK_(300, Normal, Ready, 3, on, 0_75, on, 19.2, 14, 0, 0, 0),
BLK_(301, Normal, AonCompute, 3, on, 0_75, on, 50, 2, 2, 0, 0),
BLK_(302, Normal, MinCompute, 3, on, 0_75, on, 271.8, 14, 14, 0, 0),
BLK_(303, Normal, LowCompute, 3, on, 0_75, on, 408, 14, 14, 0, 0),
BLK_(304, Normal, MidCompute, 3, on, 0_75, on, 543.6, 14, 14, 0, 0),
BLK_(305, Normal, MaxCompute, 3, on, 0_75, on, 680, 14, 14, 0, 0),

TPUの動作周波数は、19.2MHz、50.0MHz、316MHz、474MHz、632MHz、789.6MHz、934MHz

BLK_(200, Sleep, Sleep, 2, on, 0_75, off, 0, 0, 0, 0, 0),
BLK_(300, Normal, Ready, 3, on, 0_75, on, 19.2, 0, 0, 16, 0),
BLK_(301, Normal, AonCompute, 3, on, 0_75, on, 50, 0, 0, 16, 0),
BLK_(302, Normal, MinCompute, 3, on, 0_75, on, 316, 0, 0, 16, 0),
BLK_(303, Normal, LowCompute, 3, on, 0_75, on, 474, 0, 0, 16, 0),
BLK_(304, Normal, MidCompute, 3, on, 0_75, on, 632, 0, 0, 16, 0),
BLK_(305, Normal, MaxCompute, 3, on, 0_75, on, 789.6, 0, 0, 16, 0),

DRAMの動作周波数は、1867~3733HMまで動くようですね。

BLK_(300, PowerUp, AonTran, 0, on, 0_60, on, 934, 0, 0, 0, 1867), BLK_(301, PowerUp, HalfMidTran, 0, on, 0_60, on, 934, 0, 0, 0, 1867),
BLK_(302, PowerUp, HalfMaxTran, 0, on, 0_60, on, 934, 0, 0, 0, 1867),
BLK_(303, PowerUp, LowTran, 0, on, 0_60, on, 1200, 0, 0, 0, 2400),
BLK_(304, PowerUp, MidTran, 0, on, 0_60, on, 1600, 0, 0, 0, 3200),
BLK_(305, PowerUp, MaxTran, 0, on, 0_60, on, 1867, 0, 0, 0, 3733),

 AONの動作周波数は、19.2MZz、93.312MHz、466.56MHz、933.12MHz

BLK_(0, Disabled, NoRail, 0, off, 0_0, off, 0, 0, 0, 0, 0),
BLK_(300, Normal, Min, 0, on, 0_85, on, 19.2, 0, 0, 0, 0),
BLK_(301, Normal, Low, 0, on, 0_85, on, 93.312, 0, 0, 0, 0),
BLK_(302, Normal, Mid, 0, on, 0_85, on, 466.56, 0, 0, 0, 0),
BLK_(303, Normal, Max, 0, on, 0_85, on, 933.12, 0, 0, 0, 0),

 もっといろいろと調べないといけませんね。ソースコード解析職人としては。