LTSSM全称是Link Training and Status State Machine,有以下11个状态:
Detect, Polling, Configuration, Recovery, L0, L0s, L1, L2, Hot Reset, Loopback, Disable
这些状态分为5大类:
1、链路训练状态(Link Training State):Detect->Polling->Configuration->L0.
2、重训练状态(Re-Training(Recovery) State):Recovery.
3、软件驱动功耗管理状态(Software Driven Power Management State):L0->L1/L2/L0s
4、活动状态功耗管理状态(Active-State Power Management State,ASPM State):L1/L0s
5、其他状态(Other State):Hot Reset, Loopback, Disable
与电源管理相关的状态为:L0 ,L1, L2, L0s;
L0:
这是链路(Link)的正常状态(Normal and Full-Active State),所有的TLP、DLLP和Ordered Sets都可以被正常的收发。该状态下,速率可以是2.5GT/s或者是5GT/s或更高(如果链路两端设备都支持的话,且经过了Re-Trainning)。
L0s:
该ASPM状态主要用于降低功耗,在总线空闲的时候可以进入该状态,且从该状态可以迅速地重新切换回L0状态。当在L0状态是,链路上出现EIOS时,则表明即将进入L0s状态。当在L0s状态时,链路上出现FTS时,链路会迅速地完成位锁定和符号锁定,并进入L0状态。
L1:
相对于L0s状态,L1状态下的功耗更低。进入L1状态需要链路两端的PCIe进行“沟通”,只有双方都“同意”进入该状态,链路才会进入该状态。一般有以下两种方式:
1、第一种是由ASPM引导,硬件自动完成的。发送端发现链路上长时间没有TLP或者DLLP时,便通过ASPM建议接收端进入L1状态。如果接收端“同意”了,则链路进入L1状态;如果接收端“不同意”,则链路进入L0s状态。
2、第二种是有软件引导的,软件发送一系列的命令让链路进入低功耗状态(D1,D2,or D3 Hot)。随后,链路的上端设备会通知下端设备进入L1状态,收到来自下端设备的应答后,链路进入L1状态。
L2:
L2状态下的链路功耗更低,因为其只保留了Vaux,关闭了链路的其他功能。此时,需要Beacon信号或者WAKE#边带信号来唤醒系统。其中Beacon信号是一种低频信号(30KHz~500MHz)
这几个状态的切换关系如下:
对应的电源状态的区别如下:
Power Management states 按照Function 和 Link两个层面分为D states 和L states (就是上一节的L0,L1,L0s)
具体地说,D states是指Device的电源状态,L states是指Link的状态,是上下游之间连接的状态。
D states 就是 Device Power Management States (D-States) of a Function,分为以下4个状态:
D0状态,又被称为Full-On状态。其有两个子状态——D0(未初始化,Uninitialized)和D0(活动,Active)。
当PCIe设备刚完成Fundamental Reset(前面的文章详细介绍过)时,或者刚从D3 Hot状态进入D0状态时,该PCIe设备的Function默认进入的是D0未初始化状态。在D0未初始化状态下,所有的寄存器(除了Sticky位)都恢复为其默认的状态。此时,只能响应配置请求(Configuration Transaction),且不能发起事务,也不能处理接收到的Memory或者IO事务。
当处于D0未初始化状态的Function完成配置后,便会进入D0活动状态。在D0活动状态下,Function的所有功能都是可操作的,即正常工作的状态。
D1状态,又称为轻睡眠状态(Light Sleep)。该状态是可选的。
D2状态,又称为深睡眠状态(Deep Sleep)。该状态也是可选的。
D3状态,又称为Full-Off状态。其也有两个子状态D3 Hot状态和D3 Cold状态。当设备进入D3 Hot状态,表明该设备的电源尚未切断;而进入D3Cold状态,则表明设备的电源已被切断,如有Vaux存在,则链路进入L2状态,否则进入L3状态。
软件层可以通过向PMCSR(Power Mgt Control and Status Register)的PowerState位置写相关值,使得设备的某个Function进入D3 Hot状态。在D3 Hot状态下,该Function只能发送PME消息和PME_TO_ACK消息或者应答配置请求和PME_Turn_Off消息。
PCIe设备PM的各个状态之间的切换关系,如下图所示:
D states和L states的关系其实就是上下游端口的电源状态与他们之间link的状态关系,如下表:
Active State Power Management (ASPM) is an autonomous hardware-based, active state mechanism that enables power savings even when the connected components are in the D0 state. After a period of idle Link time, an ASPM Physical-Layer protocol places the idle Link into a lower power state. Once in the lower-power state, transitions to the fully operative L0 state are triggered by traffic appearing on either side of the Link. ASPM may be disabled by software.
主动状态电源管理(Active State Power Management, ASPM)是一种基于自主硬件的主动状态机制,即使连接的组件处于D0状态,也可以节省电源。经过一段空闲链路时间后,ASPM物理层协议将空闲链路置为低功耗状态。一旦进入低功率状态,连接两端出现的流量将触发向完全运行的L0状态的转换。ASPM可能被软件禁用。
Components in the D0 state (i.e., fully active state) normally keep their Upstream Link in the active L0 state, as defined in Section 5.3.2 . ASPM defines a protocol for components in the D0 state to reduce Link power by placing their Links into a low power state and instructing the other end of the Link to do likewise. This capability allows hardware-autonomous,dynamic Link power reduction beyond what is achievable by software-only controlled (i.e., PCI-PM software driven)power management.
D0状态的组件(即如第5.3.2节所定义,通常使其上游链路处于活动的L0状态。ASPM为处于D0状态的组件定义了一个协议,通过将它们的链接置于低功率状态并指示链接的另一端也这样做来降低链接功率。这种能力允许硬件自主的,动态的链路功耗降低,超出了软件(PCI-PM软件驱动)控制的能力的电源管理。
通俗点讲:一般的设备(不支持ASPM)处于D0状态时对应的link状态为L0(参考上面一张图)。而支持并使能ASPM的组件,在D0状态可由硬件自主检测链路是否空闲,然后在空闲时自动让link状态进入L1(L0s)低功耗状态(并指示对端)。
BTW:据SSD的供应商宣传,支持ASPM的SSD和主板配合可以明显改善SSD的发热(高性能的SSD发热还是很猛的)。
ASMP在linux下的支持与软件介绍:https://blog.51cto.com/xiamachao/1680952
PCI Express Capability Structure:
bit22:ASPM Optionality Compliance
这一位用于指示组件是否兼容ASPM,软件需要判断这一位是否为1来决定是否可以使你ASPM。(可能是用于早期ASPM还未定义完全的版本)
每个component必须上报它支持ASPM的程度,以及L0s和L1的退出latency(从L0s/L1到L0所需的时间)。endpoint必须报告它能承受的最差latency,例如因为L0s/L1到L0的转换时延导致的内部FIFO 溢出(overrun)。 Power management软件可以利用各component提供的信息来进行合适的aspm。
PM L1ss:
首先得enable PM L1.1或者PM L1.2,在进入L1之后,通过拉高CLKREQ#来进入L1.1或L.2, CLKREQ#也用来退出L1ss。注意CLKREQ#是个open-drain三态双向端口,当有一端将其拉低,则CLKREQ#为低。如果两端都不drive CLKREQ#,则为高,表明可以关断REFCLK。注意进入L1的请求是由upstream端口发起。(CLKREQ# 低有效,拉低请求外部时钟打开)
当link处在PCI-PM L1.0,且PCI_PM L1.2 enable位已被设置,如果CLKREQ#被拉高,则必须进入L1.2;
当link处在PCI-PM L1.0,且PCI_PM L1.1 enable位已被设置,如果CLKREQ#被拉高且PCI_PM L1.2没被enable,则必须进入L1.1;
支持ASPM L1.2的端口必须支持Latency Tolerance Reporting (LTR)。
当link处在ASPM L1.0,且ASPM L1.2 enable位已被设置,当CLKREQ#被拉高后,如果下面两个条件都满足,就会进入ASPM L1.2:
1. 上报的snooped LTR值大于或等于LTR_L1.2_THRESHOLD中的value和scale确定的值,或者没有snoop service latency的需求;
2. 上报的non-snooped LTR值大于或等于LTR_L1.2_THRESHOLD中的value和scale确定的值,或者没有non-snoop service latency的需求。
当link处在ASPM L1.0,且ASPM L1.1 enable位已被设置,当CLKREQ#被拉高后,如果不满足进入L1.2的条件,就会进入ASPM L1.1.
当进入L1.2的条件已经满足,则:
1.upstream和downstream端口都必须监测CLKREQ#的逻辑状态;
2. upstream端口在进入L1.0前不能拉高CLKREQ#;
3. 允许任何端口将CLKREQ#拉低来阻止link进入L1.2;
4. 当CLKREQ#被拉高,端口进入L1.2.Entry.
L1 PM Substates Extended Capability
L1 PM子状态扩展Capability是一个可选的Capability,如果L1 Substates 是在一个端口上实现的,则需要这个Capability。