PCIe扫盲——Power Management概述(一)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

PCIe扫盲——Power Management概述(一)

 

 

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。如下图所示:

image.png

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

image.png

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

image.png

下面来详细地介绍一下PCIe设备的各个PM状态。

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

具体如下表所示:

image.png

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

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

图片[5]-PCIe扫盲——Power Management概述(一)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug图片[5]-PCIe扫盲——Power Management概述(一)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug图片[5]-PCIe扫盲——Power Management概述(一)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebugimage.png

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

image.png

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的相关信息如下表所示:

image.png

当PCIe设备的电源被恢复后,则必须要进行一次复位操作,才能使得其从D3 Cold状态回到D0状态。相关信息如下表所示:

image.png

PCIe设备PM的各个状态之间的切换关系,如下图所示:

image.png

具体信息如下表所示:

image.png

相连的两个PCIe设备之间的PM状态关系如下表所示:

image.png

链路(Link)状态与PM的关系如下表所示:

image.png

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

image.png图片[5]-PCIe扫盲——Power Management概述(一)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug图片[5]-PCIe扫盲——Power Management概述(一)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug图片[5]-PCIe扫盲——Power Management概述(一)-FPGA CPLD资料源码分享社区-FPGA CPLD-ChipDebug

 

请登录后发表评论

    没有回复内容