LS1046AとBCM88270(スイッチチップ)は、PCIe.3 x1 Gen2(SD2_T/RX2_P/N)を介して接続されています。LS1046Aは、K4AAG165WC-BCWEチップ(ECCなし)を4個使用しています。
現在直面している状況:
1. BCM88270がPCIe経由でLS1046Aにイーサネットパケットを送信していない場合、stress ngとmemtesterを使用したメモリテストでは問題は検出されません。
2. BCM88270がPCIe経由でLS1046Aにイーサネットパケットを送信すると、`stress ng`と`memtester`でエラーが発生します。
3. LS1046Aは、PCIe(DMA経由)を介してBCM88270のレジスタまたはエントリへの読み書きを繰り返し実行しますが、問題なく動作します。さらに、同時に実施したストレステストでも問題は検出されませんでした。
stress ngとmemtesterによる個別のテストは正常であったため、DDRの基本機能は正常であることが証明されました。唯一のエラーはBCM88270がパケットを送信した際に発生したものであり、このエラーはPCIeトラフィックによって引き起こされたことを示しています。
ご説明いただいた現象に基づき、考えられる原因の確率を順位付けすると以下のようになります。
40% BCM88270 RX DMA アドレス範囲外/ディスクリプタエラー
25% PCIe RX方向SIの問題(パケット受信時に顕在化)
15% PCIeキャッシュコヒーレント構成エラー
DDR SI の問題が 10% 発生(高帯域幅が原因)
10%の電力整合性の問題
第一の可能性:PCIe DMAがDDRメモリを破損させた(最も可能性が高い)。
最もよく一致する現象: BCM88270 パケット送信PCIe DMAによるLS1046Aメモリへの書き込み> DMAアドレスエラーまたはディスクリプタエラー -> MemtesterまたはStress-ngで使用されているメモリを上書きしています -> メモリエラーが検出されました
検査方法:DMAバッファアドレスを確認し、RXディスクリプタ、RXバッファ、SKB、およびDMAプールが範囲外になっていないか確認します。Linuxでは、dma_alloc_coherent()の戻りアドレスを確認し、開始アドレス、サイズ、および終了アドレスが重複していないか確認します。
memtester(例えばmemtester 2M)を使用してDMA領域を回避してください。DMAが低位メモリ領域に位置しているかどうかを確認してください。DMA領域を回避した後にエラーが報告されなくなった場合、DMAの上書きは基本的にロックされています。
2つ目の可能性は、PCIeキャッシュコヒーレント構成エラーです。
LS1046AはDPAAアーキテクチャを採用しています。PCIe DMAには、CPUキャッシュ、CCI-400、PCIeコントローラ、およびDDRが関与します。BCM88270がDMAを使用してDDRに書き込む場合:
しかし、ドライバ`dma_sync_single_for_cpu()`と`dma_sync_single_for_device()`が正しく処理されない場合、CPUは古いデータを参照し、DMAは新しいデータを書き込み、その結果`memcmp`と`memory test`が失敗します。
デバイスツリーを確認して、PCIeノードpcie@340000にdma-coherentが設定されているかどうかを確認してください。設定が正しくない場合、ランダムメモリエラーが発生します。
3つ目の可能性:PCIe受信方向SIの問題
これは特に注意を払うべき点です。PCIe.3 x1 Gen2、SD2_TX/RX2_P/Nの場合、BCM88270からLS1046Aにパケットを送信する場合にのみエラーが発生するとおっしゃっていましたが、LS1046AからBCM88270へのDMAアクセステーブルのエントリは正常です。
これは、PCIe RX方向の方がより疑わしいことを示唆している。
PCIeレジスタアクセス:トラフィックは非常に少なく、BERが高くても容易には露出しない。
イーサネットパケットの受信:PCIe DMA TLPが継続的に動作し、トラフィック量が数桁増加します。このとき、CRC再送信、リプレイ、およびNAK(ネットワークアドレス変換)が大幅に増加します。
PCIeは理論的にはLCRC保護機能を備えているものの、リンクが不安定になると、DMAタイムアウト、ディスクリプタの破損、ドライバの異常、そして最終的にはメモリテストの失敗につながる可能性がある。
PCIeエラーカウンタを確認するには、`lspci -vv`を実行し、CESta: 訂正可能なエラー、UESta: 訂正不可能なエラーに注意してください。また、BadTLP、BadDLLP、ReplayNumRollover、およびReceiverErrorが増加していないかどうかも確認してください。
4つ目の可能性:DDR SI/PIエッジ問題
ストレスレベル自体は正常範囲内ではあるものの、完全に否定することはできない。
理由:BCM88270がパケットを送信すると、以下の値が増加します。
1) PCIe SerDesの消費電力
追加:1V、1.8V、AVDD_SERDESノイズ。
2) DDRアクセス量が急増
通常テスト:CPU <-> DDR
現在では、CPU、PCIe DMA、DDRコントローラが同時に動作するため、帯域幅が大幅に向上しています。DDRの容量が不足すると、エラーが発生し始めます。
検証方法:DDRの周波数を下げてください。例えば、1600MT/s → 1333MT/s。問題が解消すれば、基本的にはDDRのSI/PIの問題です。
DDR ECC 統計を確認するには: ECC はありませんが、uboot の md.l を使用して DDR コントローラ ステータス レジスタを読み取り、DDR_ERR_DETECT が異常かどうかを確認できます。
5つ目の可能性:電源の完全性の問題
4つのK4AAG165WC-BCWEチップは比較的大きな容量を持っています。高速PCIeパケット受信、CPU負荷、高DDR帯域幅が同時に発生すると、ボード上でVDD_DDR、VDD_SOC、VDD_COREの電圧降下が発生する可能性があります。
重要な測定項目:オシロスコープを使用して、障害発生時にVDD_DDRおよびVDD_SOCのリプルと過渡電圧降下が制限値を超えていないかを確認します。特に、BCM88270が大量のパケットを送信し始める瞬間に注意してください。
6つ目の可能性:PCIeとDDRのトレースクロストーク
LS1046Aでは、PCIe3とDDR4はどちらも高速インターフェースです。レイアウトがタイトな場合、PCIe RX、DDR DQ、DDR DQSは並列の長距離配線となっています。
大量のPCIeトラフィックは問題を引き起こす可能性があります。この現象は、パケットが送信されない場合、正常に動作し、パケット量が多い場合、DDRエラーが発生するというパターンとよく一致します。
調査の推奨順序:
ステップ 1: PCIe エラーをキャプチャします: lspci -vv を使用して、レシーバー エラー、Bad TLP、リプレイ、および CRC エラーが継続的に増加しているかどうかを確認します。
ステップ2:ネットワークドライバのDMAパケット受信を無効にします。PCIeの読み書きレジスタのみを有効にしたまま、Stressが正しく動作するかどうかを確認します。正しく動作する場合は、RX DMAパスに問題があります。
ステップ3:RX DMAバッファの前後に保護ゾーンを追加します(例:0x5A5A5A5A)。そして、それらが上書きされていないかどうかを継続的にチェックします。DMAが制限を超えていないか確認します。
ステップ4:PCIeの速度を下げ、Gen2からGen1に強制的に切り替えます。これで不具合が解消された場合は、まずPCIe SIを確認してください。
ステップ5:DDR周波数を1600MT/sから1333MT/sに下げます。問題が解消された場合は、まずDDR SI/PIを確認してください。