目录
- 前言
- 一、简介
- 1.1 链路过程总结
- 二、基本概念
- 2.1 常用字符序列
- 2.1.1 TS1 TS2序列
- 2.1.2 Idle序列
- 2.1.3 FTS(Fast training sequence)序列
- 2.1.4 SKIP序列
- 2.2 链路训练相关知识
- 三、具体过程
- 3.1 detect状态
- 3.2 polling状态
- 3.3 config状态
- 3.4 L0状态
- 3.5 Recovery状态
- 3.5.1 Recovery状态总流程介绍
- 3.5.2 Recovery状态各状态转换介绍
- 四、其他相关链接
- 1、PCI总线及发展历程总结
- 2、PCIe物理层总结-PCIE专题知识(一)
- 3、PCIe数据链路层图文总结-PCIe专题知识(二)
- 4、8b/10b编码方式详细总结
前言
本文主要介绍PCIe物理层链路训练和链路初始化的详细过程。
一、简介
物理层实现了链路训练(Link Training)和链路初始化(Link Initialization)的功能,这一般是通过链路训练状态机(Link Training and Status State Machine,LTSSM)来完成的
主要流程为上电后两侧根据PCIe总线协议进入LTSSM流程;该过程是一套硬件自动化的流程,链路双方自动协商速率和宽度,调节发送和接收参数,从而达到最佳信号质量。
1.1 链路过程总结
1、初始状态,探测对方是否存在
2、互发Training Sequence,实现位锁定(Bit Lock)、字符锁定(Symbol Lock,Gen1 & Gen2 Only)、块锁定(Block Lock,Gen3 Only)
3、互发TS,确定链路宽度、速度,通道位置翻转(Lane Reversal)、信号极性翻转(Polarity Inversion)、确定链路的数据率(Data Rate),确定lane-to-lane Deskew
4、进行链路重新训练
5、正常工作状态
流程图如下:
二、基本概念
2.1 常用字符序列
PCIe进行链路训练时要发送一些特殊的字符序列,这些序列也被称为PLP,物理层报文。这些字符序列主要有如下:
2.1.1 TS1 TS2序列
TS1(training sequence 1)主要用于检测PCIe链路的配置信息,TS2用来确认TS1的检测结果。TS序列gen1、gen2和gen3的格式有所不同,为了简化说明,我们以gen1、gen2格式来描述。 它们由16个symbol组成。第1个字符为COM控制字符表示序列的开始。第二个字符在链路初始阶段为PAD(空字符),在配置阶段为该端口使用的Link number。第二个字符在初始阶段为PAD,在配置阶段为Lane number。第三个字符为FTS序列的个数。第四个字符为当前PCIe设备支持的数据传输速率。第五个字符存放命令。
2.1.2 Idle序列
当发送端进入Electrical Idle之前要向对端发送EIOS序列。出于Idle状态时PCIe链路使用的功耗最低。
2.1.3 FTS(Fast training sequence)序列
由1个COM字符加上3个FTS字符组成,主要目的是协助PCIe的链路获取bit lock和symbol lock。
2.1.4 SKIP序列
1个COM加上3个SKP字符组成。主要用于时钟补偿,处理各个lane上面的skew。
2.2 链路训练相关知识
1、位锁定(bit lock):因为PCIe总线在进行数据传递时需要使用时钟进行同步,但是PCIe链路中并没有提供这个时钟信号,因此进行链路训练时接收端需要从发送端的数据报文中提取接收时钟,这个过程被称为位锁定。
2、字符锁定(symbol lock):在链路训练过程中,PCIe链路要首先确定COM字符,它标志着链路训练开始或者重新训练的开始,确定COM字符的标志被称为字符锁定。
3、链路宽度:一条PCIe总线提供的链路带宽可以是x1,x2,x4,x8等等,但是这个总线上的所挂接的设备并不完全使用这些链路。如一个x4的设备可能会接到x8的链路上,这时在链路训练时就必须通知对方实际的链路状态。
4、通道翻转:PCIe链路两端的设备所使用的的Lane可以错序进行连接,这个就是通道翻转。
5、信号翻转:在相同的通道上,差分信号的极性也可以错序连接,这个就是信号翻转。
6、链路数据率:最初链路的训练和初始化都是基于2.5G T/S 也就是GEN1的速度的,如果链路两端都支持更高的速度则会自动retrain到更高的速度。
7、通道对齐:链路上的通道可能会不是同时到达的,有的可能早到有的可能晚到,链路就需要进行调整和补偿,这个就叫做通道对齐。
三、具体过程
3.1 detect状态
此部分主要的作用是用来确认PCIe链路上可以正常工作的lane资源
1、detect.quiet
2、detect.active
3、polling
1、上电后PCIe两端设备同时进入detect.quiet状态,首先host先将linkup 以及upconfig capblity 置0,同时PCIe链路处于静默状态,当其中一个或多个lane退出静默状态,或者经过12ms后,进入detect active状态。
2、host向对端“未经过配置的lane”发送receive Detect 序列(通过DC共模电压来识别对方是否存在,对应的lane是否正常工作)。若没有一个存在则退回Detect.quiet状态重新进行detect流程。否则经过12ms后再次发送receive Detect序列来确认与上次正常工作的lane数目是否一致。若不一致则退回Detect.quiet状态重新进行detect流程。若一致则进入下一个状态polling状态
3.2 polling状态
该状态主要功能为获取bit/symbol lock 以及同步链路两端使其进入下一个config状态。 有基本有一下三个子状态机组成,其实还有一个polling.compliance状态机负责对pcie链路进行检测是否存在故障。
总过程如下:
1、polling.active
2、polling.config
3、exit to config状态
1、进入polling.active 状态后TX等待DC共模电压恢复到正常水平后首先PCIe两端的TX会向对端发送1024个TS1序列,用于获取bit/symbol lock,其中TS1序列的Lane/Link number必须为PAD(即不设置Lane/Link number),由于pcie两端设备进入polling.active状态的时机可能不同步因此只要满足一下几种情况就能进入polling.config状态
2、同时RX会接收8个TS1序列(对端通过loopback传过来),或者TS2序列(对端先进入polling.config状态,从而生成TS2序列),
3、如果没有接收到则经过20ms判断RX是否接收8个TS1序列,或者从进入polling.active状态时有至少一个lane是可以正常工作的。
4、满足以上条件则进入polling.config状态。否则进入polling.compliance状态对链路进行修复,修复成功重新进入polling.active,修复不成功退回detect状态。
5、进入polling.active状态后,首先设置link control 2寄存器的transmit margin为0, 其次向对端发送8个TS2序列表示已经成功进入polling.config状态。最后要收到8个TS2序列(,若在48ms之内完成以上操作则进入config状态,否则退回到detect状态重新训练。
3.3 config状态
该功能是pcie link 训练中最重要的状态,主要的作用为完成pcie链路的主要配置工作主要包括,link number 和 lane number,以及对各个lane通过设置FTS来进行deskew。然后进入L0状态使PCIe链路正常工作 主要有以下几个子状态组成分别为:
1、cfg.linkwidth.start
2、cfg.linkwidth.accept
3、cfg.linknum.start
4、cfg.linknum.accept
5、cfg.complete
6、cfg.idle
7、L0
1、cfg.linkwidth.start和cfg.linkwidth.accept 主要的作用是确定linknum(通过互相发送TS1来确定PCIe下游端口的linknum拓扑结构)。
2、cfg.linknum.start和cfg.linknum.accept 主要的作用是确定lanenum 。
3、cfg.complete 状态主要是确定完link/lane num后,再通过互发TS2序列来同步pcie链路两端使其同步进入cfg.idle状态 另一个作用是通过TS2序列来确定设置多少个FTS,来消除lane之间的skew。
4、cfg.idle 该状态主要为pcie两端会向对端发送16个idle序列,同时接受端收到16个idle序列后,将自己的link_up寄存器设置为1,同时pcie链路的状态有DL-inactive转变为DL_init,进入L0状态,PCIe链路可以正常工作。
3.4 L0状态
该状态为PCIe链路正常工作的状态,host可以访问device的配置空间以及与之进行数据交互。
3.5 Recovery状态
3.5.1 Recovery状态总流程介绍
当链路需要重新训练时需要进入L0状态,通常是当改变数据传输速度或者是链路宽度以及从L0s, L1等低功耗状态中回复的时候都需要进入该状态(L0s可以直接回到L0状态,只有在切回L0状态时不能重新获取bit/symbol lock时才进过recovery状态)。在该状态中位锁定,符号锁定操作都会被重新进行,该状态一共分为以下几个子状态:recovery.rcvlock、recovery.rcvcfg、recovery.speed、recovery.idle。
1、PCIe需要更改链路速率
pcie设备中存在两个状态位,dircted_speed_change == 1表示pcie设备希望更改传输速率,changed_speed_recovery == 1,表示pcie链路更改速率完成。软件可以将dircted_speed_change == 1同时 changed_speed_recovery == 0 触发设备进入recovery状态,注意pcie 链路两边需要同时进行该操作;
2、PCIe需要更改链路宽度;
3、已经配置完成的lane又重新受到TS1或者TS2序列;
4,、发现对端进入idle状态(只有当对端进入idle是没有发送EIO序列,认为pcie链路出了故障)。
具体关系如下图所示:
3.5.2 Recovery状态各状态转换介绍
1、recovery.rcvlock:该状态重新获取bit/symbol lock 并处理lane之间的skew;
比如,switch 与 EP两端都处于L0 状态,EP想改变速率,
(1)则软件将dircted_speed_change 置1,同时将changed_speed_recovery 置0,进入recovery.rcvlock状态,同时向switch发送TS1 序列(该序列中的speed change 位为1),
(2)当switch接收到TS1时直接进入recovery.rcvlock状态并向对端发送若干TS1序列(此时还没有检查接收TS1的speed change状态位,所以发送的TS1序列,speed change 仍然为0),当switch收到8个连续的TS1(speed change 位为1),将改变switch本地的dircted_speed_change 置1,此时再向EP发送若干TS1序列(speed change 为1)。
(3)当EP设备收到8个 TS1序列中speed change 状态和EP本地dircted_speed_change状态一样,则进入recovery.rcvcfg状态。并向switch发送TS2序列(其speed change 也为1).
(4)当switch 接收到8个TS2序列中speed change 状态和switch本地dircted_speed_change状态一样。则进入recovery.rcvcfg状态。同时向EP发送TS2 序列。
2、recovery.rcvcfg switch和ep 根据TS2序列中的speed change 状态位来决定进入下个状态机:
(1)当TS2序列中speed change状态位1 跳转到recovery.rcvspeed状态,同时向对端发送32个TS2序列
(2)当TS2序列中speed change状态位0 跳转到recovery.rcvidle状态,同时向对端发送16个TS2序列
3、recovery.rcvspeed 状态:
(1)进入该状态后根据TS2序列中的速率,向对方发出不同的EIO序列,同时两端进入electrical idle状态(TX和RX都进入idle状态)。
(2)pcie两端都进入electrical idle 状态后,需要判断pcie链路两端是否成功完成速率协商,等待800ns ~ 1ms 后判端 successful_speed_negotiation是否为1,然后将本地dircted_speed_change 置位0,跳转到recovery.rcvlock用新的速率重新获取bit/symbol lock 并处理lane之间的skew。若不能获得symbol/bit lock 还得退回recovery.rcvspeed 进行降速,再次进入recovery.rcvlock状态获取bit/symbol lock 并处理lane之间的skew。
4,recovery.rcvsidle 链路两端设备TX向对端发送16个idle序列,并且RX端接受到8个idle序列,则该设备进入L0状态。