Поделиться через


Использование интерфейса драйвера 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 выходной параметр интерфейса является указателем на структуру D3COLD_SUPPORT_INTERFACE. Эта структура содержит указатели на подпрограммы в интерфейсе.

Дополнительные сведения о состоянии питания устройства D3cold см. в разделе "Поддержка D3cold" в драйвере.

Драйвер вызывает подпрограмму SetD3ColdSupport для динамического включения и отключения переходов устройства на D3cold, которые могут возникать при подключении компьютера к S0. Если устройство должно сигнализировать о событии пробуждения из любого состояния dx с низкой мощностью, которое входит устройство, драйвер должен включить устройство в D3cold только в том случае, если устройство может сигнализировать о событиях пробуждения от D3cold. В противном случае после ввода устройства D3cold он может быть недоступен, пока компьютер не покидает состояние S0.

По умолчанию перед первым вызовом процедуры SetD3ColdSupport переходы D3hot-to-D3cold отключены. Чтобы изменить это значение по умолчанию, чтобы переходы D3hot-to-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 = , сведения в DeviceWake, как известно, являются допустимыми для S3, часто могут быть допустимыми для S1 и S2 и даже могут быть допустимыми для S0.

Однако в качестве рекомендации драйвер не должен предполагать, что сведения в методе DeviceWake допустимы для любого состояния питания системы, отличного от состояния, указанного SystemWake. Для некоторых устройств наименьшее состояние Dx, из которого устройство может сигнализировать о событии пробуждения, зависит от того, находится ли компьютер в рабочем состоянии S0 или в состоянии низкой мощности (S1, S2, S3 или S4). Для других устройств автобусы, к которым подключены устройства, могут обрабатывать сигналы пробуждения, когда компьютер находится в S0, но устройства не могут. Только подпрограмма GetIdleWakeInfo может точно описать возможности пробуждения этих устройств.

Например, спецификация PCI Express Base 3.0 определяет два отдельных механизма для сигнала о событиях пробуждения— один механизм используется при включении канала PCI Express (шина), а другой используется при отключении связи. Если ссылка включена, устройство отправляет поток пакетов уровня транзакций PM_PME (TLPs), чтобы сообщить, что устройство должно переходить от состояния Dx с низкой мощностью к D0. Если ссылка отключена, устройство запрашивает, чтобы ссылка была включена, чтобы устройство могли отправлять PM_PME TLP. Чтобы запросить включение ссылки, устройство либо утверждает свой сигнал WAKE# (для более распространенного форм-фактора устройства) или использует механизм маяков (менее распространенный).

Спецификация PCI Express требует, чтобы все устройства, сигнализирующие о возможности управления питанием (PMEs) из D3cold, реализуют оба из этих механизма пробуждения устройств, но разработчику драйвера может потребоваться активировать устройство, которое неправильно реализует эти механизмы.

Если устройство может корректно передавать PM_PME TLPs, когда соединение активно, драйвер может разрешить устройству перейти в D3hot, если компьютер находится в состоянии S0. Если устройство может правильно задействовать сигнал WAKE#, чтобы активировать соединение, а затем использовать PM_PME TLPs для перехода на D0, драйвер может разрешить устройству перейти в состояние D3cold, когда компьютер находится в S0.

Однако драйвер не должен переводить устройство в состояния D3hot или D3cold, если системное встроенное ПО (BIOS) не может гарантировать корректную обработку механизмов пробуждения устройств PCI Express аппаратной платформой. Драйвер может вызвать подпрограмму GetIdleWakeInfo , чтобы определить, поддерживает ли встроенное ПО поддержку этих механизмов. Если драйвер использует Kernel-Mode Driver Framework (KMDF) 1.11 или более поздней версии, удобная альтернатива вызову GetIdleWakeInfo — разрешить метод WdfDeviceAssignS0IdleSettings , чтобы позволить устройству бездействовать в состоянии dx с наименьшей мощностью, из которого устройство может сигнализировать о событии пробуждения.