LTSSM – Recovery
Recovery.RcvrLock
Recovery.RcvrLock时的行为
- 如果链路速度在 8.0 GT/s 或者更高, 只有那条 lane 获得 block alignment (块锁定) 之后,才会考虑接受 TS1 或者 TS2
- 如果该状态是从 L1 或者 Recovery.Speed 或者 L0s 进入, block alignment 必须在退出 ei 后
- 如果该状态是从 L0 进入, block alignment 必须在最后一个 Data Stream(数据流) 后
- 当操作速度在 8.0 GT/s 或者更高时
Recovery.RcvrLock状态跳转
- Recovery.RcvrLock可以实现的跳转
- Recovery.RcvrLock -> Recovery.RcvrCfg
- Recovery.RcvrLock -> Recovery.Speed
- Recovery.RcvrLock -> Recovery.Equalization
- Recovery.RcvrLock -> Configuration
- Recovery.RcvrLock -> Detect
Recovery.RcvrLock -> Recovery.RcvrCfg
条件 | 跳转原因 |
---|---|
条件1 | 所有配置过的 lane 收到 8 个连续的 TS1/2OS, TS1/2 需要满足: 1. link# 与 lane# 与对应 lane 发出去的一致 2. speed_change (Symbol 4 bit[7] ) 位与变量 directed_speed_change 相等 3. 所有 TS1 EC 域 (symbol 6) bit[1:0] 为 00b (针对 8.0 GT/s 或者更高) 如果Extend Synch比特为1的话,在跳转之前必须最少发送1024个TS1OS 如果此状态是从Recovery.Equalization跳转而来,Upstream port必须评估TS1OS中的equalization coefficients或preset跟最后一次配置是否相同,如果不同,在Recovery.RcvrRcfg中通过设置TS2OS中Request Equalization告知对方 |
条件2 | 24ms 超时后, 同时满足下面的条件 1. 任意一条配置过的 lane 收到 8 个连续的 TS1/2, 并且在同一条 lane 上 link# 与 lane# 与发出去的一致,收到的 TS1/2 中 speed_change 位要等于 1b或者在Flit模式下,任意一条lane收到8个连续的TS2OS,Link number为PAD,lane number与传输的一致 2.当前速度高于 2.5 GT/s, 或者发射和接收到的 8 个 TS1 中都支持大于 2.5 GT/s 的速度(通过设置Symbol 4) |
Recovery.RcvrLock -> Recovery.Speed
条件 | 跳转原因 |
---|---|
条件1 | 24 ms 超时后, 如果从 L0/L1 进入 Recovery 状态以来,链路速度没有改变为协商的速度 (如: changed_speed_recovery = 0b), 并且当前链路速度大于 2.5 GT/s,8b/10b或者128b/130b编码下新速度为 2.5 GT/s,1b/1b编码下新速度为32.0GT/s |
条件2 | 24 ms 超时后,如果从 L0/L1 进入 Recovery 状态以来,链路速度改为协商后的速度 (如 changed_speed_recovery = 1b), 新速度为为从 L0/L1 进入 Recovery.Speed 的速度 |
Recovery.RcvrLock -> Recovery.Equalization
- 暂时省略
Recovery.RcvrLock -> Configuration
条件 | 跳转原因 |
---|---|
必须满足 | 24 ms 超时后, 如果任何一条配置过的 lane, 已经接收到至少一个 TS1 或 TS2 ,其 link# 和 lane# 与在同一 lane 上传输的内容相匹配, 且变量 directed_speed_change 复位为 0b, 并且从进入 Recovery 以来, 操作速度没有改变到协商的速度(如: changed_speed_recovery = 0b),并且满足以下其一 |
条件1 | 变量 directed_speed_change = 0b 且 TS1 或 TS2 中的 speed_change (Symbol 4 bit[7]) 为 0: |
条件2 | 当前速度为 2.5 GT/s,并且在发送的 TS1 或者接受的TS1 或 TS2 (对方可能处于其它状态) 中表明 2.5 GT/s 是支持的最高速度: |
Recovery.RcvrLock -> Detect
条件 | 跳转原因 |
---|---|
条件1 | 24 ms 超时后,不满足进入其它状态的条件, 比如 2.5 GT/s 时收不到 TS |
Recovery.Equalization
- 发射机在所有配置过的 lane 上发送 TS1OS
- 如果 LTSSM 经历了从 Configuration 到 Recovery.RcvrLock 再到 Recovery.Equalization, 则 TS1OS 中的 link# 和 lane# 在离开 Configutaion 状态时已经确定
- 如果该状态是由 Loopback.Entry 跳转而来, 则 TS1OS 中的 link# 和 lane# 在 Loopback.Entry 中定义; – 如果该状态是从 Loopback.Entry, 未测试的 lane 必须被是没有配置过且不能执行 EQ(Equalization) 程序, 未测试的 lane 必须设置它们的发射机预设(preset)值未 P4, 在测试的 lane 的目的仅仅是为了在 Loopback.Active 中创造需要的噪声.
Recovery.Equalization Phase 1
Downstream Port 处于该状态时
- 进入该状态时
- 当前阶段是 Phase 1
- 如果数据操作速度是 8.0 GT/s, 需要将下面的内容清零
- 寄存器 Equalization 8.0 GT/s Phase 1 Successful
- 寄存器 Equalization 8.0 GT/s Phase 2 Successful
- 寄存器 Equalization 8.0 GT/s Phase 3 Successful
- 寄存器 Link Equalization Request 8.0 GT/s
- 寄存器 Link Status 2 中的 Equalization 8.0 GT/s Complete 位
- 寄存器 Link Control 3 中的 Perform Equalization 位
- 变量 equalization_done_8GT_data_rate
- 如果数据操作速度是 16.0 GT/s, 需要将下面的内容清零
- 寄存器 Equalization 16.0 GT/s Phase 1 Successful
- 寄存器 Equalization 16.0 GT/s Phase 2 Successful
- 寄存器 Equalization 16.0 GT/s Phase 3 Successful
- 寄存器 Link Equalization Request 16.0 GT/s
- 寄存器 16.0 GT/s Status 中的 Equalization 16.0 GT/s Complete 位
- 寄存器 Link Control 3 中的 Perform Equalization 位
- 变量 equalization_done_16GT_data_rate
- 如果数据操作速度是 32.0 GT/s, 需要将下面的内容清零
- 寄存器 Equalization 32.0 GT/s Phase 1 Successful
- 寄存器 Equalization 32.0 GT/s Phase 2 Successful
- 寄存器 Equalization 32.0 GT/s Phase 3 Successful
- 寄存器 Link Equalization Request 16.0 GT/s
- 寄存器 32.0 GT/s Status 中的 Equalization 32.0 GT/s Complete 位
- 寄存器 Link Control 3 中的 Perform Equalization 位
- 变量 equalization_done_32GT_data_rate
- start_equalization_w_preset 值设置未 0b
- 发射机传输 TS1OS,
- TS1OS 中包括当前速度下对应的发射机预设设置
- EC 域必须位 01b
- 每条 lane 的 Transmitter Preset 位都必须设置为当前速度下的预设值
- FS,LF 和 Post-cursor 系数的设置必须与发射机预设位保持一致
Recovery.RcvrCfg
Recovery.RcvrCfg时的行为
- 发射机在所有配置过的 lane 上发送 TS2
- lane# 和 link# 为退出 Configuration 状态后的 lane# 和 link#
- 如果 directed_speed_change 变量为 1, 则 speed_change (Symbol 4 bit[7]) 位也要为 1
Recovery.RcvrCfg状态跳转
- Recovery.RcvrCfg可以实现的跳转
- Recovery.RcvrCfg -> Recovery.Speed
- Recovery.RcvrCfg -> Recovery.Idle
- Recovery.RcvrCfg -> Configuration
- Recovery.RcvrCfg -> Detect
Recovery.RcvrCfg -> Recovery.Speed
条件 | 跳转原因 |
---|---|
条件1 | 同时满足同时满足所有(a)(b)(c)三个条件 (a) 满足i,ii,iii,iv其一 i. 任意一条配置过的 lane 收到 8 个连续的 TS2, 接收到的 TS2 与发出去的 TS2 具有相同速度标识 (Symbol 4), Symbol 6具有相同的值并且 speed_change (Symbol 4 bit[7]) 位为 1b; 无论是 8b/10b 还是 128b/130b 编码,8个连续的 TS2 都是标准的 TS2 ii. 所有配置过的 lane 接收到 8 个连续的 EQ TS2 或者 128b/130b EQ TS2, 接收到的 TS2 与发送出去的 TS2 具有相同的速度标识 (Symbol 4), Symbol 6 具有相同的值, 并且 speed_change (Symbol 4 bit[7]) 位为 1b iii. 任意一条配置的 lane 收到 8 个连续的 EQ TS2 或者 128b/130b EQ TS2, 接收到的 TS2 与发出去的 TS2 具有相同的速度标识,Symbl 6 具有相同的值, speed_change (Symbol 4 bit[7])为 1b, 并且任意一条 lane 收到 8 个连续的 EQ TS2后,超时 1ms iv. 使用1b/1b编码时,任意一条配置过的lane收到8个连续的且相等的TS2OS,并且speed_change为1 (b) 当前速度高于 2.5 GT/s 或者链路双方都支持高于 2.5 GT/s 的速度 (通过发送和接收到 8 个连续 TS2 中的速度标识来判断) (c) 对于 8b/10b 编码, 在某条 lane 上, 接收到一个 speed_change 位为 1b 的 TS2 后, 在同一条 lane 上至少需要发送 32 个 speed_change 位为 1b的 TS2, 并且 TS2 不能被 EIEOS 打断; 对于 128b/130b 编码和1b/1b编码, 在某条 lane 上, 接收到一个 speed_change 位为 1b 的 TS2 后,在同一条 lane 上至少需要发送 128 个 speed_change 位为 1b 的 TS2 |
条件2 | 从 L0/L1 进入 Recovery 以来, 链路速度改为了协商后的速度 (如: changed_speed_recovery = 1b), 并且任意一条配置过的 lane 检测到了 EIOS 或者检测/推断出对方处于 EI 状态(根据多长时间没有收到 TS 来推测,或者电路来检测), 并且进入 Recovery.RcvrCfg 以来, 所有配置过的 lane 都没有收到 TS2。在离开 Recovery.Speed 的速度变为从 L0/L1 进入 Recovery 的速度 |
条件3 | 从 L0/L1 进入 Recovery 以来, 链路速度没有改为了协商后的速度 (如: changed_speed_recovery = 0b), 且当前速度高于 2.5 GT/S, 并且任意一条配置过的 lane 收到 EIOS 或者检测/推断对方处于 EI, 并且从进入 Recovery.RcvrCfg 以来,所有配置过的 lane 都没有收到 TS2。离开 Recovery.Speed 后的速度为 2.5 GT/s.changed_speed_recovery复位为0 |
Recovery.RcvrCfg -> Recovery.Idle
条件 | 跳转原因 |
---|---|
条件1 | 不超时进入, 同时满足1和2 1. 所有配置过的 lane 都收到 8 个连续的 TS2, 并且每条 lane 发出去的 TS2 与该条 lane 收到 TS2 中有相同的 link# 和 lane#, 以及相同的速度标识(Symbol 4), 还需要满足a或b: a. 接收到 8 个连续的 TS2 中 speed_change(Symbol 4 bit[7]) 位为 0b b. 当前速度是 2.5 GT/s 并且在接收或接受的 8 个 TS2 中不支持 5.0 GT/s 及更高的速度或在发送的TS2OS中不支持高于5.0GT/s的速度 2. 在收到 1 个 TS2 后,发送了 16 个 TS2, 并且发送的 TS2 不能被 EIEOS 打断, 在进入 Recovry.Idle 之后, 变量 changed_speed_recovery 和 directed_speed_change 复位为 0b,在离开Recovery.RcvrCfg后,lane-to-lane de-skew必须完成 |
条件2 | 超时进入 (比如收到 TS,但是 TS 不符合进去Recovery.Speed 的条件) 48ms 超时后, idle_to_rlock_transitioned 变量小于 FFh 并且当前速度在 8.0 GT/s 及以上.在进入Recovery.Idle时,changed_speed_recovery和 directed_speed_change复位为0 |
Recovery.RcvrCfg -> Configuration
条件 | 跳转原因 |
---|---|
条件1 | Non-Flit模式下,任意一条配置过的 lane 收到 8 个连续的 TS1,其中 link# 或者 lane# 与这些 lane 上发送的 link# 或者 lane# 不一致,在接收到1个TS1OS后,需要发送16个TS2OS, 无论是8b/10b编码还是128b/130b编码都还需要满足以下任意一个条件,且changed_speed_recovery和directed_speed_change都为复位为0: 1. 接受到的 TS1 中 speed_change 位为 0 2. 当前速度为 2.5 GT/s,或者在接受到的 8 个连续的TS1OS中表明不支持5.0GT/s及更高的速度或者在发送的TS2OS中,不支持5.0GT/s 或者更高的速度 |
条件2 | Flit模式下,LTSSM进入Configuratino后changed_speed_recovery和directed_speed_change都复位为0,如果1,2,3都满足: 1. 在此状态下,任意一条lane收到1个TS1OS或者TS2OS后,待了1ms 2. 满足a,b,c其一: a. 任意一条配置过的lane上收到1个TS2OS后收到了8个连续的TS1OS b. 任意一条配置过的lane上收到8个连续的TS1OS,其link number和lane number都是PAD且没有收到TS2OS c. 任意一条配置过的lane上收到8个连续的TS2OS,其link number为PAD,或者任意一条配置的lane发送的TS2OS中,link number 为PAD 3. 在收到1个TS1OS(link number和lane nubmer都是PAD)或者1个TS2OS后,至少发送了16个TS2OS |
Recovery.RcvrCfg -> Detect
条件 | 跳转原因 |
---|---|
条件1 | 48 ms 超时后, 当前速度为 2.5 GT/s 或者 5.0 GT/s |
条件2 | 48 ms 超时后, 不满足进入其它状态的条件 (比如当前速度为 8.0 GT/s, 且 idle_to_rlock_transitioned == ffh) |
Recovery.Speed
Recovery.Speed时的行为
- gen1 没有 recovery.speed 状态, gen1 只有一个速度,不需要改变速度
- 发射机会进入 ei 状态,并且会待在 ei 状态直到 Receiver lane 也进入到 ei 状态
- 如果速度协商成功(successful_speed_negotiation = 1b), 至少需要在此状态待 800 ns, 如果速度协商失败(successful_speed_negotiation = 0b), 则至少需要待 6 us, 但是待在此状态的总时间不能操作 1 ms
- 只有 Receiver 也进入 ei 状态后,才能更改的新的链路速度
- 如果协商的速度是 5.0 GT/s 并且操作在 full swing 模式, 根据变量 select_deemphasis 的值确定 de-emphasis
- 如果 select_deemphasis 为 0, de-emphasis 水平为 -6 dB
- 如果 select_deemphasis 为 1, de-emphasis 水平为 -3.5 dB
- 进入 ei 前必须发送 EIOSQ
- 如果任意一条配置过的 lane 收到 EIOS 或者检测/推断对方进入了 ei (根据多长时间没有收到 TS 来判断), 则该条 lane 上存在 ei 条件
- 进入该状态时,速度协商成功(如 successful_speed_negotiation = 1b), 如果任意一条配置过的 lane 在特定时间类,Receiver lanes 没有收到 TS1 或者 TS2, 则推断进入了 ei
- 进入该状态时,速度协商失败(如 successful_speed_negotiation = 0b), 如果在指定时间间隔内,任意一条配置过的 lane 中没有检测到至少一次 ei 退出(即所有 lane 都没有检测到退出 ei)
- 如果速度没有达到 target link speed(Link Control 2 bit[3:0]), 则会一直往最高速度切
Recovery.Speed状态跳转
- Recovery.Speed可以实现的跳转
- Recovery.Speed -> Recovery.RcvrLock
- Recovery.Speed -> Detect
Recovery.Speed -> Recovery.RcvrLock
条件 | 跳转原因 |
---|---|
条件1 | 发射机对应的 lane 不在要求处于 EI 状态 (直到 Receiver Lanes 也进入 ei, 这说明对方 tx 也处于 ei 状态, 然后根据速度是否协商成功还需要额外待一段时间 ),directed_speed_change变量为0 1. 如果此状态是从 Recovery.RcvrCfg 状态进入,并且速度协商成功(如 successful_speed_negotiation = 1b), 所有配置过的 lane 的新速度会改为链路双方支持的最高速度 , 变量 changed_speed_recovery 置为 1 2. L0 或者 L1 进入 Recovery 以来,此状态已经是第二次进入,链路新速度会改为从 L0 或者 L1 进入 Recovery 的速度,变量 changed_speed_recovery 置 0。 3. 如果进入Recovery.Speed前时1b/1b编码,新速度为32.0GT/s,changed_speed_recovery仍然为0b 4. 否则新速度为 2.5 GT/s (比如第一次进入 Recovery.Speed 时, 速度协商失败; 又比如在第一次进入 Recovery.RcvrCfg 阶段时有些 lane 收不到 TS2), 变量 changed_speed_recovery 复位为 0b |
Recovery.Speed -> Detect
条件 | 跳转原因 |
---|---|
条件1 | 48ms超时且当前速度小于64.0GT/s后, spec 说这种条件在正常条件下不会发生, 超时可能意味这对方 已经不能通常通信 |
条件2 | 当前速度为64.0GT/s,96ms超时或者48ms超时,spec强烈推荐使用96ms,48ms超时可能会导致不预期的跳转到Detect,因为64.0GT/s Eq phase2的超时时间(64ms)大于phase 1超时时间(12ms)+Recovery.Speed超时时间(48ms) |
Recovery.Idle
Recovery.Idle时的动作
- 当使用8b/10b 编码时, 所有配置过的 lane 上传输 idle data(全0, 会加扰)
- 当使用 128b/130b 编码时, 与速度有关
- 当速率为 8.0 GT/s 时, 在所有配置过的 lane 上, 发射机发射一个 SDSOS 开始传输数据流 (Data Stream), 然后发送 Idle Data Symbol, 第一个 Idle data Symbol 位于 lane 0上,并且也是 Data Symbol 的第一个 Symbol
- 当速率为 16.0 GT/s 及更高时, 在所有配置过的 lane 上, 发射机发射 1 个 SDSOS 后, 需要在发送 1 个 Control SKPOS, 然后才发送数据流。同样, 数据流由 Idle data Symbol 构成, lane 0 上传输的第一个 Idle data Symbol 是数据流的第一个 Symbol
- 如果更高层需要直接去其它状态(如 Disable, Hot Reset, Configuration 或 Loopback), 在跳转在其它状态之前,禁止发送 Idle Symbol, 并且 Idle Symbol 也禁止使用 128b/130b 编码
Recovery.Idle状态跳转
- Recovery.Idle可以实现的跳转
- Recovery.Idle -> L0
- Recovery.Idle -> Recovery.RcvrLock
- Recovery.Idle -> Disabled
- Recovery.Idle -> Loopback
- Recovery.Idle -> Hot Reset
- Recovery.Idle -> Configuration
- Recovery.Idle -> Detect
Recovery.Idle -> L0
条件 | 跳转原因 |
---|---|
条件1 | 当使用 8b/10b 编码,non-Flit模式时, 所有配置过的 lane 都收到了 8 个连续 Symbol time 的 idle data, 并且在收到 1 个 idle data Symbol 后必须发送 16 个 idle data Symbol |
条件2 | 当使用 128b/130b 编码,non-Flit模式时, 所有配置过的 lane 都收到了 8 个连续 Symbol time 的 Idle data, 在收到 1 个 Idle data Symbol 后需要发送 16 个 Idle data Symbol, 并且该状态不能是 Recovery.RcvrCfg 超时而来 |
条件3 | Flit模式,如果收到2个IDLE Flits后,在8b/10b编码或128b/130b编码下至少发送了4个Flit,1b/1b编码下至少发送了8个Flit,且该状态不是由Recovery.RcvrCfg超时而来。跳转到L0时,idle_to_rlock_transitioned复位为00h,处理数据之前lane-to-lane de-skew必须完成 |
Recovery.Idle -> Recovery.RcvrLock
条件 | 跳转原因 |
---|---|
条件1 | 2 ms 超时后, idle_to_rlock_transitioned 变量小于 FFh 如果速率是 8.0 GT/s 及更高,跳转到 Recovery.RcvrLock 后, idle_to_rlock_transitioned 会加 1 如果速率是 5.0 GT/s 或者 2.5 GT/s, 跳转到 Recovery.RcvrLock 后, idle_to_rlock_transitioned 直接设置为 FFh |
Recovery.Idle -> Disabled
条件 | 跳转原因 |
---|---|
条件1 | 更高层直接把 TS1OS 和 TS2OS中的 Disable link (Symbol 5 bit[1]) 位置 1, 适用于DSP或者可选的 crosslink Port |
条件2 | 任何一条配置过的 lane 收到 2 个连续的 TS1OS, 且 TS1 中 Disable Link 位为 1b, 只适用于non-Flit模式下的USP 和可选的 crosslink Port |
条件3 | Flit模式下,针对USP, 进入此状态的原因是收到了8个连续的TS2OS,如果任意一条lane收到的TS2OS中,training control字段的Disable Link比特为1 |
Recovery.Idle -> Loopback
条件 | 跳转原因 |
---|---|
条件1 | 更高层直接把 TS1 和 TS2 中的 LoopbacK 位(Symbol 5 bit[2])置 1, 发射机会成为 Loopback Master |
条件2 | port处于non-Flit模式,任意一条配置过的 lane 收到 2 个连续的 TS1OS, 且 TS1OS 中的 Loopback 位为 1b, 该 port 会成为 Loopback Slave |
条件3 | port处于Flit模式,进入此状态是由于收到了8个连续的TS2OS,如果任意一条lane收到的TS2OS中,training control字段的Loopback比特为1. 该port会成为Loopback Follower |
Recovery.Idle -> Hot Reset
条件 | 跳转原因 |
---|---|
条件1 | 更高层直接把 TS1OS 和 TS2OS 中的 Hot Reset (Symbol 5 bit[0])位置 1, 适用于DSP或者可选的crosslink Port |
条件2 | 任意一条配置过的 lane 收到 2 个连续的 TS1OS, 且 TS1OS 中的 Hot Reset 位为1, 只适用于non-Flit模式下的USP和可选的 crosslink Port |
条件3 | Flit模式下,针对USP, 进入此状态的原因是收到了8个连续的TS2OS,如果任意一条lane收到的TS2OS中,training control字段的Disable Link比特为1 |
Recovery.Idle -> Configuration
条件 | 跳转原因 |
---|---|
条件1 | 更高层直接把重新配置 (re-configure) 链路, 比如不同的链路宽度 |
条件2 | 任意一条配置过的 lane 收到 2 个连续的 TS1OS, 且 TS1OS 中的 Lane# 为 PAD (推荐使用这种方式改变链路宽度,升lane或降lane会更快) |
Recovery.Idle -> Detect
条件 | 跳转原因 |
---|---|
条件1 | 2 ms 超时后, 不满足进入 Recovery.RcvrLock 的条件 (idle_to_rlock_transitioned == FFh) |