3. 链路训练与状态机概览
PCIe链路并不是一上电就能立刻以目标速率、目标宽度稳定传输TLP的。从复位释放到进入正常工作状态,链路需要经历一系列协商、对齐、均衡和确认过程。负责统筹这一全过程的硬件状态机,就是LTSSM(Link Training and Status State Machine,链路训练与状态状态机)。理解LTSSM,是理解PCIe链路“为什么没起来”“为什么降速”“为什么反复重训”的关键。
一、LTSSM的核心作用
LTSSM位于PCIe的物理层与链路层交界处,它并不直接搬运数据,而是决定链路当前处于什么阶段、下一步该做什么。其核心作用可以归纳为四点:
- 链路初始化:检测对端是否存在,完成位锁定、符号锁定和通道对齐。
- 参数协商:确定链路宽度、链路速率、均衡系数等关键参数。
- 状态维护:在正常工作、低功耗、错误恢复之间进行状态迁移。
- 错误恢复:当链路出现异常时,触发重训或降级,尝试恢复可用连接。
二、状态分类:从Detect到L0的层级结构
LTSSM包含十余个主状态,按功能可划分为五大类:
| 类别 | 典型状态 | 主要任务 |
|---|---|---|
| 检测类 | Detect.Quiet、Detect.Active | 检测对端接收端是否存在 |
| 轮询类 | Polling.Active、Polling.Compliance、Polling.Configuration | 发送TS1/TS2有序集,确认极性、宽度和速率 |
| 配置类 | Configuration.Linkwidth.Start、Configuration.Linkwidth.Accept、Configuration.Complete、Configuration.Idle | 协商链路宽度,完成通道映射 |
| 恢复类 | Recovery.RcvrLock、Recovery.RcvrCfg、Recovery.Speed、Recovery.Equalization | 重新锁定、速率切换、均衡协商 |
| 工作与低功耗类 | L0、L0s、L1、L2、L3 | 正常传输、低功耗休眠、关机 |
其中,L0是唯一能够正常传输TLP和DLLP的状态。L0s是快速低功耗状态,L1是深度低功耗状态,L2/L3则与电源关闭相关。Detect到Configuration属于“冷启动训练路径”,Recovery属于“运行中重训路径”。
三、状态跳转的触发条件
LTSSM的跳转不是随机的,而是由明确的物理事件、定时器超时和有序集交换结果驱动。常见触发条件包括:
- 复位释放:PERST#解除后,LTSSM从Detect.Quiet开始。
- 接收端检测成功:Detect.Active中检测到对端终端电阻,进入Polling。
- TS1/TS2交换完成:Polling和Configuration阶段依赖有序集握手。
- 链路宽度协商一致:Configuration.Complete后进入L0。
- 错误阈值触发:如收到无效TS、CRC错误超限,进入Recovery。
- 电源管理请求:软件写PMCSR或ASPM触发L0s/L1跳转。
- 速率切换请求:通过Recovery.Speed切换到更高或更低速率。
四、观测方法:如何看到LTSSM在做什么
LTSSM是芯片内部状态,软件无法直接读取其当前状态编号,但可以通过多种手段间接观测:
- PCIe配置空间寄存器:Link Status Register中的Link Training、Link Speed、Link Width字段可反映训练结果。
- 协议分析仪:抓取TS1/TS2有序集、SKP有序集和电气空闲序列,直接还原状态迁移过程。
- 厂商调试寄存器:部分Root Complex或Endpoint提供LTSSM状态快照寄存器。
- 内核日志与lspci:通过dmesg和lspci -vv观察链路速率、宽度和训练失败记录。
# 查看链路当前速率与宽度
lspci -vv -s 01:00.0 | grep -E "LnkCap|LnkSta"
# 典型输出
LnkCap: Port #0, Speed 16GT/s, Width x16
LnkSta: Speed 16GT/s, Width x16, TrErr- Train- SlotClk+ DLActive+
如果LnkSta中显示Width x8而LnkCap为x16,说明链路训练后发生了降宽;如果Speed 8GT/s而能力为16GT/s,则说明速率协商未达到目标。这些结果都可以反向推断LTSSM在Configuration或Recovery阶段的行为。
五、案例与复盘:一次典型的链路降速排查
某服务器插入Gen4 x16网卡后,系统识别为Gen3 x8。排查步骤如下:
- 用lspci确认LnkCap为16GT/s x16,LnkSta为8GT/s x8,说明训练结果低于能力。
- 检查插槽是否支持Gen4,确认主板BIOS中PCIe速率策略未限制为Gen3。
- 用协议分析仪抓取训练过程,发现Recovery.Speed阶段TS1中速率标识未达成一致。
- 更换高质量连接器后,链路恢复为16GT/s x16。
复盘结论:LTSSM的Recovery.Speed和Configuration阶段对信号质量非常敏感。速率越高,对参考时钟抖动、通道损耗和连接器阻抗匹配的要求越严格。很多“链路降速”问题并不是协议配置错误,而是物理层信号完整性不足导致LTSSM主动降级。
六、LTSSM状态迁移示意
下图展示了从复位释放到L0,以及运行中进入Recovery的主要路径。图中同时标出了关键触发条件和观测点,便于将抽象状态与调试手段对应起来。
把LTSSM的状态迁移与寄存器、日志、协议分析仪观测结果对应起来,就能把“链路没起来”这种模糊现象,转化为“卡在哪个状态、由什么条件触发、下一步该查什么”的明确排查路径。这是PCIe链路调试中最基础也最有效的方法。