カーネル 5.10.235 を実行している i.MX6DL を使用しており、PCIe Gen1 リンク トレーニングの問題が発生しています。ログには、リンク トレーニングが完了しないこと、つまりリンクが継続的に再トレーニングされていることが示されています。Debug0 レジスタは、リンクが安定していないことを示しており、何かが再トレーニングをトリガーしていることを示しています。
観測されたLTSSM遷移:
L0 → S_POLL_CONFIG → S_RCVRY_RCVRCFG → S_CFG_LINKWD_START → S_POLL_CONFIG
また、pci-imx6.c と pci-imx6.c の両方がロードされているにもかかわらず、LnkCap レジスタの値が(電源投入サイクルごとに)変化していることにも気付きました。および pcie-designware.cGen1 のリンクを明示的に構成します。このレジスタを変更する他のものは何でしょうか?
例:
CASE 1: 0x1ffc07c = 値 0x0011cc12
LnkCap: ポート #0、速度 5GT/s、幅 x1、ASPM L0s/L1、終了レイテンシ L0s <1us、L1 <8us
LnkCtl2: ターゲットリンク速度 2.5GT/s
CASE 2: 0x1ffc07c = 値 0x00100001
LnkCap: ポート #0、速度 2.5GT/s、幅 x1、ASPM L0s/L1、終了レイテンシ L0s <1us、L1 無制限
LnkCtl2: ターゲットリンク速度 2.5GT/s
さらに、スクランブラーを無効にすると、リンクが安定するようです。
devmem2 0x1ffc710 w 0x00010122
以下の情報を探しています:
1.最初に L0 に到達した後、リンクの再トレーニングをトリガーするものは何ですか?
2. 他にどのような HW/SW 部分が LnkCap を変更する可能性がありますか?
詳細については文書を添付します。
こんにちは、
1. L0 状態に到達した後にリンクの再トレーニングをトリガーする可能性のあるものについて:
- PCIeレーンの信号整合性の問題によりリンクが不安定になる可能性がある
- PCIe PHYに影響を与える電源の変動やノイズ
- PCIeリファレンスクロックのクロックジッタまたは不安定性
- PCIeトレースのインピーダンスまたは長さのマッチングに関連するハードウェアデザインの問題
- 不要な再トレーニングを開始する可能性のあるソフトウェア/ドライバのバグ
2. 変動するLnkCapレジスタ値の場合:
- レジスタはハードウェア初期化シーケンスとソフトウェアドライバの両方で変更できる
- i.MX6 PCIe実装では、pci-imx6.cおよび pcie-designware.cリンクパラメータの設定を試みる
- リンク機能のネゴシエーションはトレーニング中に行われ、エンドポイントデバイスからの報告に基づいて値が調整される可能性があります。
スクランブラーを無効にするとリンクが安定するという観察結果 (devmem2 0x1ffc710 w 0x00010122) は、潜在的な信号整合性またはクロックの問題を示唆しています。これは、i.MX6 プラットフォーム上の PCIe リンクの安定性の問題がハードウェアの調整によって解決された以前のCASEと一致しています。
i.MX6DL プラットフォーム専用の詳細な PCIe SERDES 設定情報が記載されているアプリケーション ノート AN4784「i.MX 6Dual/6Quad および i.MX 6Solo/6DualLite の PCIe 認証ガイド」を確認することをお勧めします。このドキュメントでは、断続的なリンク トレーニングの障害を解決するのに役立つ包括的な PCIe 認定ガイダンスを提供します。
特定の継続的な再トレーニングの問題については、次の点を考慮してください。
- PCIeリファレンスクロック信号の品質とジッタの検証
- PCBデザインにおけるトレース長のマッチングをチェック
- PCIeレーンの適切な終端とインピーダンスを確認する
- 負荷条件下でのパワーレールの安定性の検査
表示されている LnkCap レジスタの変更は、初期化シーケンス中のハードウェア レベルのレジスタ アクセスに関連している可能性があり、PHY キャリブレーションの変動の影響を受ける可能性があります。
よろしくお願いします。
さらに詳細を追加します。
以下の観察結果に基づくと、スクランブラーが無効になっている場合、Gen1 リンクは安定しています。ホストが Gen2 を試行しないように、Gen1 のみでトレーニングするように強制する方法はありますか?
* LnkCap is 5GT/s
root# lspci -s 00:00.0 -vv |grep LnkCap
LnkCap: Port #0, Speed 5GT/s, Width x1, ASPM L0s L1, Exit Latency L0s <1us, L1
root# devmem2 0x1ffc07c
/dev/mem opened.
Memory mapped at address 0xb6f5c000.
Read at address 0x01FFC07C (0xb6f5c07c): 0x0011CC12 <<< gen2
root# ltssm_debug.sh |grep curr
LTSSM current state | 0x7 | S_CFG_LINKWD_START
LTSSM current state | 0x11 | S_L0
LTSSM current state | 0x7 | S_CFG_LINKWD_START
LTSSM current state | 0xf | S_RCVRY_RCVRCFG
* Setting Lnkcap to gen1 but value is getting overwritten
root# devmem2 0x1ffc07c w 0x00100011
root# devmem2 0x1ffc07c
/dev/mem opened. Memory mapped at address 0xb6fb1000.
Read at address 0x01FFC07C (0xb6fb107c): 0x0011CC12
root# ltssm_debug.sh |grep curr
LTSSM current state | 0x7 | S_CFG_LINKWD_START
LTSSM current state | 0xf | S_RCVRY_RCVRCFG
LTSSM current state | 0x7 | S_CFG_LINKWD_START
* Disable scrambler
root# devmem2 0x1ffc710 w 0x00010122
root# devmem2 0x1ffc710
/dev/mem opened. Memory mapped at address 0xb6f66000.
Read at address 0x01FFC710 (0xb6f66710): 0x00010122
* LnkCap was set to Gen1 again, and the value remains stable.
root# devmem2 0x1ffc07c w 0x00100011
root# devmem2 0x1ffc07c
/dev/mem opened. Memory mapped at address 0xb6f0a000.
Read at address 0x01FFC07C (0xb6f0a07c): 0x00100011
* Gen1 changes reflected here
root# lspci -s 00:00.0 -vv |grep LnkCap
LnkCap: Port #0, Speed 2.5GT/s, Width x1, ASPM not supported
root:~# ltssm_debug.sh |grep curr
LTSSM current state | 0x11 | S_L0
LTSSM current state | 0x11 | S_L0
Link stable.よろしくお願いします。
こんにちは、
ヒントを提供していただきありがとうございます。
ただし、リンク速度を Gen1 に強制する場合、どのようなシナリオでハードウェアはリンク機能をGen2 としてアドバタイズし、 ASPM 関連のオプションも有効にCANのでしょうか?
たとえば、次のようになります。
LnkCap: Port #0, Speed 5GT/s, Width x1,
ASPM L0s L1, Exit Latency L0s <1us, L1 <8us
トレーニング シーケンスでは、 5 GT/sと自律変更 TS1も確認されています。
リンクを Gen2 でトレーニングする必要はありません。
TS1/TS2のログを添付します。
よろしくお願いします。