Общие сведения о платформе управления управляемыми питанием
Начиная с Windows 10 версии 1903, версия 3 платформы управления питанием во время выполнения (PoFx) предоставляет необязательную модель управления питанием, направленную PoFx (DFx).
При использовании DFx операционная система направляет стеки устройств, чтобы ввести соответствующие состояния простоя с низкой мощностью при переходе системы на простой, и нет активности программного обеспечения с брокером активатора и таким образом позволяет системе ввести низкую мощность более надежно.
Цель состоит в том, чтобы сделать системы более эффективными и сократить потребление энергии для устройств Windows на разных форм-факторах.
В настоящее время DFx поддерживается только для устройств с ограничениями состояния D. DFx пропускает любую поддереву устройства с ограничением состояния F.
DFx не выполняет переключение на разбиение по страницам или отладочные устройства.
Требования к драйверам WDF (не минипорта)
Драйвер WDF, который является владельцем политики питания, должен реализовать соответствующую политику S0-Idle, указав SystemManagedIdleTimeout или SystemManagedIdleTimeoutWithHint в структуре WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS . Это позволит устройству отключать время простоя. В качестве добавленной меры устойчивости драйвер может принять участие в DFx, добавив следующий раздел реестра в раздел директивы AddReg INF в разделе DDInstall.HW:
HKR,"WDF","WdfDirectedPowerTransitionEnable",0x00010001,1
Драйвер WDF, предназначенный для версии 31 и выше, включает DFx по умолчанию. Если это нежелательно, драйвер может отказаться от DFx, задав раздел реестра значение 0:
HKR,"WDF","WdfDirectedPowerTransitionEnable",0x00010001,0
Драйвер WDF, предназначенный для версии 33 и выше, может также отказаться от DFx, задав элемент DirectedPoFxEnabled структуры WDF_POWER_FRAMEWORK_SETTINGS для WdfFalse.
Совет
Чтобы инициализировать свою структуру WDF_POWER_FRAMEWORK_SETTINGS, драйвер должен вызвать WDF_POWER_FRAMEWORK_SETTINGS_INIT.
Так как запрос времени ожидания бездействия, управляемого системой, вызывает регистрацию WDF в PoFx от имени драйвера, драйвер не должен зарегистрировать в PoFx в этом сценарии.
Если драйвер указывает DriverManagedIdleTimeout, попробуйте переключиться на время ожидания простоя, управляемого системой. Если это невозможно, воспользуйтесь рекомендациями в разделе WDM ниже, чтобы принять участие в DFx.
Если драйвер WDF не использует управление питанием среды выполнения, добавьте поддержку и используйте время ожидания простоя, управляемого системой. Для этого предоставьте WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS структуру в качестве входных данных wdfDeviceAssignS0Idle Параметры.
Требования к драйверам WDM (не минипорта)
Если драйвер не использует поддержку бездействия, управляемого системой (драйвер является драйвером WDF с помощью драйвера, управляемого драйвером, или драйвером WDM), он по-прежнему может получить поддержку DFx, зарегистрируя себя в PoFx. В этом сценарии драйвер регистрируется в PoFx путем реализации:
- функция обратного вызова PO_FX_DIRECTED_POWER_DOWN_CALLBACK
- функция обратного вызова PO_FX_DIRECTED_POWER_UP_CALLBACK
Укажите указатели на эти обратные вызовы в PO_FX_DEVICE_V3 структуре, входной в функцию PoFxRegisterDevice.
Чтобы получить поддержку DFx, драйвер должен:
PO_FX_DIRECTED_POWER*
Предоставление обратных вызовов при регистрации для PoFx- Вызов PoFxReportDevicePoweredOn из функции обратного вызова PO_FX_DIRECTED_POWER_UP_CALLBACK при возврате из простоя. Если это драйвер WDF, он может задать флаг, а затем в EvtDeviceD0Entry проверка флаг и вызвать PoFxReportDevicePoweredOn.
- Вызов PoFxReportDevicePoweredOn в возобновлении перехода Sx. Если это драйвер WDF, необходимо предварительно обработать IRP_MN_SET_POWER. Обратный вызов предварительной обработки должен продолжаться только в том случае
Parameters.Power.Type == SystemPowerState
. Так как устройство может оставаться в состоянии Dx для всего цикла спящего и возобновления, приведенный выше подход проверка флага в EvtDeviceD0Entry не будет работать. Вместо этого функция обратного вызова события EvtDeviceWdmIrpPreprocess должна вызывать IoSetCompletionRoutine, чтобы задать подпрограмму IoCompletion и из подпрограммы завершения вызова PoFxReportDevicePoweredOn.
Пример
В следующем примере показан вариант самостоятельной регистрации, описанный выше:
PO_FX_DEVICE_V3 MyPoFxDevice;
POHANDLE MyPoFxHandle;
RtlZeroMemory(&MyPoFxDevice, sizeof(PO_FX_DEVICE_V3));
MyPoFxDevice.Version = PO_FX_VERSION_V3;
// Initialize other PoFx callbacks and other fields like
// components and their idle states.
MyPoFxDevice.DirectedPowerUpCallback = <Driver's DFx power up callback>
MyPoFxDevice.DirectedPowerDownCallback = <Driver's DFx power down callback>
Status = PoFxRegisterDevice(
<Driver's device object>,
(PPO_FX_DEVICE)&MyPoFxDevice,
&MyPoFxHandle);
if (!NT_SUCCESS(Status)) {
return Status;
}
Если драйвер указан PO_FX_VERSION_V1
ранее, обратите внимание, что PO_FX_DEVICE_V3
структуры используются PO_FX_COMPONENT_V2
для структуры массива компонентов.
Требования к драйверам минипорта
Для классов устройств, которые соответствуют модели драйвера порта или минипорта, драйверы портов, предоставляемые системой, обычно обрабатывают владение политикой питания. Большинство мини-портов, как ожидается, не требуют каких-либо изменений кода для участия в DFx, так как соответствующий драйвер порта, как ожидается, будет обрабатывать поддержку DFx.
Руководство по минипортам сторонних производителей KS.sys
Начиная с Windows 10 версии 2004 (также известной как 20H1 или сборка 19041), KS.sys отказаться от DFx и связанных требований HLK по умолчанию. Сторонние мини-порты KS.sys могут принять участие в DFx и связанном HLK путем регистрации в PoFx и добавления раздела реестра KsDFxSupportEnable в INF.
Драйвер может зарегистрировать себя в PoFx с помощью упоминание реализации, указанной в этом разделе. Кроме того, в разделе директивы AddReg необходимо добавить следующую строку.
HKR, , KSDFxSupportEnable, 0x00010001, 1
Раздел AddReg можно вызвать с помощью раздела [DDInstall.HW] устройства или драйвера [service-install-section]. Добавление его в раздел [DDInstall.HW] изменяет только это конкретное устройство. Это полезно, если один и тот же драйвер используется для различных сочетаний VID/PID, но DFx необходимо включить только для конкретного устройства.
Добавление раздела AddReg в разделе [service-install-section] opts-in DFx для всех устройств с помощью этого драйвера.
Тестирование
Корпорация Майкрософт предоставляет три теста для DFx: тест с одним устройством в комплекте драйверов Windows, предназначенный для тестирования пользовательских устройств, теста HLK на уровне устройства и теста HLK на уровне системы, предназначенного для тестирования всех устройств в системе.
Тест с одним устройством доступен в рамках средства PwrTest , который поставляется с WDK. Чтобы получить к нему доступ, запустите средство с /directedfx
помощью переключателя. Дополнительные сведения см. в разделе "Сценарий PwrTest DirectedFx".
Сведения о тестах HLK см. на следующих страницах:
Тестирование DFx после перехода S4 рекомендуется для перехвата любых случаев, когда драйвер может не правильно вызывать PoFxReportDevicePoweredOn после возобновления работы с S4.
Переходы DFx и S-state
- Целевое состояние D для переходов DFx должно соответствовать тому, что для среды выполнения D3 (RTD3), которое может отличаться от целевого состояния D для переходов S3/S4. Рассмотрим сценарий, в котором устройство вводит D2 для RTD3, но вводит D3 для S3/S4. В этом случае целевое состояние D для DFx должно быть D2.
- Аналогичным образом поведение arm-for-wake для DFx должно соответствовать тому, что для RTD3, которое может отличаться от того, что используется в переходах S3/S4. Например, устройство может ввести D2/wake-вооруженный для RTD3, но ввести D3/no-wake-вооруженный для S3/S4. В этом сценарии переходы DFx также должны входить в D2/wake-вооруженные.
DFx и среда выполнения D3 (RTD3)
- При использовании RTD3 устройство обычно входит в более низкое состояние D-состояния при простое. При поступлении новой работы устройство немедленно просыпается до D0. При использовании DFx устройство должно продолжать оставаться в целевом состоянии D (и заставить новую работу в очередях), пока PoFx не будет направлять его на резервное копирование.
См. также
- Управление питанием
- Подготовка оборудования к современному резервному режиму
- PwrTest
- структура PO_FX_DEVICE_V3
- функция обратного вызова PO_FX_DIRECTED_POWER_DOWN_CALLBACK
- функция обратного вызова PO_FX_DIRECTED_POWER_UP_CALLBACK
- Функция PoFxCompleteDirectedPowerDown
- Сценарий PwrTest DirectedFx
- Направленная проверка одного устройства FX
- Тестирование проверки системы FX