HiKey960用にSSDを買ってきた。
挿した。
あの、これどうしろと、、、 pic.twitter.com/36oEBF9r1A
— Liva (@liva_jy) 2017年12月27日
結局、こうなった。
いい加減フラフラなSSDにイラついてきたので、僕の全技術力を用いてボードを自作したらフラつかなくはなった。そのうち熱で燃えだしたりしないかは心配である
— Liva (@liva_jy) 2017年12月27日
。 pic.twitter.com/hiBj2P16ro
だが、SSDを認識しない。lspciしても何も出てこない。
調べてみた。
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になっていると思うので、ドライバのソースコードの文字列に合わせる。
カーネルをビルドする。基本的なインストールの流れは以下の記事とか参照してもらえれば。
1点だけ追加で作業が必要。
dt.imgというのを作り、焼かなければならない。
dt.imgの作り方は、
の通り。
丁寧に書くと、このリポジトリをcloneして、作ったdtbファイルを配置し、
./build-from-source/mkdtimg -d hi3660-hikey960.dtb -s 2048 -c -o dt.img
とする。
内蔵ストレージにdt.imgを焼く。
↓この記事の通りに諸々ディスクイメージを焼いて、
最後に
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なら認識するっぽい?中の人が書いているんだから、そうなんだろう。
いやでも、型番書いてよ!!!
価格.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ってのは内部コントローラっぽい?
これですかね。
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じゃねぇか!!!
おわり。
追記:続き。