PCIe链路初始化和训练是由物理层控制的,是基于硬件 (而非软件) 的过程。链路训练过程在复位后由硬件自动启动,并由LTSSM管理。
1. LTSSM总体介绍
下图是LTSSM(链路训练状态机)的状态跳转图。LTSSM的每个状态又划分为若干子状态。在冷复位、暖复位、或者热复位(Hot Reset)释放后,进入的第一个状态是Detect状态。
LTSSM共有11个顶层状态:Detect、Polling、Configuration、Recovery、L0、L0s、L1、L2、Hot Reset、Loopback和Disable。
这11个状态可划分为五大类:
1. 链路训练状态。
2. 重训练状态(Recovery)。
3. 软件驱动的电源管理状态。
4. ASPM(Active-State Power Management)状态,即硬件驱动的电源管理状态。
5. 其他状态。
LTSSM (Link Training and Status State Machine)
在复位释放后,LTSSM进入链路训练状态,正常会按照Detect → Polling → Configuration → L0的顺序跳转。在L0状态,可以进行正常的数据收发操作。
进入链路重训练状态(即Recovery)的原因有很多,例如从L1这样的低功耗链路状态中恢复,或者进行链路带宽切换(速率或者链路宽度切换)。在链路重训练状态中,链路会重复类似于训练状态的操作,来解决链路中的问题,并最终回到L0(正常工作)状态。
功耗管理软件可以使设备进入低功耗设备状态(D1、D2、D3Hot或D3Cold),并强制链路进入低功耗管理链路状态(L1或L2)。
如果链路上长时间没有报文发送,ASPM硬件会使链路自动进入低功耗ASPM状态(L0s或者ASPM L1)。
此外,软件可以使链路进入一些其他状态,如Disabled、Loopback或热复位状态,这些状态统称为其他状态。
2. LTSSM各状态介绍
以下是对11个LTSSM状态的基本介绍。
1. 检测状态(Detect):复位释放后进入的初始状态,目的是检测链路对端设备是否存在。串行传输一般不需要检测对端设备是否存在,设置Detect状态是为了便于测试,在Polling状态会有具体说明。除了复位之外,还可能从其他LTSSM状态进入Detect。
2. 轮询状态(Polling):在此状态,发送方以2.5Gbps的速率向对端发送TS1以及TS2序列,使用协议最低速率以实现对早期协议的兼容。接收端可以使用接收的TS1/2序列实现以下功能:
完成位锁定(Bit Lock)。链路训练开始时,接收端的时钟与发送端时钟不同步,无法可靠地采样输入数据。在链路训练期间,接收端的时钟和数据恢复逻辑(CDR,Clock and Data Recovery)通过使用数据比特流作为时钟的参考信号,来重建发送端的时钟。一旦从数据流中恢复了时钟,接收端就完成了位锁定,可以正确采样输入数据。
完成Symbol锁定或者Block锁定(Gen3)
如有必要,校正通道极性翻转
得知通道支持的链路数据速率
在测试条件下,发起兼容性测试序列:能够进入兼容性测试是因为,如果在Detect状态能识别到接收方,但是没有收到输入信号,这表明可以将对端识别为一个测试负载。在识别对端为测试负载后,发送方会发送特定的兼容测试Pattern,以方便测试。这项特性能够使测试设备快速地验证链路的电压、BER(Bit Error Ratio)、时序以及其他指标在链路容忍范围之内。
3. 配置状态(Configuration)
上游和下游组件将以2.5Gbps速率来交换TS1和TS2序列,完成以下的目标:
协商链路宽度
为各通道(lane)指定编号
检测是否需要lane reversal,并校正
补偿各个通道之间的时序偏斜(Deskew Lane-to-Lane timing differences)。从这个状态开始,可以关闭加扰,并可进入Disable或Loopback状态。此外,会记录在TS1和TS2序列交换时达成的从L0s进入L0状态所需的FTS序列数量。
4. L0状态:链路功能正常运行的状态,链路上会进行正常的TLP、DLLP 报文和有序集的交换。L0状态下,链路速率可以比2.5GT/s更高,但只能在进入Recovery状态,经历链路速率变化程序之后,才能切换到更高速率。
5. 恢复状态(Recovery):当链路需要重训练时,会进入Recovery状态,可能有以下原因:L0状态中发生错误、从L1状态恢复到L0状态、从L0s状态恢复到L0时,无法通过FTS序列重新完成训练。
在Recovery状态,会重新进行比特锁定和字符/块锁定,锁定的过程和Polling状态中的相似,但是一般会更快些。
6. L0s状态:L0s是由硬件控制的ASPM低功耗状态,可以节约一些功耗,并且能快速恢复到L0状态。在L0状态下,当发送方发送EIOS序列后会进入L0s状态。退出L0s状态时,会通过发送FTS序列来重新快速完成比特和字符/块锁定。
7. L1状态:比L0s状态节省更多的功耗,但需要更长时间恢复到L0。进入L1需要链路双方协商,并一起进入L1状态。进入L1状态有两种方式:
第一种是在ASPM控制下,自动进入L1。当上行端口没有调度发送的TLP或者DLLP报文时,硬件将自动协商进入L1。如果下行端口同意,那么链路进入L1状态。否则,上行端口将进入L0s状态(如果使能的话)。
第二种是功耗管理软件命令设备进入低功耗状态(D1、D2或D3Hot)。因此,上行端口通知下行端口必须一起进入L1状态,下行端口会响应通知,进入L1状态。
8. L2状态:更显著的低功耗状态,此时设备的主电源将被关闭。大部分的逻辑会由于没有电源供应而关闭,只是少部分涉及唤醒事件的逻辑会依靠辅助电源Vaux继续工作。支持唤醒能力的上游端口会发送低频的Beacon 信号,下游端口能够将其转发给RC,告知上层系统。通过Beacon信号或者边带信号WAKE#,设备能够触发系统唤醒事件,使主电源恢复。
(另外还有L3状态,不过L3状态和LTSSM没有关系。L3状态下所有电源都会关闭,包括辅助电源,因此L3状态下不会响应唤醒事件。)
9. Loopback状态:是一种测试状态,协议中没有详细定义接收方的行为(比如接收方哪些逻辑会参与回环测试)。Loopback状态中基本的行为很简单:回环发起方(Loopback Master)发送TS1有序集给回环接收方(Slave),并置位TS1训练控制字段(Training Control)中的Loopback比特。当接收方连续接收2个回环比特置起的TS1序列后,进入回环状态,将接收到的任何内容都重新发送给发起方。发起方会检查接收到的内容,和先前发送的内容进行比较,如果内容经过双方的8b/10b编码(解码)后校验一致,说明链路可以通过环路验证,完整性没有问题。
10. 禁用状态(Disable):Disable状态允许将链路配置为禁用状态,该状态下发送逻辑为电气空闲状态,接收逻辑为低阻状态。在某些情况下,比如链路状态变得不可靠,或者对端设备被意外移除,此时 Disable 是表示这些意外情况的必要状态。另外,软件也可以通过链路控制寄存器中的Disable bit,将设备配置为禁用状态。设备被禁用后,会连续发送16个Disable Link bit置位的TS1序列,位于TS1的训练控制域(Traning Control Field),通知接收方进入禁用状态。
11. 热复位状态(Hot Reset):软件可以通过置位Bridge Control寄存器的配置次级总线复位(Secondary Bus Reset)bit,复位链路。软件配置后,桥的下游端口会发送训练控制域(Traning Control Field)热复位比特置位的TS1序列。当接收方接收到两个TS1序列后,必须复位自身设备。
4219