首页 理论教育Recovery状态

Recovery状态

【摘要】:Recovery状态是LTSSM状态机的重要状态,其复杂程度超过Configuration状态。Recovery状态机如图8-10所示,该状态机由Recovery.RcvrLock、Recovery.Speed、Recov-ery.RcvrCfg和Recovery.Idle共四个子状态组成。此时该设备需要从L0状态进入Recovery状态,之后才能进行该操作。当PCIe设备检测到对端处于Idle状态时,将有可能进入Recovery状态。如果EP A希望进入Recovery状态改变数据传送率,则置directed_speed_change位为1,随后进入Recovery.RcvLock状态,同时向端口B发送speed_change位为1的TS1序列。而当端口B处于L0状态时,收到这个TS1序列后,并不会检测speed_change位,而直接进入Recovery状态。

Recovery状态是LTSSM状态机的重要状态,其复杂程度超过Configuration状态。该状态可以从L0、L1和L0s状态进入,当PCIe设备进入低功耗状态,需要进行链路重训练时,将经过Recovery状态之后,才能重新进入正常工作状态,第8.3节将讲述如何从L1和L0s状态进入Recovery状态。

Recovery状态机如图8-10所示,该状态机由Recovery.RcvrLock、Recovery.Speed、Recov-ery.RcvrCfg和Recovery.Idle共四个子状态组成。

1.从L0状态进入到Recovery状态

当PCIe设备工作在L0状态时,出现以下情况时,将进入Recovery状态。

(1)更改数据传送率

PCIe设备需要改变数据传送率时,将进入Recovery状态。在Configuration状态中,PCIe链路两端设备记录了“当前PCIe设备能够支持的数据传送率”,如果两端设备都支持大于2.5GT/s的数据传送率,可以从L0状态进入Recovery状态。

在PCIe设备中存在两个状态位。其中directed_speed_change位为1时,表示PCIe设备希望更改数据传送率,而changed_speed_recovery位为1时表示PCIe链路已经完成数据传送率的更改。

978-7-111-29822-9-Part02-105.jpg

图8-10 Recovery状态机

当数据链路层处于DL_Active状态时,系统软件可以置directed_speed_change位为1,同时复位changed_speed_recovery位为0,随后该设备将进入Recovery状态。值得注意的是PCIe链路的两端设备需要同时改变directed_speed_change和changed_speed_recovery位。

(2)更改链路宽度

PCIe设备在Configuration状态时,如果设置upconfigure_capable状态位为1,可以更改链路宽度。此时该设备需要从L0状态进入Recovery状态,之后才能进行该操作。

(3)已配置完毕的Lane中收到TS1或者TS2序列。

(4)检测或者推断出对端设备处于Idle状态。

当PCIe设备检测到对端处于Idle状态时,将有可能进入Recovery状态。此处的Idle状态由两部分内容组成,一个通过硬件检测对端设备的发送逻辑TX是否处于“Electrical Idle”状态;另一个通过逻辑推断对端设备的发送逻辑是否处于Logical Idle状态。

在正常情况下,发送逻辑TX在进入Electrical Idle状态时,需要发送EIOS序列。如果对端的接收逻辑RX检测到PCIe链路实际上已经进入Idle状态,但是并没有收到EIOS序列时,将认为PCIe链路出现某种故障,PCIe总线并没有规定在这种情况下,PCIe设备是进入Recovery状态还是继续保持在L0状态中,但是在多数实现中,都将进入Recovery状态。

值得注意的是,一个PCIe设备进入Recovery状态之后,将向对端发送TS1序列,而对端设备收到这个TS1序列后,也将从L0状态进入Recovery状态。因此在PCIe链路中,当一端设备进入Recovery状态后,对端设备也将进入该状态。

2.Recovery.RcvrLock状态

PCIe设备进入Recovery状态时,将首先到达Recovery.RcvrLock状态。PCIe设备进入该状态时将连续向对端“已配置完毕的Lane”发送TS1序列,该序列的Link和Lane Number为之前在Configuration状态中设置的值。

如果directed_speed_change位为1时,发送的TS1序列的speed_change位也将设置为1。PCIe设备如果在Recovery.RcvrLock状态时,收到speed_change位为1的TS1序列时,该设备的directed_speed_change位也将改变为1。(www.chuimin.cn)

下文以一个实例说明speed_change位和directed_speed_change位的作用。假设在一条PCIe链路上连接了两个设备,EP A和Switch的下游端口B,而且这两个设备的工作状态的初始值为L0。

如果EP A希望进入Recovery状态改变数据传送率,则置directed_speed_change位为1,随后进入Recovery.RcvLock状态,同时向端口B发送speed_change位为1的TS1序列。

而当端口B处于L0状态时,收到这个TS1序列后,并不会检测speed_change位,而直接进入Recovery状态。然后向EP A发送若干个speed_change位为0的TS1序列,因为此时端口B的directed_speed_change位为0。

