写在前面
笔者在工作中需要包个 PCIe wrapper,正在努力飞快学习 PCIe ing.
本文系转载,略做格式调整与增加解释,转自https://blog.csdn.net/weixin_48180416/article/details/116462197
相应内容可参考:
- MindShare,_PCI Express System Architecture_ 第十四章。
- 《PCI Express 体系结构导读》 第八章
转载正文
物理层逻辑子层包含用于链路训练的状态机(LTSSM)如下图所示,本篇详细介绍Recovery的子状态。
Recovery主要有以下几个子状态:
- Recovery.RcvrLock
- Recovery.RcvrCfg
- Recovery.Speed
- Recovery.Equalization
- Recovery.Idle
其中,Recovery.Equalization将在下一篇博文详细介绍。
Recovery.RcvrLock
从L0,L0s,L1进入的第一个状态就是RcvrLock。
进入Recovery的原因有以下几类:
- 从L1状态退出回到L0,因为L1没有FTS序列不能像L0s一样快速回到L0,所以必须通过Recovery再回到L0;
- 从L0s退出,需要的时间内FTS序列没能成功Lock(Bit Lock, Symbol Lock/Block Alignment)会进入Recovery;
- 从L0进入Recovery:
- 最初的到2.5GT/s的训练完成后,如果支持更高速率就会进入Recovery;
- 请求速率改变或link宽度的改变(一种为了省功耗,例如x16配置为x1,在L0状态的x1甚至比L0s下的x16更加省功耗,另外一种是目前的速率或link宽度不可靠unreliable);
- 软件设置Link Control Register.Retrain Link(为了清除传输问题);
- 链路层REPLAY_NUM rollover, PHY层Retrain Link;
- Link partner进入Recovery状态而收到TS1或TS2;
- Receiver所有的Configured Lane进入Electrical Idle(2.5GT/s时是电压阈值,5GT/s时是128us没收到FC Update DLLP或可选的SKP)但是没有事先收到EIOS.
RcvrLock状态的功能: 发送TS1重新Lock, TS1中的Link Num和Lane Num与Configuration状态下的需要一致。还有其他的一些功能:
- 5GT/s时可以TS1中选择-3.5dB/-6dB De-emphasis;
- 选择Transmitter Voltage Magin;
链路的带宽包含两个方面:速率和link宽度
以 Speed Change 时进入 Recovery 状态为例
以下介绍Speed Change时LTSSM的状态,有助于更好的理解Recovery的子状态
LTSSM在Polling状态时交互TS1,TS1中包含Rate ID,表示支持的速率,2.5GT/s是必须支持的,在Rate ID字段中:
- bit 6 ---“Autonomous Change”表示链路的带宽改变是由于Power Management,不是因为链路可靠性问题;
- bit 7 ---"Speed change" USP用来请求speed change
Speed Change 方式一:USP发起的Speed Change(硬件自主发起)
Speed change必须有USP来发起,通过Recovery状态来完成,以2.5GT/s-->5GT/s速率改变为例(因为5GT/s不包含EQ,所以会简化这个过程)
1. RcvrLock:交互TS1
USP (UPstream Port, 此处指 RC) 发起,USP的Directed Speed Change=1,LTSSM先进入RcvrLock,发送TS1(包含支持的速率,speed change=1)
DSP (Downstream Port,此处指 EP) 收到TS1后,LTSSM进入RcvrLock,由于TS1中的speed change=1故将其Directed Speed Change也设置为1,也发送TS1给USP
2. RcvrCfg: 交互TS2
当USP检测到回复的TS1,LTSSM进入RcvrCfg,USP发起TS2,TS2中Speed Change=1,如果不是因为链路可靠性问题进入Recovery的话,设置Autonomous Change=1
当DSP检测到TS2,LTSSM进入RcvrCfg,DSP也发送TS2给USP,但是Autonomous Change字段是保留字段。
3. Speed: 改变速率
每个Port交互了8个TS2后,双方知道下个状态应该进入Speed.
注:Link Status寄存器有两个状态位autonomous bandwidth status和bandwidth management status可以报状态也可以使能中断给软件,两个状态位区别:
- bandwidth management是由于链路可靠性问题引起的带宽改变,而Autonomous不是。
Speed状态下,两个方向都进入Electrical Idle状态,并且改变速率。
4. RcvrLock and RcvrCfg: 再次进入TS1 TS2交互
当Speed状态timeout后,退出Electrical Idle,回到RcvrLock,重复1、2过程,但是不同的是TS1/TS2的Speed change=0
之后经过Idle子状态(发送Idle Symbols)后进入L0,完成Speed Change.
Speed Change 方式二:软件控制Speed Change
软件不能直接控制Speed Change过程,只能配置Link Control 2寄存器中的Target Link Speed来设置最高支持的速率,
然后设置Link Control寄存器Retrain Link,LTSSM从L0状态重新进入Recovery改变速率,跟上述过程一样。
如果不支持硬件自主改变速率,只采用软件控制的方式,设置Link Control 2寄存器中的Hardware Autonomous Disable=1
以 Link Change 时进入 Recovery 状态为例
以下介绍Link Width Change时LTSSM的状态
LTSSM在Configuration.Complete交互TS2,TS2中包含Rate ID,与TS1不同的是:
- bit 6 ---“Link Upconfigure Capability”表示Link Parner是否支持Link width变宽,如果不支持的话,Link width就只能变窄,最适合出现链路可靠性问题的情况。
Link width change由USP发起,从L0进入Recovery再经过Configuration状态后回到L0状态;
1. RcvrLock->RcvrCfg->Speed->RcvrLock->RcvrCfg:交互TS1,TS2
这个过程与Speed Change过程基本相同,唯一的不同是TS序列中的Speed change=0
2. Recovery.Idle:USP发TS1,其中Link Num, Lane Num改为PAD
DSP继续发送Idle Symbols,USP不再发送Idle Symbols,而是发送包含Link Num=PAD, Lane Num=PAD的TS1,DSP收到后进入Config.Linkwidth.start。
3. Config.Linkwidth.start/accept, Config.Lanenum.wait/accept:交互TS1,确定active/inactive lane
Config.Complete:交互TS2,确认Link Num/Lane Num
- Config.Linkwidth.Start
- DSP发送TS1, 其中Link Num为Link width改变之前协商好的Link Num, Lane Num=PAD;
- USP回复TS1, Link Num=PAD(inactive)或Link Num(active);
- Config.Linkwidth.Accept
- DSP收到回复的TS1,进入Config.Linkwidth.Accept状态;
- Config.Lanenum.Wait
- DSP发送TS1, 其中 Link Num=PAD(inactive)或Link Num(active), Lane Num=PAD(inactive)或Lane Num(active);USP回复相同的TS1;
- Config.Lanenum.Accept
- DSP收到回复的TS1,进入Config.Lanenum.Accept状态;
- DSP检测到Autonomous Change=1,更新autonomous bandwidth status,进入Config.Complete状态;
- Config.Complete
- 对于Active Lane交互TS2,这个时候的TS2包含““Link Upconfigure Capability”信息,inactive lane进入Electrical Idle;
- DSP收到回复的TS2进入Config.Idle,发Idle symbols,USP回复同样的Idle Symbols,然后双方进入L0
本篇总结
- Speed Change状态跳转:
RcvrLock->RcvrCfg->Speed->RcvrLock->RcvrCfg->Idle->L0
- Link Width Change状态跳转:
RcvrLock->RcvrCfg->Speed->RcvrLock->RcvrCfg->Idle->
Config.Linkwidth.Start->Config.Linkwidth.Accept->Config.Lanenum.Wait->Config.Lanenum.Accept->Config.Complete->Config.Idle->
L0
版权声明
版权声明:本文为CSDN博主「小雨滴落落」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:PCI Express学习篇---物理层LTSSM(一) Recovery子状态介绍
转载自:知乎
作者:小雨滴落落
推荐阅读
更多招聘及面经请关注FPGA的逻辑。