PCIe扫盲系列(五)
+ -

PCIe Power Management概述(一)

2024-06-27 533 0

PCIe总线定义的与功耗管理功能(Power Management,PM)相关的主要有:PCI-Compatible PM、Native PCIe Extensions、Bandwith Management和Event Timing Optimization。

其中,PCI-Compatible PM是一种在软件上和硬件上都与PCI-PM(定义在ACPI Spec中)兼容的模式,其要求PCIe设备的每个Function都包含PCI Power Management Capability寄存器。软件可以通过配置请求(Configuration Request)的方式来切换PCIe设备的某个Function的PM状态。在PCIe Spec V2.1中,还引入了动态功耗分配(Dynamic Power Allocation,DPA)的功能,具体请参考相关Spec,该模式并非本文介绍的重点。

本文介绍的重点为Native PCIe Extensions模式。该模式定义了一个基于硬件的,自发的链路功耗状态管理单元(Active State Power Management for the Link,ASPM),以及相关的唤醒机制(后面会详细讲)。PCIe设备之间通过功耗管理事件(Power Management Event,PME)来进行相互通信,并控制功耗状态的切换。而功耗管理事件(PME)本质上是一种Message。

在PCIe Spec V2.1中,还引入了带宽管理功能(前面的文章也提到过),这里就不详细介绍了,具体请参考相关的Spec。

此外,Event Timing Optimization主要是针对Native PCIe Extensions模式中的PME的时序优化和防死锁(Dead-Lock)等,本文也不再详细介绍,具体请参考Spec相关内容或者Mindshare的书籍的相关章节。

PCI Power Management Capability寄存器对于PCI总线来说是可选的,但是对于PCIe总线来说则是强制的。该寄存器位于PCI-Compatible的配置空间中,其Capability ID为01h。如下图所示:

120420383110

ACPI(Advanced Configuration and Power Interface) Spec主要定义的是操作系统层面上的PM,在ACPI指定之前,各个厂商的设备之间的PM兼容性很差,甚至是完全不兼容。而ACPI的出现,统一了操作系统层PM(即OSPM)的规范。OSPM的各个功耗状态定义如下:
120430598904

电源状态总结翻译

电源状态 描述
工作状态(G0/S0) 系统完全正常运行。
睡眠状态(G1) 系统看似已关闭,功耗已降低。恢复到“工作状态”所需的时间与所选择的省电级别成反比(省电越多,唤醒越慢)。
S1:缓存已刷新,CPU 暂停。
S2:与 S1 相同,但 CPU 已断电。不常用,因为相比 S3 优势不大。
S3(也称“挂起到内存”或“待机”):与 S2 相同,但系统上下文保存在内存中,且更多部件已关闭。唤醒时 CPU 执行完整启动流程,但会检查 CMOS 中的标志位,从而直接从内存恢复上下文,因此可快速恢复程序执行。
S4(也称“挂起到磁盘”或“休眠”):与 S3 类似,但系统将上下文复制到磁盘后,切断包括内存在内的所有电源。省电效果更好,但恢复时间更长,因为需从磁盘读取上下文。
软关机(G2/S5) 系统看似已关闭,功耗极低。由于内存内容已丢失,需完全重启才能恢复到“工作状态”,但仍保留部分电源以支持唤醒(如按下电源键)。
机械关机(G3) 系统已断开所有电源,完全无电。

该表格描述了 ACPI(高级配置与电源管理接口)标准中定义的几种系统电源状态,从完全运行(G0)到完全断电(G3),其中睡眠状态(G1)按省电程度和唤醒速度细分为 S1~S4,越往后越省电但唤醒越慢。软关机(G2)仍需少量待机电源,而机械关机(G3)则是完全断电状态。

同时,也定义了PCIe设备的PM状态:

120439413150

设备电源状态总结翻译

状态 描述
D0 设备已开启,以全功率运行,且完全正常工作。
D1 此状态为可选状态,仅定义为功耗低于 D0,但并不常用。
D2 此状态为可选状态,仅定义为功耗低于 D1,但并不常用。
D3 设备功耗降至最低,主电源可能被关闭。唯一要求是:在仍有供电的情况下,设备必须能够响应配置命令以重新进入 D0 状态。在此状态下,设备电源可以被完全移除,恢复供电时设备将经历一次硬件复位。

简要总结
该表格描述了 ACPI 标准中设备(如 PCI 设备)的电源状态分级,从 D0(全功率运行)到 D3(最低功耗)。D1 和 D2 是可选且不常用的中间状态,D3 是最终低功耗状态,支持断电,但恢复时需重新初始化。
下面来详细地介绍一下PCIe设备的各个PM状态。

D0

1、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的所有功能都是可操作的,即正常工作的状态。

具体如下表所示:
120450125715

注:链路PM状态即前面文章介绍的LTSSM中的状态,这里就不再回顾了。

D1

2、D1状态,又称为轻睡眠状态(Light Sleep)。该状态是可选的,具体如下表所示,这里就不详细介绍了:

120459870329

D2

3、D2状态,又称为深睡眠状态(Deep Sleep)。该状态也是可选的,具体如下表所示,这里就不详细介绍了:
120511106609

D3

4、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消息。

在进入D3状态之前,软件必须保证所有重要的Non-Posted的请求都收到了与之匹配的Completion。这可以通过配置空间中的设备状态寄存器的相关位来查询。如果由于目标PCIe设备故障,导致其长时间内无法接收到Completion,则软件必须要等待足够长的时间在执行进入D3的操作。当Function进入D3 Hot状态后,链路则会强制进入L1状态。此时Function的内容(寄存器中的数据等)将会丢失,但是PCIe设备必须要保证PME的相关内容不受影响,这样才能在D3 Hot状态下产生PME消息。

注:虽然是对PCIe设备的某一个Function进行的PM操作,但是PM操作会影响到电源状态和链路状态,进而影响到同一个设备的其他Function(如果是Multi-Function设备的话)。

当PCIe设备的电源(Vcc)被断开后,则自动从D3 Hot状态进入D3 Cold状态。在D3 Hot的情况下,软件可以向Function的PMCSR中的PowerState位置写入相关内容,使得Function从D3 Hot状态切换为D0未初始化状态。此后,可能还需要一次复位操作,才能使得该Function进入D0活动状态。

D3 Hot的相关信息如下表所示:
120521646681
当PCIe设备的电源被恢复后,则必须要进行一次复位操作,才能使得其从D3 Cold状态回到D0状态。相关信息如下表所示:
120529624574
PCIe设备PM的各个状态之间的切换关系,如下图所示:
120538984726
具体信息如下表所示:
120546215638
相连的两个PCIe设备之间的PM状态关系如下表所示:
120554115542
链路(Link)状态与PM的关系如下表所示:
12060240698

一个链路从L0进入L1状态的执行流程示意图如下:
120610734695

原文转自:http://blog.chinaaet.com/justlxy/p/5100061872

0 篇笔记 写笔记

关注公众号
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!