このブログでは、iMX95EVKをPCIeエンドポイントとして構成し、iMX8MMをRCとして使用してテストする方法について解説します。
ハードウェア・コンポーネント
iMX95EVK
iMX8MM
PCIe M.2 Key Eブリッジ
イーサネット接続
ソフトウェア・コンポーネント
Linux Factory 6.12.20 BSP
linux-imxソースコード(https://github.com/nxp-imx/linux-imx/tree/lf-6.12.20-2.0.0)
システム・セットアップ
ステップ1:iMX95EVKのeMMC/SDカードに6.12.20 BSPを書き込み、それで起動します。
ステップ2:GitHubからlinux-imx 6.12.20のソースコードを取得します。
GitHub - nxp-imx/linux-imx at lf-6.12.20-2.0.0
ステップ3:次のdiffに従って、arch/arm64/boot/dts/freescale/imx95-19x19-evk-pcie1-ep.dtsoに以下の変更を加えます。
diff --git a/arch/arm64/boot/dts/freescale/imx95-19x19-evk-pcie1-ep.dtso b/arch/arm64/boot/dts/freescale/imx95-19x19-evk-pcie1-ep.dtso
インデックス a8e3bbc53894..d082688fc1c2 100644
--- a/arch/arm64/boot/dts/freescale/imx95-19x19-evk-pcie1-ep.dtso
+++ b/arch/arm64/boot/dts/freescale/imx95-19x19-evk-pcie1-ep.dtso
@@ -11,12 +11,12 @@ &smmu {
};
-&pcie1 {
+&pcie0 {
status = "無効";
};
-&pcie1_ep {
+&pcie0_ep {
pinctrl-names = "default";
- pinctrl-0 = <&pinctrl_pcie1>;
+ pinctrl-0 = <&pinctrl_pcie0>;
status = "オーケー";
};
ご覧のとおり、ここではiMX95EVKのM.2 PCIe 0で「エンドポイント」モードを有効にしようとしています。デフォルトのdtbではPCIe 1に対して有効化されています。カーネルをビルドすると、dtsoの変更内容からこのdtbが生成されます。
ステップ4:dtbをボードにSCPで転送し、混乱を避けるために「imx95-19x19-evk-pcie0-ep.dtb」に名前を変更します。
ステップ5:U-Bootで「fdtfile」変数を変更し、このdtbを使ってボードを起動します。
このdtbでカーネルが起動すると、コンソールに次のようなPCIe dmesgログが表示され、変更が反映されたかを確認できます。
root@imx95evk:~# dmesg | grep pcie-ep
[ 3.142123] imx6q-pcie 4c300000.pcie-ep: iATU: アンロール T、8 ob、8 ib、アライン 4K、リミット 1024G
[ 3.151767] imx6q-pcie 4c300000.pcie-ep: eDMA: unroll T, 4 wr, 4 rd
root@imx95evk:~#
0x4c300000は、pcie0コントローラのアドレスです
ステップ6:このスクリプト「conf_pcie0_ep」をiMX95EVK上で実行します
ステップ7:このdtb(imx8mm-evk.dtb)を使用してiMX8MMボードを起動します。
ステップ8:iMX8MM上で「lspci」を実行すると、以下の出力が表示されます。
これがiMX8MM RCのlspci出力に表示されているiMX95EVKエンドポイントです。
アドレス空間の変換ウィンドウは、以下に記載されている情報を使用して設定されます。
arch/arm64/boot/dts/freescale/imx8mm.dtsi
PCIeノードの「ranges」プロパティとして記載されているアドレス変換ウィンドウの情報を理解したい場合は、「Demystifying the PCIe and CPU address space translation in Linux - NXP Community」の記事をご覧ください。ここでは、裏側で何が行われているのかが詳しく説明されています。