pcie D3 cold
从 Windows 8 开始,设备可以进入 D3cold 电源子状态,即使当系统处于 S0 电源状态。
PCI 总线规范引入了 PCI 电源管理,因此它已将 D3(关)设备电源状态拆分为两个子状态:D3hot 和 D3cold。这种区分已添加到ACPI 3.0 中的 ACPI 规范,并在 ACPI 4.0 中扩展。
Windows 始终支持这两个 D3 子状态,但仅当整个计算机退出S0(工作)系统电源状态进入睡眠或休眠状态(通常 S3 或 S4)时,Windows 7 及早期版本的 Windows 才支持 D3cold子状态。
从 Windows 8 开始,即使当系统保持为 S0 状态时,设备驱动程序可以允许其设备进入 D3cold 状态。
D3hot(通常只称作“D3”)是设备的“软关闭”状态。在此状态下,总线扫描可以检测到设备,并且发送给设备的命令可能会导致它再次打开电源。
在D3cold 中,将切断所有电源,只保留少量电源以驱动设备的唤醒逻辑。例如,对于 PCI Express (PCIe) 设备,转换到D3cold 后,经常关闭主要设备电源 Vcc。关闭 Vcc 可减少耗电量,并延长移动硬件平台在一定的电池电量下可运行的时间。
当设备处在D3cold 时,总线扫描将无法检测到该设备,并且该设备不能接收命令。恢复 Vcc 电源会将设备置于未初始化状态,通常相当于 D0状态。然后,软件必须重新初始化该设备以将其置于工作状态。
将设备置于 D3cold 并不意味着已切断供给设备的所有电源 — 它仅表示切断了主电源 Vcc。如果唤醒逻辑不需要辅助电源Vaux,也可能会将其切断。但是,可能需要将唤醒事件通知给处理器的设备必须能够获取足够电源,以便操作唤醒逻辑。例如,切断其主电源的以太网接口卡(NIC) 可能从以太网电缆获取足够电源。
或者,供给 Wi-Fi NIC 的待机电源可能从 PCIe接口之外的电源提供,在这种情况下,可能会完全关闭 PCIe 接口。
所有设备都需要支持D0和D3(both D3hot & D3cold)。
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消息。
如何进D3 cold?
在D3 Hot状态下,当PCIe设备的电源(Vcc)被断开后,则自动从D3 Hot状态进入D3 Cold状态。退出D3 Cold状态可以使用CLKREQ#或PERST#信号或Beacon信号或WAKE#信号。此后,可能还需要一次复位操作,才能使得该Function进入D0活动状态。
配置pcie power status pmcap设置为D3,即可进入D3 hot状态。在D3 Hot的情况下,软件可以向Function的PMCSR中的PowerState位置(与前面的pcie power status pmcap应该是一个意思)写入相关内容,使得Function从D3 Hot状态切换为D0未初始化状态。
如下图为D状态转换
附:PCIe总线定义的与功耗管理功能
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。如下图所示:
ACPI(Advanced Configuration and Power Interface) Spec主要定义的是操作系统层面上的PM,在ACPI指定之前,各个厂商的设备之间的PM兼容性很差,甚至是完全不兼容。而ACPI的出现,统一了操作系统层PM(即OSPM)的规范。OSPM的各个功耗状态定义如下: