使用 GUID_D3COLD_SUPPORT_INTERFACE 驱动程序接口

从 Windows 8 开始,驱动程序可以调用 GUID_D3COLD_SUPPORT_INTERFACE 接口中的例程,以确定设备的 D3cold 功能并使这些设备能够使用 D3cold。 此接口中的两个主要例程是 SetD3ColdSupportGetIdleWakeInfo

GUID_D3COLD_SUPPORT_INTERFACE驱动程序接口支持 D3 设备电源状态的 D3cold 子状态。 D3 分为两个子状态:D3hot 和 D3cold。 D3 是最低功率的设备电源状态,D3cold 使用的功率低于 D3hot。 仅当设备、父总线驱动程序和平台固件支持此状态时,设备才能进入 D3cold。 当计算机处于 S0 (工作) 系统电源状态时,支持 D3cold 的设备可以进入和退出此状态。

设备的电源策略所有者 (PPO) 的驱动程序调用此接口中的例程来执行以下操作:

  • 了解设备、父总线驱动程序和平台固件支持是否转换为 D3cold 子状态。
  • 了解当设备处于 D3cold 子状态时,设备是否可以向处理器发出唤醒事件信号。
  • 启用和禁用设备到 D3cold 子状态的转换。

若要查询此接口,设备驱动程序会向驱动程序堆栈发送IRP_MN_QUERY_INTERFACE IRP。 对于此 IRP,驱动程序将 InterfaceType 输入参数设置为GUID_D3COLD_SUPPORT_INTERFACE。 成功完成 IRP 后,Interface 输出参数是指向 D3COLD_SUPPORT_INTERFACE 结构的指针。 此结构包含指向 接口中例程的指针。

有关 D3cold 设备电源状态的详细信息,请参阅 在驱动程序中支持 D3cold

驱动程序调用 SetD3ColdSupport 例程来动态启用和禁用设备到 D3cold 的转换,当计算机处于 S0 中时可能发生。 如果设备必须能够从设备进入的任何低功率 Dx 状态发出唤醒事件信号,则仅当设备可以从 D3cold 发出唤醒事件信号时,驱动程序才应允许设备进入 D3cold。 否则,在设备进入 D3cold 后,它可能不可用,直到计算机退出 S0 状态。

默认情况下,在首次调用 SetD3ColdSupport 例程之前,将禁用 D3hot 到 D3cold 的转换。 若要更改此默认值,以便在第一次 SetD3ColdSupport 调用之前启用 D3hot 到 D3cold 转换,设备的驱动程序包可以在安装驱动程序的 INF 文件的 DDInstall.HW 节中包含以下两行:

Include = machine.inf
Needs = PciD3ColdSupported

GetIdleWakeInfo 例程使设备的驱动程序能够发现设备电源状态,当计算机处于特定系统电源状态时,设备可以从该状态发出唤醒事件信号。 此例程的调用方将系统电源状态指定为输入参数,作为输出参数,例程报告最低功率设备电源状态,当计算机处于指定的系统电源状态时,设备可以从该状态发出等待事件信号。 例如, GetIdleWakeInfo 例程可以告诉驱动程序,当计算机处于 S0 中时,设备是否可以从 D3cold 发出唤醒事件信号。

GetIdleWakeInfo 例程提供的设备唤醒信息比IRP_MN_QUERY_CAPABILITIES请求提供的更完整。 此请求(所有版本的 Windows 都支持)提供描述设备功能的 DEVICE_CAPABILITIES 结构。 此结构的 DeviceWake 成员包含 GetIdleWakeInfo 例程中可用的信息的子集。 此成员指示设备可从中发出等待事件信号的最低功率设备电源状态。 仅当计算机处于由结构的 SystemWake 成员指示的系统低功耗状态时,才能保证此成员中的信息准确。 如果 SystemWake = PowerSystemSleeping3,则 已知 DeviceWake 中的信息对 S3 有效,可能经常对 S1 和 S2 有效,甚至可能对 S0 有效。

但是,作为最佳做法,驱动程序不应假定 DeviceWake 方法中的信息对于除 SystemWake 指示的状态以外的任何系统电源状态都有效。 对于某些设备,设备发出唤醒事件信号的最低 Dx 状态因计算机处于工作状态 S0 或处于低功耗状态 (S1、S2、S3 或 S4) 而异。 对于其他设备,当计算机处于 S0 中时,设备连接到的总线可以处理唤醒信号,但设备不能。 只有 GetIdleWakeInfo 例程才能准确描述这些设备的设备唤醒功能。

例如, PCI Express Base 3.0 规范 定义了两个单独的机制来发出唤醒事件信号:一种机制在打开 PCI Express 链路 (总线) 时使用,另一种机制在关闭链路时使用。 打开链接后,设备会发送PM_PME事务层数据包流 (TRP) ,以指示设备应从低功率 Dx 状态移动到 D0。 关闭链接后,设备会请求打开链接,以便设备可以发送PM_PME TRP。 若要请求打开链接,设备要么断言其 WAKE# 信号 (更常见的设备外形规格) ,要么使用“信标”机制 (不太常见的) 。

PCI Express 规范要求播发信号电源管理事件的能力 (D3cold) PME 的所有设备都实现这两种设备唤醒机制,但驱动程序开发人员可能需要启用未正确实现这些机制的设备。

如果设备可以在打开链接时正确传送PM_PME TRP,则驱动程序可以让设备在计算机处于 S0 时进入 D3hot。 如果设备可以正确断言其 WAKE# 信号以打开链接,然后使用PM_PME TRP 启动到 D0 的转换,则驱动程序可以在计算机处于 S0 中时允许设备进入 D3cold。

但是,如果系统固件 (BIOS) 无法保证硬件平台正确处理 PCI Express 设备唤醒机制,驱动程序不应允许设备进入 D3hot 或 D3cold。 驱动程序可以调用 GetIdleWakeInfo 例程来发现固件是否声明支持这些机制。 如果驱动程序使用 Kernel-Mode Driver Framework (KMDF) 1.11 或更高版本,则调用 GetIdleWakeInfo 的便捷替代方法是允许 WdfDeviceAssignS0IdleSettings 方法使设备在最低功率 Dx 状态下空闲,设备可以从该状态发出唤醒事件信号。