
088、PCIE ASPM状态:L0s、L1、L2/L3——一次链路唤醒失败的排查手记上周调一块FPGA的PCIE板卡,系统休眠后死活唤不醒。示波器抓链路信号,恢复时钟有了,REFCLK也正常,但DATA Lane就是没动静。查了半天寄存器,发现是ASPM状态机卡在了奇怪的中间状态。今天咱们就掰开说说PCIE的电源管理,特别是这几个状态切换的门道。问题现场:休眠唤醒链路死透当时看到LTSSM状态寄存器显示“L1.2”,但实际链路电压已经掉到L2/L3级别。这种状态不一致往往是因为ASPM(Active State Power Management)和软件发起的电源管理没协调好。ASPM是硬件自动玩的低功耗把戏,L0s和L1属于链路还在活动时的省电模式,而L2/L3就得动电源时钟了。L0s:眼皮打架但随叫随到L0s是链路空闲时的快速响应状态,物理层自己就能搞定进出,通常几个微秒内完成。TX和RX可以独立进入L0s,比如下游发完TLP就关发射机,上游收完数据关接收机。关键在这里:进出L0s不关PLL,参考时钟保持活动。所以恢复时间极短,软件几乎无感。但有些廉价Switch芯片为了省电,会在L0s停掉部分时钟树,结果恢复时时钟不稳,丢几个包。我们当年就踩过这坑,表现为随机丢DLLP,后来强制关掉L0s才解决。代码里配置L0s的典型操作(示意):// 别一上来就全开,