livaの雑記帳

HiKey960のM.2コネクタはSSDを認識するのだろうか<その1>

HiKey960用にSSDを買ってきた。

www.samsung.com

 

挿した。

結局、こうなった。

 

だが、SSDを認識しない。lspciしても何も出てこない。

 

調べてみた。

discuss.96boards.org

 

4.9カーネルだと認識しないからソースコードを書き換えないといけないらしい。mainlineだと修正されているから問題ないよ、と。

でも僕が使ってるの、4.13なんだよなー。正確にはこのリポジトリ

 

更に調べてみる。

PCIeドライバのこの箇所で落ちる。

kirin_pcie->gpio_id_reset = of_get_named_gpio(dev->of_node,
                                             "reset-gpio", 0);

dtsiファイルを見てみると、reset-gpio「s」と書かれている

これ、mainlineじゃないにしても17/11/03のバージョンでしょ?修正されてないんかい・・・

 

このバグについての対応方法をまとめる。バージョン問わず適応可能。

 

まず、ドライバファイル(drivers/pci/dwc/pcie-kirin.c)を見る。

一番下の方にある、kirin_pcie_matchという変数を見る。

static const struct of_device_id kirin_pcie_match[] = {
  { .compatible = "hisilicon,kirin960-pcie" },
  {},
};

compatible stringがどうなっているか確認。ここでは"hisilicon,kirin960-pcie"

 

このすぐ上にkirin_pcie_probe()という関数がある。

kirin_pcie->gpio_id_reset = of_get_named_gpio(dev->of_node,
                                             "reset-gpio", 0);

kirin_pcie->gpio_id_resetに代入している部分。of_get_named_gpioの引数の文字列を確認。ここでは"reset-gpio"。

 

arch/arm64/boot/dts/hisilicon/hi3660.dtsiの、pcieに関する項目を見る。

こんな感じの項目。

pcie@f4000000 {
  compatible = "hisilicon,kirin960-pcie";
  reg = <0x0 0xf4000000 0x0 0x1000>,
           <0x0 0xff3fe000 0x0 0x1000>,
           <0x0 0xf3f20000 0x0 0x40000>,
           <0x0 0xf5000000 0x0 0x2000>;
  reg-names = "dbi", "apb", "phy", "config";
  bus-range = <0x0 0x1>;
  #address-cells = <3>;

compatibleエントリを先程のcompatible stringと一致させる。

このエントリの最後の方にこんな感じのもあるはず。

  clock-names = "pcie_phy_ref", "pcie_aux",
                           "pcie_apb_phy", "pcie_apb_sys",
                           "pcie_aclk";
  reset-gpios = <&gpio11 1 0 >;
}; 

 reset-gpiosか、reset-gpioになっていると思うので、ドライバのソースコードの文字列に合わせる。

 

カーネルをビルドする。基本的なインストールの流れは以下の記事とか参照してもらえれば。

raphine.hatenablog.com

 

1点だけ追加で作業が必要。

dt.imgというのを作り、焼かなければならない。

 

dt.imgの作り方は、

tools-images-hikey960/gen_boot_dts_imgs-sample.sh at master · 96boards-hikey/tools-images-hikey960 · GitHub

の通り。

 

丁寧に書くと、このリポジトリをcloneして、作ったdtbファイルを配置し、

./build-from-source/mkdtimg -d hi3660-hikey960.dtb -s 2048 -c -o dt.img 

 とする。

 

内蔵ストレージにdt.imgを焼く。

↓この記事の通りに諸々ディスクイメージを焼いて、

raphine.hatenablog.com

最後に

fastboot flash dts dt.img

とすればよろし。

 

この記事ではやってないが、systemパーティションも焼くなら、systemパーティションの前に焼いた方が良いかも。(なぜかsystemの後にdtsを焼いたら上手く動かなかった)

 

リビルドしたカーネルで起動し、pciutilsを入れると(Debianならapt install pciutils)、

root@linaro-installer:~# lspci
00:00.0 PCI bridge: Device 19e5:3660 (rev 01)

 

PCI Host bridgeは認識できる。

 

だが、Samsung 960 EVOをどうやっても認識しない。

 

dmesgの抜粋はこんな感じ。

[    0.326870] OF: PCI: host bridge /soc/pcie@f4000000 ranges:

[    0.326880] OF: PCI:   MEM 0xf6000000..0xf7ffffff -> 0x00000000

[    1.330718] kirin-pcie f4000000.pcie: Link Fail

[    1.330790] kirin-pcie f4000000.pcie: PCI host bridge to bus 0000:00

[    1.330794] pci_bus 0000:00: root bus resource [bus 00-01]

[    1.330799] pci_bus 0000:00: root bus resource [mem 0xf6000000-0xf7ffffff] (bus address [0x00000000-0x01ffffff]) 

[    1.330824] pci 0000:00:00.0: [19e5:3660] type 01 class 0x060400

[    1.330877] pci 0000:00:00.0: reg 0x10: [mem 0xf6000000-0xf6ffffff 64bit]

[    1.330964] pci 0000:00:00.0: supports D1 D2

[    1.330967] pci 0000:00:00.0: PME# supported from D0 D1 D2 D3hot

[    1.331172] pci 0000:00:00.0: BAR 0: assigned [mem 0xf6000000-0xf6ffffff 64bit]

[    1.331187] pci 0000:00:00.0: PCI bridge to [bus 01]

[    1.331376] pcieport 0000:00:00.0: Signaling PME with IRQ 66

[    1.331440] pcieport 0000:00:00.0: AER enabled with IRQ 66

 Link Failってなんじゃ!!

 

調べてみるが、イマイチ要領を得ない。

Suspend - Resume in Hikey960 platform - HiKey 960 - 96Boards

https://bugs.96boards.org/show_bug.cgi?id=595

https://bugs.96boards.org/show_bug.cgi?id=653

 

Intel 600pなら繋がるというウワサ。ほんまかいな。

Hikey 960: M.2/SATA? - HiKey 960 - 96Boards

 

こんなのを見つけた。

add PCIe driver for Kirin PCIe [LWN.net]

 

Sandisk SSDなら認識するっぽい?中の人が書いているんだから、そうなんだろう。

いやでも、型番書いてよ!!!

 

Sandisk SSDで調べてみる。

価格.com - 規格サイズ:M.2 (Type2280) SANDISK(サンディスク)のSSD 人気売れ筋ランキング

Sandisk & M.2 & PCIeインターフェースなSSDは存在しない。上のリンクは全てSATAインターフェース。

ちなみに、hikey960のM.2はPCIeがそのまま露出してるだけっぽいので、SATAインターフェースのSSDを繋いでもたぶん認識しない。

 

詰んだ・・・。てかhisilliconの人は何を使ってるんだよ。

 

暫くさじを投げてたのだが、じっーーーーっと見てたらPCI Vendor IDとDevice IDを見つけた。

[1b4b:1093] 

 

これで製品特定できるんじゃね?

The PCI ID Repositoryで調べたが、出てこない。

 

グーグルに調べてもらったら出てきた。

 

ひとつめ。

[vfio-users] GPU Pass Through with KVM

02:00.0 Non-Volatile memory controller [0108]: Lite-On Technology Corporation M8Pe Series NVMe SSD [14a4:22f1] (rev 01)

           Subsystem: Marvell Technology Group Ltd. Device [1b4b:1093]

           Kernel driver in use: nvme

           Kernel modules: nvme

 パット見、1b4b:1093ってのは内部コントローラっぽい?

これですかね。

www.goplextor.com

Sandiskじゃあないなぁ。まあでももしかしたら動くかもしれない。

 

ふたつめ。

Zorin Group Forum • View topic - [CLOSED] No connections

03:00.0 Non-Volatile memory controller [0108]: Sandisk Corp Device [15b7:5001]
   Subsystem: Marvell Technology Group Ltd. Device [1b4b:1093]
   Kernel driver in use: nvme
   Kernel modules: nvme

おおおお!Sandisk!これか???

 

IDで検索した。確かにVendor ID 15b7はSandiskっぽい。

http://pci-ids.ucw.cz/read/PC/15b7/5001

なるほど、WD Black NVMe SSDとな。・・・WD?

ググってみる。

 

WD Black PCIe SSD | Western Digital(WD)

Western Digitalじゃねぇか!!!

 

 

おわり。

 

 

追記:続き。

raphine.hatenablog.com