PCIe LTSSM状态机

LTSSM状态机

LTSSM状态机涵盖了11个状态,包括Detect, Polling, Configuration, Recovery, L0, L0s, L1, L2, Hot Reset, Loopback, Disable。系统进行复位操作(Cold, Hot or Warm Reset)后,会自动进入Detect状态。

PCIe LTSSM状态机_第1张图片

正常的PCIe链路训练状态转换流程依次是,Detect->Polling->Configuration->L0。L0是PCIe链路可以正常工作的电源状态。

LTSSM-Detect

Detect:检测远端阻抗以确定是否有设备
a) Detect.Quiet时,Tx处于Electrical Idle状态,LinkUp清0,以及其他复位动作
b) 只要有lane退出Electrical Idle,就进入Detect.Active,此时双方检测对端阻抗,确定对端是否有设备
c) 只要有某条/几条lane的双方均检测到对端有Rx,则进入Polling,其他没有检测成功的lane进入Electrical Idle,一条lane也没有则回到Quiet

PCIe LTSSM状态机_第2张图片

LTSSM-Polling

Polling:发送和回复TS,bit lock,symbol lock,lane 极性在此阶段确定
TS(Training Sequences)用于初始化bit align,symbol align,交换参数。TS1主要检测PCIe链路配置信息,TS2确认TS1的检测结果
a)Polling.Active,Tx向对端发送TS1,对端Rx接收到TS1后通过其Loopback发送回来
b)当Rx收到8个连续的TS1或者收到8个TS2,这种情况下进入Polling.Configuration
c)Polling.Configuration:此时TX发送TS2(lane/link number为PAD,linkup为0)
d)当在Polling.Configuration时收到8个连续的TS2,并且在收到一个TS2之后再发出去16个TS2之后进入Configuration状态

PCIe LTSSM状态机_第3张图片

LTSSM-Configuration

Configuration:Rx/Tx协商link number,lane number,(这步骤可以确定link width)当recovery出现错误没有进入L0也可能先进Configuration
首次从Polling进入Configuration时LinkUp=0,从recovery进入该状态是LinkUp=1
Configuration.Idle时,PCIe链路设置完毕,当收到对端8个Idle序列并且向对端发送16个Idle序列之后将LinkUp值1,数据链路层从DL_Inactive进入DL_Init,物理层进入L0

PCIe LTSSM状态机_第4张图片

LTSSM-Recovery

Recovery:用于切换data rate,或者从L0经过Recovery.Rcvrlock再到Configuration去切换link width,此时bit lock(位锁),symbol lock(符号锁) 会重新建立

当PCIe链路需要重新训练时,进入Recovery状态。主要有以下几种情况:
(1) PCIe链路信号发现error,需要调整Bit Lock和Symbol Lock;
(2) 从L0s或者L1低功耗电源状态退出;
(3) Speed Change。因为第一次进入L0状态时,速率是2.5GT/s. 当需要进行速率调整5.0GT/s或者8.0GT/s时,需要进入Recovery状态进行Speed Change. 这个阶段,Bit Lock、Symbol Lock等都需要重新获取;
(4) 需要重新调整PCIe链路的Width;
(5) 软件触发retrain操作;
PCIe LTSSM状态机_第5张图片
切换速率
1.设备希望切换速率,系统软件置directed_speed_change=1,然后进入Recovery.Rcvrlock,同时向对端发送TS1
2.对端收到8个speed_change bit=1的TS1后,也发送speed_change bit=1的TS1
3.两端设备连续接收8个TS1,且speed change bit和directed speed change bit相同,进入recovery.Rcvrcfg
4. Recovery.rcvrcfg:发送TS2序列进行同步(与polling.configuration阶段相同,TS2来同步两端的设备都进入xxxxcfg阶段)。通过比较speed_change位与directed_speed_change位是否相同,决定进入recovery.speed还是recovery.idle
5.如果标志位都是0表明切换过速率了,就进入recovery.idle,反之进入speed状态

切换带宽
L0进Recovery之后进configuration切换link width的情况也有
设备在L0时希望切宽度,系统软件置upconfigure_capable=1,设备进入recovery.rcvrlock,并且检测到directed_speed_change=0,说明是设备向切宽度而不是速度,然后进入configuration

Recovery.rcvrcfg时TS2的lane/link number不一致,会进入configuration

LTSSM-L0

