LJgibbs · 2021年12月17日

PCI Express 学习篇_物理层 LTSSM(1):Recovery 子状态介绍

写在前面

笔者在工作中需要包个 PCIe wrapper,正在努力飞快学习 PCIe ing.
本文系转载,略做格式调整与增加解释,转自https://blog.csdn.net/weixin_48180416/article/details/116462197
相应内容可参考:

  • MindShare,_PCI Express System Architecture_ 第十四章。
  • 《PCI Express 体系结构导读》 第八章

转载正文

物理层逻辑子层包含用于链路训练的状态机(LTSSM)如下图所示,本篇详细介绍Recovery的子状态。

image.png
image.png

Recovery主要有以下几个子状态:

  • Recovery.RcvrLock
  • Recovery.RcvrCfg
  • Recovery.Speed
  • Recovery.Equalization
  • Recovery.Idle

其中,Recovery.Equalization将在下一篇博文详细介绍。
Recovery.RcvrLock
从L0,L0s,L1进入的第一个状态就是RcvrLock。
进入Recovery的原因有以下几类:

  1. 从L1状态退出回到L0,因为L1没有FTS序列不能像L0s一样快速回到L0,所以必须通过Recovery再回到L0;
  2. 从L0s退出,需要的时间内FTS序列没能成功Lock(Bit Lock, Symbol Lock/Block Alignment)会进入Recovery;
  3. 从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

image.png

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字段是保留字段。

image.png

3. Speed: 改变速率

每个Port交互了8个TS2后,双方知道下个状态应该进入Speed.

注:Link Status寄存器有两个状态位autonomous bandwidth status和bandwidth management status可以报状态也可以使能中断给软件,两个状态位区别:

  • bandwidth management是由于链路可靠性问题引起的带宽改变,而Autonomous不是。

Speed状态下,两个方向都进入Electrical Idle状态,并且改变速率。

image.png

4. RcvrLock and RcvrCfg: 再次进入TS1 TS2交互

当Speed状态timeout后,退出Electrical Idle,回到RcvrLock,重复1、2过程,但是不同的是TS1/TS2的Speed change=0

之后经过Idle子状态(发送Idle Symbols)后进入L0,完成Speed Change.

image.png

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

image.png

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。

image.png

3. Config.Linkwidth.start/accept, Config.Lanenum.wait/accept:交互TS1,确定active/inactive lane

Config.Complete:交互TS2,确认Link Num/Lane Num

  • Config.Linkwidth.Start
  1. DSP发送TS1, 其中Link Num为Link width改变之前协商好的Link Num, Lane Num=PAD;
  2. USP回复TS1, Link Num=PAD(inactive)或Link Num(active);

image.png

  • Config.Linkwidth.Accept
  1. DSP收到回复的TS1,进入Config.Linkwidth.Accept状态;

image.png

  • Config.Lanenum.Wait
  1. DSP发送TS1, 其中 Link Num=PAD(inactive)或Link Num(active), Lane Num=PAD(inactive)或Lane Num(active);USP回复相同的TS1;
  • Config.Lanenum.Accept
  1. DSP收到回复的TS1,进入Config.Lanenum.Accept状态;
  2. DSP检测到Autonomous Change=1,更新autonomous bandwidth status,进入Config.Complete状态;
  • Config.Complete
  1. 对于Active Lane交互TS2,这个时候的TS2包含““Link Upconfigure Capability”信息,inactive lane进入Electrical Idle;
  2. DSP收到回复的TS2进入Config.Idle,发Idle symbols,USP回复同样的Idle Symbols,然后双方进入L0

image.png

本篇总结

  • 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的逻辑
推荐阅读
关注数
10604
内容数
561
FPGA Logic 二三事
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息