- TS(Training Sequences)用于初始化bit align,symbol align,exchange PHY parameter。TS1主要检测PCIe链路配置信息,TS2确认TS1的检测结果
- EIOS(Electrical Idle Ordered Set Sequence),Tx进入Electrical Idle之前,必须发送EIOS,Electrical Idle状态下Tx差分电压接近0mV
- EIEOS(Electrical Idle Exit Ordered Set),在发TS1之前或linking training过程中会时不时发送一段低频的IEOS,用于Rx端的Electrical Idle exit circuitry可以检测到电路离开Electrical Idle状态
- FTS(Fast Training Sequence)序列主要使接受Rx重新获得bit/symbol lock
- SKIP序列,进行时钟补偿,补偿300ppm的漂移,PHY发送一定数量个字符之后必须发送SKIP序列,Elastic Buffer收到SKIP序列之后要补偿相差
- Receiver Detect序列,用于识别Rx是否上电,因为Rx上电阻抗50欧姆,不上电则有kΩ级别,发送一个脉冲波形,通过检测电流大小能检测到对端是否有设备
- Link Training and Status State Machine (LTSSM)
- Detect:检测远端阻抗以确定是否有设备
a) Detect.Quiet时,Tx处于Electrical Idle状态,LinkUp清0,以及其他复位动作
b) 只要有lane退出Electrical Idle,就进入Detect.Active,此时双方检测对端阻抗,确定是对端否有设备
c) 只要有某条/几条lane的双方均检测到对端有Rx,则进入Polling,其他没有检测成功的lane进入Electrical Idle,一条lane也没有则回到Quiet - Polling:发送和回复TS,bit lock,symbol lock,lane polarity在此阶段确定
a) Polling.Active,Tx向对端发送1024个TS1(其中lane/link number均填为PAD),对端Rx接收到TS1后通过其Loopback发送回来
b) 当我的Rx收到8个连续的TS1(compliance位为0,或Loopback位为1)或者收到8个TS2(可能两端设备LTSSM不同步,对方设备已经进入Polling.Configuration状态),这3种情况下我就进入Polling.Configuration
c) Polling.Configuration:此时我的TX发送TS2(lane/link number为PAD,linkup为0
d) 当我在Polling.Configuration时收到8个连续的TS2,并且在收到一个TS2之后再发出去16个TS2之后进入Configuration状态
e) Polling.Active时发送的TS1序列为RX经loopback在由TX发出去的,所以收到的TS1和准备发送的TS1相同,而且两端设备异步发TS1;而Polling.Configuration是对端设备重新生成的序列,当两端设备都收齐TS2序列后,将基本同步进入Configuration状态。从这个角度说TS2序列是为了同步“异步发送的TS1”
f) 另外还有Polling.Compliance(做均衡)/Polling.Speed(切速率)等子状态,很多设备不支持 - Configuration:Rx/Tx协商link number,lane number,当recovery出现错误没有进入L0也可能先进Configuration
a) 首次从Polling进入Configuration时LinkUp=0,从recovery进入该状态是LinkUp=1
b) Configuration.Idle时,PCIe链路设置完毕,当收到对端8个Idle序列并且向对端发送16个Idle序列之后将LinkUp值1,数据链路层从DL_Inactive进入DL_Init,物理层进入L0 - Recovery:用于切换data rate,或者从L0经过Recovery.Rcvrlock再到Configuration去切换link width,此时bit lock,symbol lock,block alignment会重新建立
a) 如果设备希望切速率,系统软件置directed_speed_change=1,然后进入Recovery.Rcvrlock,同时向对端发送TS1(link/lane number都是之前协商好的值,speed change bit为1)
b) 对端接到8个speed change bit=1的TS1之后也发送speed change bit=1的TS1
c) 两个设备发送TS1的同时检测接收的TS1,如果连续收到8个TS1或TS2(对端已经进入rcvrcfg),并且speed change bit与directed_speed_change位相同,则进入recovery.rcvrvfg
d) Recovery.rcvrcfg:发送TS2序列进行同步(与polling.configuration阶段相同,TS2来同步两端的设备都进入xxxxcfg阶段)。通过比较speed_change位与directed_speed_change位是否相同,决定进入recovery.speed还是recovery.idle
e) 如果标志位都是0表明切换过速率了,就进入recovery.idle,反之进入speed状态
f) Recovery.idle之后进入L0或其他状态
g) 另外recovery.equalization子状态又有3个Tx equalization子状态
h) L0进Recovery之后进configuration切换link width的情况有
i. 设备在L0时希望切宽度,系统软件置upconfigure_capable=1,设备进入recovery.rcvrlock,并且检测到directed_speed_change=0,说明是设备向切宽度而不是速度,然后进入configuration
ii. Recovery.rcvrcfg时TS2的lane/link number不一致,会进入configuration - L0:正常工作状态,此时才会有TLP。L0进入recovery有5种情况
a) 当两端都支持高速率,并且系统软件将directed_speed_change置1
b) 想切link宽度,系统软件置upconfigure_capable=1,
c) 正常工作的lane中又收到对端发送TS1/TS2,说明对端想改速度或者宽度并进入recovery了;或者对方发EIOS进入Electrical Idle,
d) 任意一条lane都没有收到EIOS,但是推断对方所有lane都进入了Logical Idle状态。If Electrical Idle is detected/inferred on all Lanes 40 without receiving an EIOS on any Lane,
e) Link errors:Framing Errors, loss of Block Alignment, Elasticity Buffer Overflow/Underflow, or loss of Lane-to-Lane de-skew会导致LTSSM从L0跳转到Recovery
f) 在PCIe链路中,只要一方进入recovery,对方就会收到TS1,两端都将进入recovery - L0s/L1/L2:省电模式
- Disabled/Loopback/Hot Reset等其他状态
- 一些重要的点
a) Link Width协商只存在于Configuration阶段,Recovery/L0无法改变;
b) Link Speed在Polling阶段都是2.5G,只会在Recovery阶段发生变化;
c) 切速度只会在recovery阶段,切宽度只会在configuration阶段
d) LinkUp状态位在首次进入Configuration状态为0,之后Recovery/L0以及再次进入Configuration都是1;
e) Link training在Configuration/Recovery阶段为1,其他阶段为0
相关文章: