2247708_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2247708_ja-JP

2247708_ja-JP

U-BootでのiMX8MP PCIe初期化

こんにちは、

お客様は、U-Boot で NVMe ドライブを初期化して、iMX8MP にイメージ (カーネルと rootfs) をロードしています。これは問題なく動作し、NVMe ディスクが正しく検出され、システムの起動が開始されます。ただし、一部の特定の SoM では、Linux カーネルが PCIe インターフェースを初期化してもリンクが確立されません。これは、影響を受ける SoM で約 30% の確率で発生します。初期化に失敗した場合のエラー メッセージは次のとおりです。

phy phy-32f00000.pcie-phy.0: phy poweron failed --> -110

影響を受けない SoM は 100% の時間で動作します。PCIe が U-Boot で初期化されていない場合、影響を受ける SoM は Linux 上で 100% 動作し、NVMe ディスクで 12 時間のストレス テストを問題なく実行しました。

この問題は、Linux カーネルがすでに初期化されている PCIe インターフェースを初期化する方法に関連している可能性が非常に高いです。カーネルはインターフェースがすでに初期化されていることを認識していないため、プロセス全体を最初から実行し、一部のモジュールで失敗することがあります。

リセット状態にならないまま再構成されると、PLL が適切にロックされない可能性があると思います。ただし、前述のとおり、これは 100% のハードウェアで再現できるわけではないため、何らかの HW バリエーション (SO C、SO M) も影響を与えているはずです。

何が問題なのかについてヒントをCAN人はいますか?

ありがとうございます

ラファエル

Re: iMX8MP PCIe initialization in U-Boot

こんにちは、

pll はデバイス ツリーでチェックする必要があり、必要に応じて変更する必要があります。

よろしくお願いします。

Re: iMX8MP PCIe initialization in U-Boot

回答ありがとうございます!

お客様はカーネル イメージと rootfs を NVMe ディスクからロードしたいと考えており、そのために U-Boot 初期化を追加しました。このため、起動後に PCIe/NVMe を初期化することはできません。

すでに確認しましたが、カーネルを起動する前に U-Boot で PCIe インターフェースを適切に初期化解除する方法があれば問題ありません。すでに PCIe リセットを試みましたが、解決しませんでした。

あなたがおっしゃることからすると、問題は PCIe ペリフェラルよりも PLL に関連しているように見えます。また、解決方法に関するご提案からすると、PCIe だけでなく、より多くのペリフェラルに対応する PLL である可能性があるようです。

Linux を起動する前にリセットを試みることができる特定の PLL はありますか?これらの問題を回避するためにリセットする正しい方法は何でしょうか?

Re: iMX8MP PCIe initialization in U-Boot

こんにちは、

Linux カーネルがすでに初期化されている PCIe インターフェースを初期化するときに断続的に発生する障害の原因を特定できます。

発生している問題は、U-Boot と Linux 間の PCIe インターフェース初期化シーケンスに関連しているようです。U-Boot が PCIe インターフェースを初期化して NVMe からイメージをロードし、その後 Linux が適切なリセットを行わずに同じインターフェースを再初期化しようとすると、影響を受ける SoM で約 30% の確率で失敗する競合状態が発生します。

これは PLL 構成の問題と一致しています。Linux カーネルがすでに初期化された PCIe インターフェースを再構成しようとすると、初期化間でハードウェアが適切にリセットされない場合に PLL ロックの問題が発生する可能性があります。

解決策としては、次の 3 つが考えられます。

1. U-Boot での PCIe 初期化を完全に無効にします。これは 100% の動作を確認済みです。これが最も信頼できるアプローチでしょう。

2. sys エントリを追加して、Linux に適切な PCIe サスペンド/再開機能を実装します。
- PCIe サスペンド/レジュームの sys エントリを追加するパッチを作成する
- PCIe EPデバイスを削除します: `echo 1 > /sys/bus/pci/devices/0000\:00\:00.0/remove`
- PCIe を無効にする: `echo 1 > /sys/devices/platform/soc\@0/33800000.pcie/pcie_dis`
- PCIe を有効にする: `echo 0 > /sys/devices/platform/soc\@0/33800000.pcie/pcie_dis`
- PCIeバスを再スキャン: `echo 1 > /sys/bus/pci/rescan`

3. PCIe ドライバをモジュールとしてビルドし、ブート シーケンスを変更します。
- まずLinuxを起動する
- 必要な初期化を待つ
- 必要に応じてPCIe ドライバモジュールをロードする

この問題は他の i.MX8MP 実装でも確認されており、特に異なる SoM バッチ間でのハードウェア許容度のばらつきが顕著です。Linux カーネルの PCIe ドライバは、初期化されていないハードウェアで動作していると想定しているため、実際にはそうでない場合は競合が発生する可能性があります。

よろしくお願いします。

Re: iMX8MP PCIe initialization in U-Boot

ありがとうございます。この情報の後、Linux ドライバが起動する前に PHY をリセットすると問題が解決することがわかりました。

タグ(1)
評価なし
バージョン履歴
最終更新日:
‎12-03-2025 01:47 AM
更新者: