2. LTSSM核心状态:Detect、Polling、Configuration、Recovery、L0、L0s、L1、L2、Hot Reset、Loopback
好,咱们直接进入正题。LTSSM 这玩意儿,说白了就是 PCIe 链路的“交通警察”。它管着链路从出生到退休的全过程。我当年刚接触 PCIe 时,看着这十几个状态头都大了。后来发现,其实核心的就那么几个,搞懂了它们,整个 LTSSM 的骨架你就拿下了。
我个人习惯把 LTSSM 的状态分成三大类:训练态、电源管理态、特殊态。今天咱们就把这十个核心状态挨个捋一遍。
2.1 训练态:从无到有的过程
训练态负责把一条物理链路从“没电”搞到“能传数据”。它包括 Detect、Polling、Configuration 和 Recovery。
2.1.1 Detect 状态
这是链路的起点。说白了,就是看看对面有没有设备插着。我遇到过不少新手问:“Detect 到底在检测什么?” 其实很简单——检测接收器上有没有终端电阻(Receiver Detection)。
在 Detect 状态,发送器会发出一个脉冲,然后看信号反射回来的情况。如果有设备,反射回来的信号幅度会不一样。嗯,这里要注意:Detect 只检测“有没有人”,不关心“是谁”。
2.1.2 Polling 状态
Detect 确认有人了,接下来 Polling 就要开始“打招呼”了。这个状态里,链路双方开始交换训练序列(TS1/TS2)。
我曾经在调试一个 Gen3 的板卡时,发现链路卡在 Polling 死活过不去。查了半天,原来是参考时钟的抖动超标了。你想想看,时钟都不准,TS 序列怎么对齐?
Polling 的核心目标有两个:
- 位锁定(Bit Lock):接收器能从串行数据流中恢复出时钟
- 符号锁定(Symbol Lock):能正确识别出 8b/10b 或 128b/130b 编码的边界
2.1.3 Configuration 状态
这个状态就热闹了。链路宽度、通道翻转、数据速率,全在这里谈妥。我把它叫做“商务谈判阶段”。
Configuration 里有个关键动作叫 Link Width Negotiation。举个例子,一个 x16 的槽插了个 x4 的卡,双方得协商出最终用 x4 跑。这个过程是通过 TS1 序列里的 Lane Number 字段完成的。
2.1.4 Recovery 状态
Recovery 是个“万金油”状态。链路跑着跑着出问题了,或者想切换速率,都会先进入 Recovery。它有点像 Windows 里的安全模式——先降级,再修复。
Recovery 的进入条件很多:
- 接收端发现信号质量变差(CRC 错误太多)
- 软件发起链路速率切换请求
- 从 L0s/L1 唤醒时
我个人觉得,Recovery 是 LTSSM 里最容易被忽视的状态。很多工程师只盯着 L0 看,忽略了 Recovery 的健壮性设计。其实,Recovery 处理得好不好,直接决定了链路的稳定性。
2.2 电源管理态:省电才是王道
PCIe 的电源管理做得相当精细。L0、L0s、L1、L2 这四个状态,功耗逐级降低,但唤醒延迟逐级增加。
2.2.1 L0 状态
L0 是正常工作态。数据随便传,延迟最低。没什么好说的,这就是链路的“满血状态”。
2.2.2 L0s 状态
L0s 是“浅睡眠”。它只关闭发送器,接收器还开着。所以唤醒很快,几个时钟周期就行。但代价是省电效果有限。
我记得有个项目,客户要求功耗必须低于 5W。我们在 L0s 的进入/退出策略上调了整整两周。最后发现,对于突发性小包业务,L0s 的收益很大;但对于持续大流量,频繁进出 L0s 反而浪费电。
2.2.3 L1 状态
L1 是“深睡眠”。发送器和接收器都关了,只保留少量维持逻辑。唤醒需要先进入 Recovery,再回到 L0。延迟一般在几微秒级别。
L1 的进入需要双方都同意。通过 PM_Active_State_Request_L1(PM_ASPM_L1)这个 DLLP 来协商。说白了,就是“我想睡了,你同意不?”
2.2.4 L2 状态
L2 是“关机态”。主电源都断了,只靠辅助电源(Vaux)维持少量逻辑。唤醒需要从 Detect 重新开始。这是最省电的状态,也是唤醒最慢的。
2.3 特殊态:调试与测试的利器
2.3.1 Hot Reset
Hot Reset 是软件发起的“软复位”。它不会断电,但会把链路状态清空,重新走一遍训练流程。我经常用它来模拟热插拔场景。
触发方式有两种:
- 通过配置空间发送复位命令
- 对端发送 TS1 序列并设置 Hot Reset 比特
2.3.2 Loopback
Loopback 是测试用的。发送器发出的数据,在芯片内部直接环回到接收器。这样不用接外部设备,就能测 SerDes 的收发功能。
嗯,这里有个坑:Loopback 模式下的信号完整性测试,不能完全代表真实链路。因为环回路径上没有 PCB 走线、连接器这些外部因素。我曾经被这个坑过——Loopback 全 PASS,一接上 cable 就报错。
好了,这十个状态的核心逻辑就这些。你想想看,是不是比想象中简单?其实 LTSSM 的设计哲学就是“分层处理”——训练态搞定链路建立,电源管理态搞定功耗,特殊态搞定异常和测试。每一层各司其职,互不干扰。