LS1046A和BCM88270(交换芯片)通过pcie.3 x1 gen2连接(SD2_T/RX2_P/N),LS1046A使用4片K4AAG165WC-BCWE(无ecc),
目前的碰到的现象:
1.在bcm88270不向ls1046a通过pcie发送以太网数据包的情况下,使用stress ng和memtester程序测试内存都没有问题
2.在bcm88270向ls1046a通过pcie发送以太网数据包时,stress ng和memtester会出错
3.LS1046A通过pcie反复读写bcm88270寄存器或者表项(通过dma),没有问题。而且同时测试的stress ng也没问题。
由于单独测试stress ng和memtester正常, 证明DDR基本功能正常, 只有BCM88270发包时出错,说明错误是被PCIe流量触发的。
结合你给出的现象,可能原因概率排序:
40% BCM88270 RX DMA地址越界/描述符错误
25% PCIe RX方向SI问题(收包时暴露)
15% PCIe Cache Coherent配置错误
10% DDR SI问题(高带宽触发)
10% 电源完整性问题
第一种可能:PCIe DMA写坏了DDR(最高概率)
现象最符合:BCM88270发包 > PCIe DMA写入LS1046A内存> DMA地址错误或描述符错误 -> 覆盖了Memtester或Stress-ng使用的内存 -> 检测到内存错误
检查方法:查看DMA Buffer地址, 确认RX Descriptor, RX Buffer, SKB, DMA Pool 是否有越界。Linux下查看dma_alloc_coherent()返回地址,检查start,size,end是否有重叠。
memtester避开DMA区域,例如memtester 2M,观察DMA是否位于低端内存,如果避开DMA区域后不再报错,基本锁定DMA覆盖。
第二种可能:PCIe Cache Coherent配置错误
LS1046A是DPAA架构, PCIe DMA涉及CPU Cache, CCI-400, PCIe Controller, DDR, 如果BCM88270使用DMA写入DDR:
但驱动:dma_sync_single_for_cpu(), dma_sync_single_for_device() 处理错误,会造成:CPU看到旧数据, DMA写入新数据, 然后memcmp失败, memory test失败。
检查设备树,查看PCIe节点pcie@340000是否带dma-coherent; 如果配置错误,会导致随机内存错误。
第三种可能:PCIe接收方向SI问题
这里值得特别关注。你提到:PCIe.3 x1 Gen2,SD2_TX/RX2_P/N, 只有BCM88270 -> LS1046A发包时出错。而LS1046A -> BCM88270时DMA访问表项正常。
说明 PCIe RX方向更可疑。
PCIe寄存器访问:流量很小,即使BER较高也不容易暴露。
以太网收包:持续PCIe DMA TLP, 流量大几个数量级。此时:CRC重传, Replay,NAK,明显增加。
虽然PCIe理论有LCRC保护。但如果链路边缘化:可能导致:DMA timeout,描述符损坏,驱动异常,最终表现为:内存测试失败。
查看PCIe错误计数器: lspci -vv, 重点: CESta: Correctable Error; UESta: Uncorrectable Error; 查看:BadTLP, BadDLLP, ReplayNumRollover, ReceiverError是否增长。
第四种可能:DDR SI/PI边缘问题
虽然单独Stress正常,但仍不能完全排除。
原因:BCM88270发包时会增加:
1) PCIe SerDes功耗
增加:1V, 1.8V, AVDD_SERDES噪声。
2) DDR访问量剧增
正常测试: CPU<->DDR
现在变成: CPU,PCIe DMA, DDR Controller 同时工作,带宽显著提高。如果DDR裕量不足:开始出错。
验证方法:降低DDR频率,例如: 1600MT/s → 1333MT/s, 如果问题消失,基本锁定DDR SI/PI问题。
查看DDR ECC统计: 虽然无ECC,但可以uboot下用 md.l 读取DDR控制器状态寄存器,查看DDR_ERR_DETECT是否出现异常。
第五种可能:电源完整性问题
4片K4AAG165WC-BCWE容量较大。当 PCIe高速收包 + CPU Stress + DDR高带宽 同时发生,板上可能出现:VDD_DDR, VDD_SOC, VDD_CORE跌落。
重点测量: 示波器看VDD_DDR,VDD_SOC在故障时的纹波和瞬时跌落是否超标。特别是在BCM88270开始大流量发包瞬间。
第六种可能:PCIe与DDR走线串扰
LS1046A上:PCIe3和DDR4都属于高速接口,如果布局比较紧:PCIe RX, DDR DQ, DDR DQS存在平行长距离走线。
大流量PCIe时可能激发问题。这种现象非常符合:不发包 => 正常, 大发包 => DDR出错.
建议排查顺序:
Step1: 抓PCIe错误: lspci -vv,看Receiver Error,Bad TLP,Replay,CRC Error是否持续增长。
Step2: 关闭网络驱动DMA收包。只保留PCIe读写寄存器,验证Stress是否仍正常。若正常,说明问题在RX DMA路径。
Step3: 在RX DMA Buffer前后加保护区,例如:0x5A5A5A5A,持续检查是否被覆盖。确认是否DMA越界。
Step4: 降PCIe速率,强制 Gen2 -> Gen1,如果故障消失,优先检查PCIe SI。
Step5: 降DDR频率,1600MT/s -> 1333MT/s,如果消失,优先检查DDR SI/PI。