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

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

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

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

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

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

Recovery.RcvrLock跳转到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

Recovery.RcvrLock跳转到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

Recovery.RcvrLock跳转到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

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

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

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

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

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

Recovery.RcvrLock跳转到Recovery.RcvrCfg条件
条件 跳转原因
条件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

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

Recovery.Idle跳转到Detect条件
条件 跳转原因
条件1 更高层直接把重新配置 (re-configure) 链路, 比如不同的链路宽度
条件2 任意一条配置过的 lane 收到 2 个连续的 TS1OS, 且 TS1OS 中的 Lane# 为 PAD (推荐使用这种方式改变链路宽度,升lane或降lane会更快)

Recovery.Idle -> Detect

Recovery.Idle跳转到Detect条件
条件 跳转原因
条件1 2 ms 超时后, 不满足进入 Recovery.RcvrLock 的条件 (idle_to_rlock_transitioned == FFh)
guest
0 评论
内联反馈
查看所有评论