我们使用的是运行内核 5.10.235 的 i.MX6DL,出现了 PCIe Gen1 链路训练问题。日志显示,链接训练从未完成--链接在不断地重新训练。Debug0 寄存器显示链路不稳定,表明某些东西正在触发信号再训练。
观察到的 LTSSM 过渡:
L0 → S_POLL_CONFIG → S_RCVRY_RCVRCFG → S_CFG_LINKWD_START → S_POLL_CONFIG
我们还注意到,尽管 pcii-imx6.c 和 pcii-imx6.c 寄存器的 LnkCap 寄存器值(每个电源周期)都会发生变化,但 LnkCap 寄存器的值并没有改变。和 pcie-designware.c为 Gen1 明确配置链路。还有什么可能会修改这个寄存器?
示例:
情况 1:0x1ffc07c = 值 0x0011cc12
LnkCap:端口 #0,速度 5GT/s,宽度 x1,ASPM L0s/L1,退出延迟 L0s<1us,L1<8us
LnkCtl2:目标链接速度 2.5GT/s
情况 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。还有哪些硬件/软件部分可能会修改 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 链路稳定性问题的情况一致。
我建议查阅 i.MX 6Dual/6Quad 和 i.MX 6Solo/6DualLite " 的应用笔记 AN4784 " PCIe 认证指南,其中包含专门针对 i.MX6DL 平台的详细PCIe SERDES 设置信息。本文档提供全面的 PCIe 认证指导,有助于解决间歇性链路培训故障。
对于特定的持续再训练问题,请考虑:
-验证 PCIe 参考时钟信号质量和抖动
-检查 PCB 设计中的走线长度是否匹配-确认 PCIe 通道上的端接和阻抗正确
-检查负载条件
下的电力轨道
稳定性您看到的 LNKCap 寄存器修改可能与初始化序列期间的硬件级寄存器访问有关,可能受到 PHY 校准变化的影响。
此致
再补充一些细节。
根据下面的观察结果,禁用加扰器时 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 相关选项?
例如,我们看到
LnkCap: Port #0, Speed 5GT/s, Width x1,
ASPM L0s L1, Exit Latency L0s <1us, L1 <8us
我们还在训练序列中观察到5 GT/s和自主变化 TS1。
TS1/TS2 日志附后。
谢谢!