Vengineerの戯言

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

Pixel Visual Coreのデバイスドライバのソースコード解析のスライド

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

Twitterにて、Google Pixel 2/3に搭載されている Pixel Visual Core と Pixel 4 に搭載されている Pixel Visual Coreのデバイスドライバソースコード解析のスライドに興味がある方が結構居たので、お約束通り、Slideshareにて公開しました。

投票数は、96票で、77%の人が興味があり、知らなかった人が23%です。

 ここです。ご利用ください。

 

deepC と Qumico

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

このツイートで新しい DNN Compiler を知りました。

 その名も「deepC」

github.com

deepC Compiler and inference framework is designed to enable and perform deep learning neural networks by focussing on features of custom ai-accelerators like micro-controllers, eFPGAs, cpus and other embedded devices like raspberry-pi, odroid, arduino, SparkFun Edge, risc-V and others.

deepC also offers ahead of time compiler producing optimized executable based on LLVM compiler tool chain specialized for deep neural networks with ONNX as front end.

とありますね。基本的には、マイコンみたいなデバイス用って感じ。

ONNXモデルを読み込めるみたい。

ドキュメントは、こちら 

 

コードを覗いてみたら、dnnCompiler/src/codegen/cppCodeGen.cpp があって、これを眺めていたら、どうやら、C++コードを生成するんですね。そのC++コードをLLVM (8.0)にて、

で動くということね。。。

あ、これ、natsutan の。。。これ、と被っていませんか?

 Qumico : 

github.com

Pixel Visual CoreのASIC内では、Headless Androidが走っている!

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

昨日のPixel Visual Coreの詳細に対するデバイスドライバがあるかどうかを調べてみたら、ありました。これ!です。

android.googlesource.com

このドライバは、URLを見てもらうとわかるのですが、

です。Androidなのに、intel-linux とかになっていますよね。

どうしてなんでしょうか?

と思っていたら、Twitterでのメンションで、どうやら、Pixel Visual Core内のA53上では、Headless Androidというものが動いているようです。

 

www.slideshare.net

によると、Javaを使うレイヤーを除いた部分、つまり、普通のLinuxみたいなCUIベースのAndroidって感じですかね。

 

Intelが付いているAndoroidは、他にもろいろあります。ね。

android.googlesource.com

があるようです。Android 8.1/9 があるので、easel が Pixel 2に対応するのでしょうね。となると、blueとamberが Pixel 3関連なんですかね。

デバイスドライバは、paintbox ですね。

https://android.googlesource.com/kernel/arm64/+/refs/heads/android-amber-intel-linux-4.7-android10/drivers/misc/paintbox/

などに関係するファイルがありますね。

また、paintbox-fpga.{h,c} というファイルもあります。内部を見ると、FPGAへのリセットコマンドのみですね。Pixel 2にFPGAが載っているんですかね。?

 

それで、Headless Androidということで、Linux Kernel の dts は、

https://android.googlesource.com/kernel/arm64/+/refs/heads/android-amber-intel-linux-4.7-android10/arch/arm64/boot/dts/intel/mnh.dts

で、mnh.dts になります。mhn 、そう、水曜日に書いた Pixel 2/3 側のデバイスドライバの名前です。

  • モデル名:Monette Hil (intel,mnh)
  • CPU:Cortex-A53x1コア(L2付き、PMU付き)
  • メモリ:512MB
  • TIMER:(arm - armv8-timer), (Synopsys - dw-apb-timer)
  • CLOCK:(Synopsys - dw-apb-timer)
  • DMA:(Synopsys - dma-spear1340)
  • Paintbox:64KB
  • EASEL:
  • MIPI:TXx2、RXx3 (Synopsys - mipicsi_host)
  • PCIe:(Synopsys - dw_pcie_ep)
  • SPI:(Synopsys - dw-apb-ssi)
  • GPIO:(Synopsys - dw-apb-gpio)
  • I2C:x4 (Synopsys - designware-i2c)
  • UART:x2 (Synopsys - dw-apb-uart)
  • Perfomance Monitor:Intel - perf_mon
  • Thermal:Intel - mnh_thermal
  • Frequency Cooling:intel - mnh_freq_cooling
  • Power Management:intel - mnh_pm

そして、カーネルの defconfig が mnh_defconfig

https://android.googlesource.com/kernel/arm64/+/refs/heads/android-amber-intel-linux-4.7-android10/arch/arm64/configs/mnh_defconfig

  • CONFIG_ARCH_MNH=y
  • CONFIG_GOOGLE_EASEL=y
  • CONFIG_PAINTBOX=y
  • CONFIG_PAINTBOX_DEBUG=y
  • CONFIG_PAINTBOX_TEST_SUPPORT=y
  • # CONFIG_PAINTBOX_IOMMU_ENABLED is not set
  • CONFIG_PAINTBOX_TEST_CMA=y
  • CONFIG_PAINTBOX_IOMMU=y
  • CONFIG_MNH_THERMAL=y
  • CONFIG_MNH_FREQ_COOLING=y
  • CONFIG_ANDROID=y

ヨーロッパでは、SystemCがお盛ん。

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