当端口B收到“8个连续”的从EP A发来的“speed_change位为1”的TS1序列(还包括EP A支持的数据传送率种类)之后,directed_speed_change位将置为1,然后再向EP A发送“speed_change位为1”的TS1序列。值得注意的是,在上述实例中,端口B在Re-covery.RcvLock状态将发送两种不同的TS1序列,一种序列的speed_change位为0,而另一种序列的speed_change位为1。

PCIe设备连续发送TS1序列的同时,将通过其接收逻辑RX检测,是否收到8个连续的TS1或者TS2序列,是否这些序列使用的Link和Lane Number与该设备发送的值相同,而且这些序列的speed_change位是否与directed_speed_change位相同。如果检测成功,该设备将进入Recovery.RcvrCfg状态。在该状态中,PCIe设备将重新获得Bit/Symbol Lock,并处理不同Lane之间的Skew,这也是该状态位被命名为“Lock”的原因。

PCIe设备还可以从该状态直接进入Recovery.Speed BFQ状态,如果当前PCIe链路已经工作在大于2.5GT/s的数据传送率,但是并不能稳定工作(并没有正确获得Bit/Symbol Lock),此时需要进入Recovery.Speed状态,将数据传送率更改为2.5GT/s。PCIe设备还可以从该状态进入Configuration或者Detect状态。本节对此不做详细介绍。

3.Recovery.RcvrCfg状态

PCIe设备进入Recovery.RcvrCfg状态后,将向对端发送TS2序列,该序列的Link和Lane Number为之前在Configuration状态设置的值。如果directed_speed_change位为1时,该序列的speed_change位也必须为1。发送这些TS2序列的主要目的是进一步确认Recover-y.RcvrLock状态使用TS1序列所获得的结果。

之后PCIe设备通过其接收逻辑RX检测,是否收到了8个连续的TS2序列,这些序列使用的Link和Lane Number与该设备发送的值是否相同,而且这些序列的speed_change位是否与directed_speed_change位相同。

如果检测成功,PCIe设备将根据TS2序列中的speed_change位决定进入Recovery.Speed状态,还是Recovery.Idle状态。

如果该PCIe设备能够支持的数据传送率与接收的TS2序列中的数据传送率重合,比如都支持5GT/s的数据传送率,而且speed_change位为1时,将进入Recovery.Speed状态,PCIe设备从Recovery.RcvrCfg状态迁移到Recovery.Speed状态还有一个补充条件,即接收到第一个TS2序列后,至少向对端发送32个连续的TS2序列。

如果Speed_change位为0时,将进入Recovery.Idle状态,PCIe设备从Recovery.RcvrCfg状态迁移到Recovery.Idle状态还有一个补充条件,即从接收到第一个TS2序列后,向对端发送16个连续的TS2序列。

如果在Recovery.RcvrLock状态中,PCIe设备没有处理不同Lane之间的Skew,在该状态中,PCIe设备可以处理不同Lane之间的Skew。PCIe设备还可以从该状态进入Configuration或者Detect状态。本节对此不做详细介绍。

4.Recovery.Speed状态

PCIe设备进入该状态时,如果使用的数据传送率为2.5GT/s,则其发送逻辑TX需要发送1个EIOS序列,然后进入Electrical Idle状态;如果使用的数据传送率为5.0GT/s,则其发送逻辑TX需要发送2个EIOS序列,然后进入Electrical Idle状态。此时该PCIe设备需要等待其接收逻辑RX也进入Electrical Idle状态,才能进一步工作。接收逻辑检测对端发送逻辑TX是否处于Electrical Idle状态,使用的方法如第8.1.2节所示。

当PCIe设备的发送与接收逻辑都进入到Electrical Idle状态后,至少需要等待800ns判断PCIe链路两端是否成功完成数据传送率的协商,或者等待1ms判断协商是否成功。协商成功后successful_speed_negotiation位被置为1,否则将置0。

如果协商成功,PCIe设备将置directed_speed_change位为0,然后从该状态回到Recov-ery.RcvrLock状态。值得注意的是在Recovery.Speed状态并不发送PLP检查新的数据传送率是否能够使用。而在Recovery.RcvrLock状态中,通过TS1序列判断对端设备是否能够获得Bit/Symbol Lock,确定新的数据传送率是否正常工作。如果不能正常工作,该设备还将从Recovery.RcvrLock状态回到Recovery.Speed状态,将数据传送率降低为2.5GT/s后,再次回到Recovery.RcvrLock状态。

5.Recovery.Idle状态

PCIe链路进入Recovery.Idle状态后,将连续向对端发送Idle序列,当接收逻辑RX的所有可用Lane收到8个连续的Idle序列,而且发送逻辑TX发送了16个Idle序列后,将进入L0状态,完成链路训练或者重训练过程;否则将视情况进入Disabled、Loopback、Hot Re-set、Configuration和Detect状态,本节对Recovery.Idle进入这些状态不做详细分析。