3. D3hot状态详解

D3hot是PCIe设备电源管理中的软关断(Soft-Off)状态,也是D3冷状态之前的最后一个软件可控电源状态。与D0(全功能)和D1/D2(中间省电状态)不同,D3hot的设计目标是在保持配置空间可访问的前提下,大幅降低设备功耗,同时允许软件通过PME(Power Management Event)机制将设备唤醒回D0状态。

核心要点: D3hot ≠ 完全断电。主电源(Vmain)仍然维持,但设备内部大部分功能逻辑时钟被关闭,仅保留PME唤醒逻辑和配置空间访问逻辑。

3.1 D3hot状态定义与特征

根据PCIe Base Specification Rev 5.0,D3hot状态具有以下关键特征:

特征维度 D3hot状态描述 与D0对比
主电源(Vmain) 保持供电 与D0相同
辅助电源(Vaux) 保持供电(如支持PME) 与D0相同
主时钟(CLK) 可停止或保持 D0必须保持
配置空间访问 完全可访问(读/写) 与D0相同
MMIO/BAR访问 不可访问(返回全F或触发Unsupported Request) D0可正常访问
PME唤醒能力 可选支持(由PM Capability控制) D0通常不启用PME
典型功耗 极低(微瓦级,仅维持唤醒逻辑) 全功能功耗
恢复延迟 需等待恢复时间(D3hot_to_D0延迟) 无延迟
驱动开发提示: 在D3hot状态下,驱动程序不能访问设备的MMIO空间或BAR映射寄存器。任何此类访问都会导致PCIe总线错误(Unsupported Request),可能触发系统错误处理甚至导致驱动崩溃。配置空间访问是安全的,但仅限于PM Capability、Power Management Control/Status Register(PMCSR)等电源管理相关寄存器。

3.2 D3hot进入条件

设备从D0进入D3hot需要满足以下条件,并由软件通过PCIe配置空间中的PMCSR寄存器触发:

  1. 软件触发: 驱动程序或ACPI固件向PMCSR寄存器的PowerState字段(bit[1:0])写入11b(D3hot编码)。
  2. 硬件准备: 设备完成所有正在处理的事务(包括Pending的Memory Write和Completion),确保数据一致性。
  3. No_Soft_Reset位检查: 如果PM Capability中的No_Soft_Reset位(bit[3])为1,设备在进入D3hot时不会复位内部状态;如果为0,设备会执行内部复位(类似硬复位)。
  4. PME_En位配置(可选): 如果设备需要在D3hot下支持PME唤醒,驱动程序必须在进入D3hot之前设置PMCSR的PME_En位(bit[8])为1。
  5. 链路状态协商: 设备可能将PCIe链路从L0(全速)切换到L1(省电)或L2(更深度省电),但链路必须保持电气连接。
常见陷阱: 许多网卡驱动在进入D3hot前忘记检查No_Soft_Reset位。如果该位为0,设备进入D3hot后内部寄存器会丢失,驱动在恢复时必须重新初始化整个设备,而不仅仅是恢复电源状态。务必在驱动suspend回调中区分这两种情况。
D3hot状态进入流程 D3hot状态进入流程 D0 全功能运行 驱动准备:停止DMA/中断 等待Pending事务完成 检查 No_Soft_Reset 位 决定是否保存寄存器上下文 写入 PMCSR.PowerState = 11b 触发硬件状态转换 D3hot 软关断 主电源保持 / 配置空间可访问 关键前提 • 设备必须支持D3hot • 驱动需保存必要上下文 • PME_En按需配置 转换后状态 • 主时钟可停止 • MMIO不可访问 • 配置空间可读/写 • PME唤醒逻辑待命

3.3 主电源保持与功耗特征

D3hot状态最显著的特征是主电源(Vmain)保持供电。这与D3cold(主电源完全切断)形成本质区别。主电源保持意味着:

  • 配置空间持续供电: 设备的PCIe配置空间(包括Vendor ID、Device ID、PM Capability、PMCSR等)仍然可以通过配置读写事务访问。
  • PME唤醒逻辑供电: 如果设备支持PME,其唤醒检测电路(如Magic Packet检测、Wake-on-LAN逻辑)由主电源或辅助电源供电,可以持续监控唤醒事件。
  • 内部状态保持(No_Soft_Reset=1时): 部分设备的内部寄存器状态在D3hot下保持,恢复时无需完全重初始化。
  • 链路电气特性: PCIe链路可能进入L1或L2省电状态,但物理层仍然保持电气连接,配置空间事务可以正常通过。
