LinkUp
LinkUp作用
- 链路是否训练起来
LinkUp置1的情况
- LTSSM进入
Configuration.Idle
状态时,此后一直保持为1,除非遇到需要清0的情况
LinkUp置0的情况
- LTSSM进入
Detect.Quiet
状态时 - LTSSM进入
Disabled
状态时(推荐,不强制) - LTSSM进入
Loopback.Entry
状态时 - LTSSM进入
Hot Reset
状态时
directed_speed_change
directed_speed_change 作用
- pcie2.0新引入的,早期设备可以把此变量认为是0,因为pcie1.0只有2.5GT/s,不涉及到切速过程,所以此变量无用
- DSP/USP是否想要发起切速
- 如果directed_speed_change为1,则在
Recovery.RcvrLock
发出去的TS1中speed_change(symbol 4 bit 7)为1 - 如果directed_speed_change为1,则在
Recovery.RcvrCfg
发出去的TS1中speed_change(symbol 4 bit 7)为1
directed_speed_change设置为0的情况:
- LTSSM进入
Detect
状态时 - USP在退出
Detect
状态后,在Configuration.Complete
或者Recovery.RcvrCfg
时收到的TS中表明DSP不支持高于2.5GT/s的速度,则禁止设置directed_speed_change为1 - LTSSM进入
Recovery.Speed
时 - LTSSM从
Recovery.RcvrLock
跳转到Configuration
时。具体跳转条件为在Recovery.RcvrLock
时,当前工作的速度不等于协商的速度(如changed_speed_recovery为0)且任意一条lane收到的TS1中,link number和lane number与该条lane发出去的一直,且还需满足以下其一:- directed_speed_change为0且收到的TS1,TS2中speed_change比特为0
- 当前速度为2.5GT/s且在收发的TS1,TS2中,2.5GT/s是最高建议的速度
- DSP在退出
Detect
状态后,在Configuration.Complete
或者Recovery.RcvrCfg
时收到的TS中表明USP不支持高于2.5GT/s的速度,则禁止设置directed_speed_change为1 - LTSSM在进入
Recovery.Idle
时 - LTSSM从
Recovery.RcvrCfg
跳转到Configuration
时 - 在
Recovery.RcvrCfg
时,LTSSM 48ms超时进入Recovery.Idle
时
directed_speed_change设置为1的情况:
- 在
Recovery.RcvrLock
状态时,如果收到8个连续的TS1中speed_change(symbol 4 bit 7),即使本端没打算切速 - 在
L0
或者L1
时,打算切速的一方必须设置为1 - DSP在退出
Detect
状态后,如果收到的TS中表明USP支持高于2.5GT/s的速度,且Link Control 2寄存器中的Target Link Speed不等于当前速度,且当Link Control寄存器中的Retrain Link为1时,则必须设置directed_speed_change为1.- 协议此处规定的是Target Link Speed不等于当前速度,如果当前速度等于Target Link Speed且设置Retrain link时,directed_speed_change的行为未定义,所以为0为1都不违反协议
- 更高层想要更改速度时且满足其一:
- 链路处于DL_Active时,双方都支持高于2.5GT/s的速度
- 双方都支持高于8.0GT/s或更高速度时,为了在双方都支持的速度做EQ,changed_speed_recovery设置为0
- DSP选择了替换协议(如cxl),且当前速度不是协商的可替换协议(如cxl)的工作速度
- LTSSM在
L1
时,port可以从L1
退出Recovery
然后再到L0
,到L0
时允许设置为1
changed_speed_recovery
changed_speed_recovery 作用:
- 追踪在
Recovery
状态,速度是否更改为协商的速度,0:没有更改协商的速度,1:更改为了协商的速度
changed_speed_recovery设置为0的情况:
- LTSSM在
Configuration.Complete
时 - LTSSM在2ms超时后,从
Configuration.Complete
跳转到Configuration.Idle
,且变量idle_to_rlock_transitioned小于ffh,且当前速度在8.0GT/s或者更高 - LTSSM从
Recovery.Speed
跳转到Recovery.RcvrLock
,且从L0
或L1
进入Recovery
以来,已经是第二次进入Recovery.Speed
了(如changed_speed_recovery为1)- L0 -> Recovery.RcvrLock -> Recovery.RcvrCfg -> Recovery.Speed -> Recovery.RcvrLock(设置changed_speed_recovery为1,如新速度下不能实现symbol lock) -> Recovery.Speed -> Recovery.RcvrLock(设置changed_speed_recovery为0)
- LTSSM进入
Recovery.Idle
跳转时 - LTSSM从
Recovery.RcvrCfg
跳转到Configuration
状态时
changed_speed_recovery设置为1的情况:
- LTSSM从
Recovery.Speed
跳转到Recovery.RcvrLock
,且已经进入过Recovery.RcvrCfg
时,且链路速度已经协商好(successful_speed_negotiation为1)- L0 -> Recovery.RcvrLock -> Recovery.RcvrCfg -> Recovery.Speed -> Recovery.RcvrLock(设置为1)
upconfigure_capable
upconfigure_capable 作用:
- pcie2.0新引入的,早期设备可以把此变量认为是0
- 是否可以升lane,如果该变量为1,则在链路宽度降低后,允许在升lane
upconfigure_capable设置为0的情况:
- LTSSM进入
Detect
状态时 - LTSSM在
Configuration.Complete
时,且下一个状态是Configuation.Idle
时,且Flit_Mode_Enabled为0,且发送和收到的8个连续的TS2中,Link Upconfigure/L0p Capability为0 - LTSSM在
Configuration.Complete
2ms超时后,且发送和收到的8个连续的TS2中,Link Upconfigure/L0p Capability为0。可以更新但是不要求
upconfigure_capable设置为1的情况:
- LTSSM在
Configuration.Complete
时,且下一个状态是Configuration.Idle
时,且变量Flit_Mode_Enabled为0,且发送和收到的8个连续的TS2中,Link Upconfigure/L0p Capability为1 - LTSSM在
Configuration.Complete
2ms超时后,且发送和收到的8个连续的TS2中,Link Upconfigure/L0p Capability为1。可以更新但是不要求
start_equalization_w_preset
start_equalization_w_preset作用:
- eq过程是否基于预设值,即根据非
Recovery.Equalization
过程中收到TS来决定发射机的Transmitter Preset
start_equalization_w_preset设置为1的情况:
- USP在
Recovery.RcvrCfg
状态,当前链路速度为2.5GT/s或者5.0GT/s,且收到的8个连续的TS2是EQ TS2,且TS2中建议支持8.0GT/s或者及更高的速度 - USP在
Recovery.RcvrCfg
状态,当前链路速度为2.5GT/s或者5.0GT/s,且收到的8个TS2为EQ TS2,且TS2中建议支持32.0GT/s或者更高的速度,且两端在Configuration
状态协商的EQ模式为Equalization bypass to the highest NRZ rate. - USP在
Recovery.RcvrCfg
状态,并且当前链路速度为8.0GT/s,并且收到的TS2是128b/130b EQ TS2,且双方都建议支持16.0GT/s或者更高的速度 - USP在
Recovery.RcvrCfg
状态,并且当前链路速度为16.0GT/s,并且收到的TS2是128b/130b EQ TS2,且双方都建议支持32.0GT/s或者更高的速度 - USP在
Recovery.RcvrCfg
状态,并且当前链路速度为32.0GT/s,并且收到的TS2是128b/130b EQ TS2,且双方都建议支持64.0GT/s或者更高的速度 - 满足下列任意一个情况下,DSP必须把equalization设置为1:
- 变量equalization_done_8GT_data_rate为0
- 双方都支持16.0GT/s且变量equalization_done_16GT_data_rate为0
- 双方都支持32.0GT/s且变量equalization_done_32GT_data_rate为0
- 双方都支持64.0GT/s且变量equalization_done_64GT_data_rate为0
- Link Control 3寄存器中的Performance Equalization为1
- 基于特定必须要执行EQ过程
start_equalization_w_preset设置为0的情况:
- DSP进入
Recovery.Equalization
(进入时为EQ Phase 1) - USP进入
Recovery.Equalization
(进入时为EQ Phase 0) - 进入
Recovery.RcvrCfg
时复位为0
Flit_Mode_Enabled
Flit_Mode_Enabled作用
- 用于表明Flit模式是否协商成功
Flit_Mode_Enabled设置为1的情况
- DSP在
Configuration.Lanenum.Wait
满足下面所有条件- NOTE:这部分协议写在
Configuration.Linkwidth.Accpet
章节的,但是需要在Configuration.Lanenum.Wait
判断 - 变量LinkUp为0
- 进入
Polling
状态以来,在Polling
和Configuration
阶段传输的TS1和TS2中速度标识符中的Flit_Mode_Supported比特为1(Symbol 4 bit 0) – 表明本端支持Flit Mode - 从
Polling.Configuration
跳转到Configuration
时所有lane收到的TS2中Flit_Mode_Supported为1(Symbol 4 bit 0) – 表明对方也支持Flit Mode
- NOTE:这部分协议写在
- USP在
Configuration.Lanenum.Wait
时满足下面所有条件:- 变量LinkUp为0
- 从进入
Polling
状态以来,在Polling
状态和Configuration
发送TS1,TS2中速度标识中的Flit_Mode_Supported为1 – 表明本端支持Flit Mode - 从
Polling.Configuration
跳转到Configuration
时,所有lane收到的TS2中Flit_Mode_Supported为1 – 表明对端支持Flit Mode
Flit_Mode_Enabled设置为0的情况
- LTSSM进入
Detect
状态时
L0p_capable
L0p_capable作用
- 表明本端是否支持L0p
L0p_capable置为1的情况
- DSP/USP 在
Configuration.Complete
状态时满足下面所有条件,同时把Device Status 3寄存器中的Remote L0p Supported置为1- 变量LinkUp=0且Flit_Mode_Supported为1
- 设备发送TS2时,TS2中的Link Upconfigure/L0p Capability(Symbol 4 bit 6)为1 – 表明本端支持L0p
- 收到的8个连续的TS2中,TS2中的Link Upconfigure/L0p Capability为1 – 对端支持L0p
L0p_capable置为0的情况
- LTSSM进入
Detect.Quiet
时清0
SRIS_Mode_Enabled
idle_to_rlock_transitioned
idle_to_rlock_transitioned作用
- 用于表明从
Recovery.Idle
或者Configuration.Idle
往Recovery.RcvrLock
跳转的次数 - NOTE 上述跳转只能是超时跳转,如果超时条件不满足,也不会从
Recovery.Idle
或者Configuration.Idle
跳到Recovery.Idle
- pcie 2.0新增加的变量,pcie 2.0以前如果没实现,则认为是255(ffh)
idle_to_rlock_transitioned增加的情况
- gen1/2,超时后,LTSSM从idle(
Recovery.Idle
或者Configuration.Idle
)往Recovery.Rcvrlock
跳转一次就加1,该变量直接变为255,即gen1/2只允许一次超时 - gen3以及以上,超时后,LTSSM从idle(
Recovery.Idle
或者Configuration.Idle
)往Recovery.Rcvrlock
跳转一次就加1,直到计数到255
idle_to_rlock_transitioned置为0的情况
- LTSSM进入
Detect
状态 - LTSSM进入
L0
状态(针对gen3以及以上) - LTSSM肌凝乳
L0
状态,在收到STP或者SDP符号时(针对gen1/2)