LTSSM:Link Training and Status State Machine
下图展示了 LTSSM 的顶层状态(顶层状态下包含子状态):
LTSSM 包含 11 个顶层状态:Detect、Polling、Configuration、Recovery、L0、L0s、L1、L2、Hot Reset、Loopback 和 Disable。这些状态可以分为 5 类:
各种复位(Reset)之后,状态机的改变为:Detect => Polling => Configuration => L0。在 L0 状态下即可进行标准数据交互。
链路的 Re-Training 状态也称为 Recovery(恢复)状态。链路进入 Re-Training 状态的原因有多种,例如从低功耗链路状态(如 L1)退出、改变带宽(改变速率或者宽度)等。在该状态下,链路会根据需要重新执行一部分链路训练的流程,然后进入 L0 状态。
电源管理软件能将设备(Device)切换到低功耗设备状态(D1,D2,D3Hot 或者 D3Cold),这会导致链路进入对应的低功耗链路状态(L1 或者 L2)。
在某一时刻,如果没有数据在传输,那么 ASPM 硬件可以自动将硬件切换到功耗较低的 ASPM 状态(L0s 或者 ASPM L1)。
另外,软件还可以将链路设置为其它的一些特殊状态:Disabled,Loopback 或者 Hot Reset。
当 PCIe 链路进入该状态时,将向对端发送 TS1 和 TS2 Ordered Sets(2.5 GT/s),并接收对端的 TS1 和 TS2 Ordered Sets(2.5 GT/s)。
通过接收到的 TS1 和 TS2 序列,完成如下操作:
PCIe 链路处于该状态时,将进行 Loopback 测试,确定当前使用的 PCIe 链路可以正常工作。
发送逻辑 TX 和 接收逻辑 RX 继续以 2.5 GT/s 的速度交换 TS1 和 TS2 Ordered Sets,完成如下任务:
Configuration 状态下,scrambling 可以关闭,该状态可以切换到 Disabled 状态或者 Loopback 状态。
在 TS1 和 TS2 中,还指定了 L0 状态切换到 L0s 状态所需要的 FTS Ordered Sets 的个数。
L0 状态是 PCIe 链路的正常工作状态。该状态下,PCIe 链路可以正常发送和接收 TLP、DLLP 和 Ordered Sets。如果需要切换到高于 2.5 GT/s 的速度传输,则需要进入 Recovery 状态进行链路重训练(Re-Training)。
PCIe 链路需要进行重训练(Re-Training)时会进入该状态,可能的原因有:
在 Recovery 状态,重新建立 Bit Lock 和 Symbol/Block Lock 的过程与 Polling 状态相似,但是要比 Polling 状态花的时间更短。
L0s 是 ASPM(Active State Power Management)机制提供的第 1 级低功耗状态,该状态可以在较短的时间内切换到 L0 状态。当设备要从 L0 状态切换到 L0s 状态时,需要向外发送 EIOS。当设备要从 L0s 状态切换到 L0 状态时,需要向外发送多个 FTS,从而快速获取 Bit Lock 和 Symbol/Block Lock。
L1 是 ASPM(Active State Power Management)机制提供的第 2 级低功耗状态,它的功耗比 L0s 低,但是需要更长的时间才能切换到 L0 状态。想要进入 L1 状态,位于 PCIe 总线两端的设备需要进行协商,然后同时进入 L1 状态。两种可能的方式如下:
L2 状态是ASPM(Active State Power Management)机制提供的第 3 级低功耗状态,此时设备的主电源被关闭,从而达到更低的功耗。该状态下,几乎所有的逻辑都被关闭,只有一小部分使用 Vaux 供电的逻辑在工作,该部分逻辑可以用来发送 wakeup 事件。
支持 wakeup 功能的 Upstream Port 能向外发送一个低频信号,该信号称为 Beacon。Downstream Port 将 Beacon 信号转发给 Root Complex。通过 Beacon 或者 WAKE# 引脚,设备可以要求系统恢复它的主电源供电。
该状态是用来测试的,但是协议并没有明确规定 Receiver 在该状态下做些什么。基本的操作很简单:设备 A 作为 Loopback Master,连续对外发送两个 TS1 Ordered Sets,并且 TS1 的 Training Control 区域的 Loopback 位需要设置为 1。设备 B 接收到连续两个 Loopback 位为 1 的 TS1 之后,就会进入 Loopback state,称为 Loopback Slave。Loopback Slave 会将收到的所有内容再发送给 Loopback Master,从而形成回环,验证链路的完整性。
系统软件可以通过设置寄存器,使 PCIe 链路进入 Disabled 状态。当 PCIe 链路的对端设备被拔出时,LTSSM 也需要进入该状态。
该状态下,发送端设备处于 Electrical Idle 状态,接收端设备处于低阻抗状态。对于链接已经变得不可靠或者设备被意外移除时,这种状态很有必要。
系统软件配置 Link Control register 的 Disable 位之后,该设备会对外发送 16 个 TS1 Ordered Sets,这些 TS1 的 Training Control 区域的 Disable Link 位需要设置为 1。接收设备在收到这 16 个 TS1 之后,进入 Disabled 状态。
系统软件将 Bridge Control register 的 Secondary Bus Reset 位设置为 1 之后,Bridge 的 downstream port 会对外发送多个 TS1 Ordered Sets,这些 TS1 的 Training Control 区域 Hot Reset 位必须被设置为 1。接收设备收到连续 2 个这种 TS1 之后,必须对设备进行复位。
当处理器系统进行 Hot Reset 操作时,PCIe 链路将进入 Recovery 状态,然后进入 Hot Reset 状态进行 PCIe 链路的重训练。
参考资料:
[1] Mike Jackson & Ravi Budruk,PCI Express Technology
[2] 王齐,PCI Express 体系结构导读