功耗对比: 典型10GbE网卡在D0状态功耗约8-15W,进入D3hot后功耗可降至10-50mW(仅维持唤醒逻辑和配置空间)。如果设备不支持PME,功耗可进一步降低至1-5mW。

3.4 配置空间可访问性详解

D3hot状态下配置空间的可访问性是驱动开发中最需要关注的技术细节。以下表格总结了不同访问类型的可用性:

访问类型 D3hot下是否可用 说明
配置空间读(CFG Read) ✅ 完全可用 可读取所有配置寄存器,包括PMCSR、PM Capability、Vendor ID等
配置空间写(CFG Write) ✅ 完全可用 可写入PMCSR触发状态转换,或修改PME_En等控制位
MMIO读/写 ❌ 不可用 返回全F(All F's)或触发Unsupported Request
I/O空间访问 ❌ 不可用 行为与MMIO类似,返回错误
MSI/MSI-X中断 ❌ 不可用 设备不会产生任何中断(PME是带外机制)
DMA操作 ❌ 不可用 设备不能发起任何Memory Write或Read请求
D3hot配置空间可访问性架构 D3hot状态:配置空间可访问性架构 PCIe设备内部 配置空间(Config Space) PMCSR | PM Capability | Vendor ID ✅ 读/写完全可访问 功能逻辑(Function Logic) MAC | DMA | 数据通路 ❌ 时钟关闭 / 不可访问 PME唤醒逻辑(可选) Magic Packet / Wake-on-LAN 检测 外部访问路径 配置读写事务(CFG TLP) 通过RC/交换机路由到设备 ✅ 允许 MMIO读写事务 访问BAR映射寄存器 ❌ 拒绝(返回全F) PME唤醒信号(带外) 通过WAKE#引脚或边带信号 ✅ 待命

3.5 D3hot与D3cold的关键区别

驱动开发中必须严格区分D3hot和D3cold,因为两者的恢复流程完全不同:

对比维度 D3hot(软关断) D3cold(硬关断)
主电源(Vmain) 保持供电 完全切断
配置空间 可访问 不可访问(需要复位后重新枚举)
设备上下文 可能保持(No_Soft_Reset=1) 全部丢失
恢复方式 写入PMCSR.PowerState=00b 需要重新供电 + 复位 + 枚举
恢复延迟 微秒到毫秒级 毫秒到秒级
PME唤醒 支持(可选) 需要辅助电源(Vaux)
驱动处理 suspend/resume回调 需要完整probe/remove流程
驱动最佳实践: 在suspend回调中,通过读取PMCSR的PowerState字段确认当前状态。如果设备已经处于D3hot(例如由BIOS或ACPI控制),驱动应避免重复写入D3hot编码,而是直接保存上下文并等待唤醒。在resume回调中,先读取PMCSR确认状态,再决定是执行快速恢复(D3hot→D0)还是完整重初始化(D3cold→D0)。

3.6 D3hot下的PME唤醒配置

D3hot状态支持PME唤醒是网卡驱动的核心需求。配置步骤如下:

  1. 确认设备支持: 读取PM Capability寄存器,检查PME_Support位(bit[15:11])是否包含D3hot位(bit[13])。如果为1,设备支持从D3hot唤醒。
  2. 配置唤醒事件: 在进入D3hot前,通过设备特定的MMIO寄存器配置唤醒条件(如Magic Packet、链路状态变化、WoL模式等)。
  3. 设置PME_En: 在PMCSR寄存器中设置PME_En位(bit[8])为1,使能PME消息生成。
  4. 进入D3hot: 写入PMCSR.PowerState=11b,设备进入D3hot并保持PME唤醒逻辑待命。
  5. 等待唤醒: 当唤醒事件发生时,设备通过PME消息(或WAKE#引脚)通知系统,系统将设备恢复到D0状态。
注意事项: PME_En位必须在进入D3hot之前设置。一旦设备进入D3hot,虽然配置空间可写,但部分设备可能限制PMCSR的写入。此外,PME唤醒后,驱动必须清除PME_Status位(bit[15])并重新配置设备,否则可能无法再次进入省电状态。

通过以上分析可以看出,D3hot状态是PCIe电源管理中最常用的省电状态,尤其适合网卡这类需要保持网络连接感知(如WoL)的设备。驱动开发者必须深入理解其配置空间可访问性、主电源保持特性以及PME唤醒机制,才能编写出高效、稳定的电源管理驱动。