L0:正常工作状态
L0进recovery的情况
当两端都支持高速率,并且系统软件置directed_speed_change=1
切link宽度,系统软件置upconfigure_capable=1
正常工作的lane中又收到对端发送TS1/TS2,说明对端想改速度或者宽度并进入recovery了
Link errors会导致LTSSM从L0跳转到Recovery
在PCIe链路中,只要一方进入recovery,对方就会收到TS1,两端都将进入recovery

L0s

L0s 是 ASPM(Active State Power Management)机制提供的第 1 级低功耗状态,该状态可以在较短的时间内切换到 L0 状态。当设备要从 L0 状态切换到 L0s 状态时,需要向外发送 EIOS。当设备要从 L0s 状态切换到 L0 状态时,需要向外发送多个 FTS,从而快速获取 Bit Lock 和 Symbol/Block Lock。

PCIe LTSSM状态机_第6张图片

L1

L1 是 ASPM(Active State Power Management)机制提供的第 2 级低功耗状态,它的功耗比 L0s 低,但是需要更长的时间才能切换到 L0 状态。想要进入 L1 状态,位于 PCIe 总线两端的设备需要进行协商,然后同时进入 L1 状态。两种可能的方式如下:

ASPM 机制下硬件自动切换。当 Upstream Port 的硬件发现没有 TLP 或者 DLLP 需要再发送的时候,就会自动和 Downstream Port 进行协商进入 L1 状态。如果 Downstream Port 同意,则二者同时进入 L1 状态;如果 Downstream Port 拒绝,则 Upstream Port 会进入 L0s 状态。
电源管理软件通过命令将设备配置为低功耗状态(D1,D2,D3hot)。此时 Upstream Port 和 Downstream Port 上的设备同时进入 L1 状态。

PCIe LTSSM状态机_第7张图片

L2

L2 状态是ASPM(Active State Power Management)机制提供的第 3 级低功耗状态,此时设备的主电源被关闭,从而达到更低的功耗。该状态下,几乎所有的逻辑都被关闭,只有一小部分使用 Vaux 供电的逻辑在工作,该部分逻辑可以用来发送 wakeup 事件。

支持 wakeup 功能的 Upstream Port 能向外发送一个低频信号,该信号称为 Beacon。Downstream Port 将 Beacon 信号转发给 Root Complex。通过 Beacon 或者 WAKE# 引脚,设备可以要求系统恢复它的主电源供电。

PCIe LTSSM状态机_第8张图片

Loopback

该状态是用来测试的,但是协议并没有明确规定 Receiver 在该状态下做些什么。基本的操作很简单:设备 A 作为 Loopback Master,连续对外发送两个 TS1 Ordered Sets,并且 TS1 的 Training Control 区域的 Loopback 位需要设置为 1。设备 B 接收到连续两个 Loopback 位为 1 的 TS1 之后,就会进入 Loopback state,称为 Loopback Slave。Loopback Slave 会将收到的所有内容再发送给 Loopback Master,从而形成回环,验证链路的完整性。

PCIe LTSSM状态机_第9张图片

LTSSM-Hot Reset

当某个PCIe设备发生错误时,有时候需要通过软件的方式对设备进行复位,这个方式就是Hot Reset。
Hot Reset触发之后,LTSSM会进入Recovery和Hot Reset状态,之后会到Detect状态,PCIe链路开始重新训练

LTSSM-Disable

用户可以通过设置修改Link Control寄存器,让PCIe链路出于Disabled状态
另外,如果我们把设备移除之后,同样也进入Disabled状态。当退出Disabled状态后,LTSSM回到Dectect,PCIe链路重新训练

LTSSM-总结

  1. Link Width协商只存在Configuration阶段,Recovery/L0无法改变

  2. Link Speed在Polling阶段都是2.5G,只会在Recovery阶段发生变化

  3. 切速度只会在recovery阶段,切宽度只会在configuration阶段

  4. LinkUp状态位在首次进入Configuration状态为0,之后Recovery/L0以及再次进入Configuration都是1

  5. 对于上游/下游端口,如果directed_speed_change变量从未记录过大于2.5 GT/s的数据速率支持,则不能将其设置为1,也就是说不能进行Link Speed的修改

  6. 对于下游端口,如果大于2.5 GT / s数据速率支持已经指出,下游端口必须设置directed_speed_change变量1

  7. Link training的时候只在2.5GT/s的状态下进行,之后到L0后进入recovery 切换到对应速率

  8. 带宽判断已经在Configuration阶段达成,如果切换带宽需要L0->Recovery->Configuration ,到configuration阶段再次带宽进行判断

你可能感兴趣的:(PCIE,服务器)