PCIe物理层链路训练和初始化(详细)总结附图文解析-PCIe专题知识(三)

10 篇文章 24 订阅

前言

本文主要介绍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,第四个字符TS序列的个数。第五个字符为当前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状态

DC共模电压识别对端设备详解:
总的来说只要 Device B 的 Rx 存在并且工作正常,那么其 DC 共模输入阻抗要远小于 Device B 不存在或者 Device B 的 Rx 工作不正常时的阻抗。
通过检测对端设备接收逻辑 Rx 的 DC 共模输入阻抗,来判断接收端是否存在。如果设备 A 的发送逻辑 Tx 发现其负载的 DC 阻抗在 ZRX-DC 范围(40 Ω ~ 60 Ω)之内或者小于 40 Ω 时,那就可以认定 对端 Device B 的接收逻辑 Rx 存在。

PCIe 协议规定:
当接收逻辑 Rx 处于正常工作状态时,其 DC 共模输入阻抗 ZRX-DC 应该在 40 Ω ~ 60 Ω 之间。
当接收逻辑 Rx 的 Vcc 没有上电,VD+ 信号或者 VD- 信号的电压伏值大于 0 时,其 DC 共模输入阻抗 ZRX-HIGH-IMP-DC-POS 最小为 50 kΩ。
当接收逻辑 Rx 的 Vcc 没有上电,VD+ 信号或者 VD- 信号的电压伏值小于 0 时,其 DC 共模输入阻抗 ZRX-HIGH-IMP-DC-NEG 最小为 1.0 kΩ。

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

3.3.1 config过程

在这里插入图片描述

1、cfg.linkwidth.start和cfg.linkwidth.accept 主要的作用是确定link num(通过互相发送TS1来确定PCIe下游端口的link num拓扑结构)。
2、cfg.linknum.start和cfg.linknum.accept 主要的作用是确定lane num 。
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.3.2 link num和lane num的区别

PCI总线是一种地址和数据复用的总线,地址和数据占用同一组信号线。PCIe采用了差分、全双工的传输设计,允许在同一时刻,同时进行发送进而接收数据,设备之间通过双向的Link连接,每个Link支持1~32个通道(lane)。
Link num:
是指两个PCIe部件的链接,通常是由端口和lane组成。(通常有多条lane)比如我们有一个X2的链路,意思是指这条链路是两条lane组成,一共8条物理连线。链路上传送的是编码之后的数据,比如Gen1/Gen2所采用的8b/10b编码,Gen3之后改成了128b/130b编码。Link初始化以及link建立过程(或者称之为链路训练,Link Training)是在设备上电或者链路重新建立链接是发生的。

Lane num:
是指一组差分信号的组合,包括发送和接收。一个发送方向的差分信号包括TX+和TX-两条线,接收亦然。所以一条lane有四条物理连线。发送和接收是同时进行的,故为全双工。

在这里插入图片描述

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状态一样为1,则进入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状态。

四、其他相关链接

1、PCIe物理层总结-PCIE专题知识(一)

2、PCIe数据链路层图文总结-PCIe专题知识(二)

3、PCIe物理层链路训练和初始化总结-PCIe专题知识(三)

4、PCIe物理层弹性缓存机制解析-PCIe专题知识(四)

5、PCIe热插拔机制总结-PCIe专题知识(五)

6、PCIe事务层总结-PCIe专题知识(六)

7、PCI总线及发展历程总结

8、8b/10b编码方式详细总结

  • 14
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值