Equalization与ASPM的交互原理

链路训练阶段,Equalization 和 ASPM 就像两个紧挨着的齿轮——一个转快了,另一个可能卡住。很多工程师只分别学这两块,结果电测时发现链路要么升不了速,要么 ASPM 老退出。我处理过好几个案子,最后都追到交互这里。

说白了,Equalization 是物理层的自适应均衡,ASPM 是链路层的功耗管理。两者在 LTSSM(链路训练状态机)里共享同一个结构——发送链路控制寄存器 和 接收端检测逻辑。你想想看,要是 ASPM 把收发器关掉了,Equalization 的系数还怎么调?反过来,Equalization 没完成,ASPM 又能不能正常睡着?

链路训练阶段 Equalization 的触发

Equalization 不是随时都在做的。我习惯把触发场景归纳成三类:

  • 链路速率提升:从 2.5 GT/s 升到 5 GT/s 或更高。PCIe 规定每次 Gen 切换必须走 Equalization。
  • 链路宽度重建:比如从 x1 变回 x4,部分通道需要重新均衡。
  • 链路退出 L1 后恢复:尤其是 L1.2 长时休眠,接收端偏置都断了,回来时必须重新做 Equalization。

我个人习惯在逻辑分析仪上抓 LTSSM 的 Recovery Equalization 状态。如果看到 Recovery.RcvrCfg 过不去,十有八九是 ASPM 在背后“捣乱”。

触发后的实际流程是这样的——发送端先发 SSTS(Set Skew Training Set),接收端回 PRBS 模式,然后你来我往地交换 128 个 Training Set。每一步都需要收发器处于激活状态,才能采样并调整系数。

ASPM 状态对 Equalization 的潜在影响

ASPM 的 L0s 和 L1 会直接影响收发器状态。我见过最典型的坑是:ASPM 刚进入 L0s,接收端就把时钟和数据恢复电路(CDR)放掉了,结果 Equalization 系数还没来得及保存,链路下次 Recovery 时又从零开始。

ASPM 状态收发器行为对 Equalization 的影响
L0全速工作Equalization 正常进行,系数稳定
L0s部分链路空闲,收发器可快速关断系数还保留,但通道特性已变;重新激活后可能需 2~4 µs 重收敛
L1主电源关闭,仅维持辅助信号接收端偏置完全掉电,系数丢失;退出后必须重新整轮 Equalization
L1.2更深度休眠,甚至 Vaux 供电同样系数丢失,且恢复时间更长(几十微秒),容易导致 Equalization 超时

我曾经遇到一个产品,L0s 退出后 Equalization 一直报错。抓码流发现:L0s 期间接收端把参考时钟也关了,CDR 重新锁定后主频偏移了 50 ppm,Equalization 预设系数全废。导致每次吞吐刚起来就掉下去。

Equalization 失败反过来“拖死” ASPM

交互是双向的。Equalization 失败会造成链路降速或回退到 Recovery,这时候 ASPM 根本不敢进入低功耗模式。为什么?因为 LTSSM 规定:只有在 L0 状态且链路稳定时才能进入 ASPM。如果 Equalization 没完成,链路始终处在 Recovery 或 Hot Reset,ASPM 的入口永远是关闭的。

我调试时常用一个经验:如果 L0 时间占比特别高(比如 99%),而 ASPM 几乎从不进入,不要先怀疑 ASPM 配置,先查 Equalization 是否有间歇性失败。

真正的交互时序:谁先谁后?

这里有个顺序问题。链路从低功耗状态返回时,Equalization 和 ASPM 的握手顺序决定了成功率。

  1. 上游设备跳出 L1,进入 Recovery.Equalization。
  2. Equalization 完成后,链路回到 L0。
  3. 在 L0 中等待固定的 ASPM_L1_Entry_Time(通常是 1~2 µs)之后,系统才允许 ASPM 进入 L0s 或 L1。

如果第 2 步花的时间太长(比如超过 24 µs),设备可能直接中断 Recovery,或者进入 Disable 状态——ASPM 永久被禁止。我见过一个显卡驱动,就是因为在 Equalization 阶段超时,导致后面 ASPM 一直报 disabled。

一张图看懂交互流程

下面是我根据项目经验画的交互流程图,把 Equalization 和 ASPM 的状态转换串起来。

Equalization 与 ASPM 交互流程 LTSSM: Detect → Polling Recovery.Equalization 发送端 SSTS + 接收端 PRBS Equalization 完成 → L0 ASPM 进入 L0s/L1 Equalization 超时 → 降速/Disable ASPM 永久禁止(PME_TO_Ack 超时) 重点:Equalization 超时可能导致 ASPM 被硬件/固件永久禁止,即使重新训练也回不来。 设备端需检查 Equalization 完成状态寄存器(PCIe 扩展能力 0x150 偏移的 Equalization Complete 位)

排查建议

遇到 Equalization+ASPM 的交互问题,我一般按这个顺序查:

  • 第一步:读 Link Status Register(CAP 0x12),看 Negotiated Link Speed 是否稳定在预期 Gen。
  • 第二步:读 ASPM Control 位和 L0s/L1 Exit Latency,确认 ASPM 配置没有被硬件 override。
  • 第三步:用逻辑分析仪抓 LTSSM 状态机,确认 Equalization 是否在每次退出 L1 后都重复完成,时间是否超过 24 µs。
  • 第四步:关掉 ASPM 做对比测试——如果关掉后链路速率能稳定,那问题就在交互上。

我曾经用这个步骤定位了一个网卡:关掉 ASPM 后 Gen3 正常,开启后 Gen3 只能跑 30 分钟就掉回 Gen2。最后发现是 Equalization 系数在 L1 恢复时没来得及加载,接收端误码累积导致 CRC 错误,LTSSM 回退。加了一个 No Aspm L1 的驱动补丁就修好了。

嗯,说到底,Equalization 和 ASPM 的交互本质是物理层与链路层的时间冲突。只要记住:低功耗会破坏均衡,均衡失败会阻挡低功耗。搞定了这个循环,你的链路调试能力才算是真的打通了。