SystemCは、ヨーロッパはまだまだ続いている。てか、むしろお盛んの模様。

特に、SystemC-AMS

https://www.accellera.org/news/events/systemc-evolution-day-2019

SystemC Evolution Day 2019 Workshop on the evolution of SystemC standards
Thursday, October 31, 2019
Holiday Inn Munich City, Germany

 25ユーロ(当日35ユーロ)

Agendaの画像を引用します。何故?画像なのか。。。

これらの発表資料も公開されていますね。ZIPに固められたPDFです。

https://www.accellera.org/images/news/events/systemc-evolution-day-2019-agenda2.png

 

GreenSoCsも居ますね。

 

そうそう、SystemC も github にて、ソースコードを公開するようになりました。

github.com

最新リリース版は、今年の6月14日にリリースされた 2.3.4 

   2.3.4_pub_rev_20190614

ですね。

 

Pixel 2/3のPixel Visual Coreの詳細

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

Pixel 2/3に搭載されている Pixel Visual Core についていろいろ追加で調べていたら、下記のメンションで2つの資料を教えてもらいました。

 時に、[2]の HotChips 2018 の資料は、Pixel Visual Coreの詳細が載っています。

Pixel Visual Coreでは、Camera または チップに接続しているDRAM からのデータを受け取り、2D Stencil Processorの処理にてパイプライン的処理をしています。2D Stencil Processorでの処理と次の 2D Stencil Processorでの処理の間では Line Bufferにデータを置いています。最終的な処理結果はチップに接続しているDRAMに書き込んでいます。Camera、DRAM、Line Buffer、2D Stencil Processorは、NoCで接続されています。

2D Stencil Processorは、IPU内にあり、IPUは S2D Stencil ProcessorとLBP(Line Buffer Pool)から構成されています。チップ内には、8個のIPUがあるようです。

Camera、DRAMNoCに接続すると書きましたが、IPUの詳細の図では、NoCに直接接続しているのではなく、Camera、DRAMはDMA経由でアクセスするようになっています。NoCのBusやCrossBarではなく、Ring NoCのようです。

 

 

Pixel 2/3に搭載されているPixel Visual Coreのデバイスドライバも見つけた

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

Pixel 3のコードネームは、下記のサイトから、crosshatchで、Pixel 2は wahoo ということなので、探ってみた。

juggly.cn

見つけた。これ。crosshatchとwahooの両方にあった。

こっちは、crosshatch の PIE (Adnroid 9.0)

こっちは、wahoo の OREO (Android 8.1)

android.googlesource.com

デバイスドライバ名は、mnhです。

そしてこちらは、Samsung製じゃなかった、どうやら、Intel製。。。

 

BAR2よBAR3で、各1GBのメモリ空間使っています。

https://android.googlesource.com/kernel/msm/+/refs/heads/android-msm-crosshatch-4.9-pie-qpr1/drivers/misc/mnh/hw-mnh-regs.h

このファイルには、

  • UART
  • SPI
  • GPIO
  • Peripheral DMA
  • Timer
  • WDT
  • PMON
  • MIPI
  • PCIE Controller + Phy
  • LPDDR4 Controller + Phy
  • IPU
  • CPU
  • Software Cold Reset

などの情報があります。

Wikichipのデータと同じですね。確定です。

en.wikichip.org

 

なんと、

https://android.googlesource.com/kernel/msm/+/refs/heads/android-msm-crosshatch-4.9-pie-qpr1/drivers/misc/mnh/mnh-sm-ion.c

には、次のようなコメントがあります。どうやら、内部のCPUコア(A53では)Linuxが走っているようです。

/**
* mnh_ion_fw_copy - Copy data to ION buffer and flush cache
* Return 0 on success
* -ENOMEM if exceeding totoal buffer size
* mnh_ion_fw_copy must be called in slot incrementing order:
* 1. MNH_FW_SLOT_SBL, 2. MNH_FW_SLOT_KERNEL,
* 3. MNH_FW_SLOT_DTB, 4. MNH_FW_SLOT_RAMDISK
*/

 まあ、Pixel Visula CoreのIPUは、Halideでドライブされていますからね。

そう考えると不思議じゃないですね。

https://android.googlesource.com/kernel/msm/+/refs/heads/android-msm-crosshatch-4.9-pie-qpr1/drivers/misc/mnh/mnh-sm-ion.c

には、IONのブートが

enum mnh_boot_mode {
MNH_BOOT_MODE_PCIE,
MNH_BOOT_MODE_SPI,
};

とありますね。ローカルにつながっている SPI or PCIE 経由。。。

PCIE経由のときは、ホスト(Snapdragon)からASICのDRAMにいろいろと送り込んでいるんでしょうね。

デフォルトでは、

https://android.googlesource.com/kernel/msm/+/refs/heads/android-msm-crosshatch-4.9-pie-qpr1/drivers/misc/mnh/mnh-sm.c#280

/* flag for boot mode options */
static enum mnh_boot_mode mnh_boot_mode = MNH_BOOT_MODE_PCIE;

のように、PCIE経由になっていますね。

 

こちらも、ソースコード解析職人の出番ですかね。

 

 

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),

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