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


Общие сведения о платформе управления управляемыми питанием

Начиная с 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_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 не будет направлять его на резервное копирование.

См. также