Использование интерфейса драйвера GUID_D3COLD_SUPPORT_INTERFACE
Начиная с Windows 8, драйверы могут вызывать подпрограммы в интерфейсе GUID_D3COLD_SUPPORT_INTERFACE, чтобы определить возможности D3cold устройств и разрешить этим устройствам использовать D3cold. Двумя основными подпрограммами в этом интерфейсе являются SetD3ColdSupport и GetIdleWakeInfo.
Интерфейс драйвера GUID_D3COLD_SUPPORT_INTERFACE обеспечивает поддержку подсостояния D3cold состояния питания устройства D3. D3 делится на два подсостояния: D3hot и D3cold. D3 — это состояние питания устройства с самым низким энергопотреблением, и D3cold использует меньше энергии, чем D3hot. Устройство может войти в D3cold только в том случае, если устройство, драйвер родительской шины и встроенное ПО платформы поддерживают это состояние. Устройство, поддерживающее D3cold, может войти в это состояние и выйти из этого состояния, когда компьютер находится в состоянии питания системы S0 (рабочий).
Драйвер, который является владельцем политики питания (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 отключены. Чтобы изменить это значение по умолчанию так, чтобы переходы D3hot на D3cold были включены перед первым вызовом SetD3ColdSupport , пакет драйвера для устройства может включать следующие две строки в разделе DDInstall.HW INF-файла, устанавливающего драйвер:
Include = machine.inf
Needs = PciD3ColdSupported
Подпрограмма GetIdleWakeInfo позволяет драйверу устройства обнаруживать состояния питания устройства, из которых устройство может сигнализировать о событии пробуждения, когда компьютер находится в определенном состоянии питания системы. Вызывающий эту подпрограмму указывает состояние питания системы в качестве входного параметра, а в качестве выходного параметра подпрограмма сообщает состояние питания устройства с наименьшим энергопотреблением, из которого устройство может сигнализировать о событии ожидания, когда компьютер находится в указанном состоянии питания системы. Например, подпрограмма GetIdleWakeInfo может сообщить драйверу, может ли устройство сигнализировать о событии пробуждения от D3cold, когда компьютер находится в S0.
Подпрограмма 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 пакетов уровня транзакций (TLP), чтобы сообщить о том, что устройство должно перейти из состояния Dx с низким энергопотреблением на D0. Если связь отключена, устройство запрашивает включение этой связи, чтобы устройство яировало для отправки PM_PME TLP. Чтобы запросить включение ссылки, устройство либо подтверждает свой сигнал WAKE# (для более распространенного форм-фактора устройства), либо использует механизм маяка (менее распространенный).
Спецификация PCI Express требует, чтобы все устройства, которые объявляют возможность сигнализировать события управления питанием (PMEs) из D3cold, реализовали оба этих механизма пробуждения устройства, но разработчику драйвера может потребоваться включить устройство, которое неправильно реализует эти механизмы.
Если устройство может правильно доставить PM_PME TLP при включении связи, драйвер может разрешить устройству войти в D3hot, когда компьютер находится в S0. Если устройство может правильно подтвердить свой сигнал WAKE#, чтобы включить ссылку, а затем использовать PM_PME TLP для инициации перехода на D0, драйвер может разрешить устройству войти в D3cold, когда компьютер находится в S0.
Однако драйвер не должен разрешать устройству входить в D3hot или D3cold, если встроенное ПО системы (BIOS) не может гарантировать, что механизмы пробуждения устройства PCI Express правильно обрабатываются аппаратной платформой. Драйвер может вызвать подпрограмму GetIdleWakeInfo , чтобы определить, поддерживает ли встроенное ПО эти механизмы. Если драйвер использует Kernel-Mode Driver Framework (KMDF) 1.11 или более поздней версии, удобная альтернатива вызову GetIdleWakeInfo заключается в том, чтобы разрешить методу WdfDeviceAssignS0IdleSettings разрешить устройству бездействовать в состоянии Dx с наименьшей мощностью, из которого устройство может сигнализировать о событии пробуждения.