指示電源管理フレームワークの概要

Windows 10 バージョン 1903 以降では、ランタイム電源管理フレームワーク (PoFx) のバージョン 3 により、オプションの指示電源モデルである Directed PoFx (DFx) が提供されます。

DFx を使用すると、システムがアイドル状態に移行していて、アクティベーターが仲介するソフトウェア アクティビティがないときに、適切な低電力アイドル状態に移行するようにオペレーティング システムがデバイス スタックに指示するため、システムがより確実に低電力状態に移行できるようになります。

目的は、システムの電力効率を高め、あらゆるフォーム ファクターの Windows デバイスでエネルギー消費量を削減することです。

DFx は現在、D 状態制約のあるデバイスのみでサポートされています。 DFx では、F 状態制約のあるデバイス サブツリーがスキップされます。

DFx では、ページングまたはデバッグ デバイスの電源は切断されません。

WDF (非ミニポート) ドライバーの要件

電源ポリシー所有者である WDF ドライバーは、WDF_DEVICE_POWER_POLICY_IDLE_Standard Edition TTINGS 構造体で SystemManagedIdleTimeout または SystemManagedIdleTimeoutWithHint を指定して、適切な S0 アイドル ポリシーを実装する必要があります。 これにより、デバイスはアイドル時に電源をオフにすることができます。 追加の回復性対策として、ドライバーは、INF の DDInstall.HW セクション内にある AddReg ディレクティブ セクションに次のレジストリ キーを追加することで、DFx をオプトインできます。

HKR,"WDF","WdfDirectedPowerTransitionEnable",0x00010001,1

バージョン 31 以降を対象とする WDF ドライバーでは、既定で DFx が有効になります。 これが望ましくない場合は、ドライバーのレジストリ キーを 0 に設定することで DFx をオプトアウトできます。

HKR,"WDF","WdfDirectedPowerTransitionEnable",0x00010001,0

バージョン 33 以降を対象とする WDF ドライバーは、WDF_POWER_FRAMEWORK_SETTINGS 構造体の DirectedPoFxEnabled メンバーを WdfFalse に設定することで DFx をオプトアウトすることもできます。

ヒント

WDF_POWER_FRAMEWORK_SETTINGS 構造体を初期化するには、ドライバーが WDF_POWER_FRAMEWORK_SETTINGS_INIT を呼び出す必要があります。

システム管理のアイドル タイムアウトを要求すると、ドライバーに代わって WDF が PoFx に登録されるため、このシナリオではドライバーが PoFx に登録する必要はありません。

ドライバーで DriverManagedIdleTimeout が指定されている場合は、システム管理のアイドル タイムアウトに切り替えることを検討してください。 それが可能でない場合は、下の WDM セクションのガイドラインを使用して DFx をオプトインします。

WDF ドライバーでランタイム電源管理が使用されていない場合は、対応するサポートを追加し、システム管理のアイドル タイムアウトを使用します。 これを行うには、WdfDeviceAssignS0IdleSettings への入力として WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 構造体を提供します。

WDM (非ミニポート) ドライバーの要件

WDF によって提供されるシステム管理のアイドル サポートをドライバーで使用していない (ドライバー管理のアイドルを使用する WDF ドライバーか、WDM ドライバー) の場合も、PoFx にドライバーを登録することで DFx サポートを取得できます。 このシナリオでは、ドライバーは以下を実装することで PoFx に登録します。

PoFxRegisterDevice 関数への入力である PO_FX_DEVICE_V3 構造体で、これらのコールバックへのポインターを指定します。

ドライバーが DFx のサポートを受けるには、以下が必要になります。

  • PoFx に登録するときに PO_FX_DIRECTED_POWER* コールバックを指定する
  • アイドル状態から復帰する際に、PO_FX_DIRECTED_POWER_UP_CALLBACK コールバック関数から PoFxReportDevicePoweredOn を呼び出す。 WDF ドライバーの場合は、フラグを設定し、EvtDeviceD0Entry でフラグを確認して、PoFxReportDevicePoweredOn を呼び出すことができます。
  • Sx 遷移からの再開時に PoFxReportDevicePoweredOn を呼び出す。 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 のサードパーティ製ミニポートは、PoFx に登録し、INF に KsDFxSupportEnable レジストリ キーを追加することで、DFx および関連する HLK にオプトインできます。

ドライバーは、このセクションで説明されている実装を使用して、自身を PoFx に登録できます。 さらに、次の行を AddReg ディレクティブ セクションに追加する必要があります。

HKR, , KSDFxSupportEnable, 0x00010001, 1

AddReg セクションは、デバイスの [DDInstall.HW] セクションまたはドライバーの [service-install-section] によって呼び出すことができます。 [DDInstall.HW] セクションに追加した場合、変更されるのは、そのデバイスのみです。 これは、異なる VID/PID の組み合わせに同じドライバーを使用し、特定のデバイスに対してのみ DFx を有効にする必要がある場合に便利です。

[service-install-section] に AddReg セクションを追加した場合は、そのドライバーを使用するすべてのデバイスに対して DFx がオプトインされます。

テスト

Microsoft は、DFx 用のテストとして、ユーザー指定デバイスのテストを目的として Windows Driver Kit に含まれている単一デバイス テスト、デバイス レベルの HLK テスト、システム上のすべてのデバイスのテストを目的としたシステム レベルの HLK テストの 3 つを提供しています。

単一デバイス テストは、WDK に付属する PwrTest ツールの一部として提供されます。 これにアクセスするには、/directedfx スイッチを使用してツールを実行します。 詳細については、「PwrTest DirectedFx シナリオ」を参照してください。

HLK テストの詳細については、以下のページを参照してください。

S4 からの再開後にドライバーが PoFxReportDevicePoweredOn を正しく呼び出していない可能性があるため、そのようなケースを検出するために、S4 移行後に DFx をテストすることをお勧めします。

DFx と S 状態遷移

  • DFx 遷移の対象となる D 状態は、ランタイム D3 (RTD3) の対象と一致する必要がありますが、S3/S4 遷移の対象となる D 状態とは異なる場合があります。 デバイスが RTD3 で D2 に移行し、S3/S4 で D3 に移行するシナリオを考えてみましょう。 この場合、DFx の対象となる D 状態は D2 である必要があります。
  • 同様に、DFx のウェイク準備 (arm for wake) 動作は RTD3 の動作と一致する必要がありますが、S3/S4 遷移で使用される動作とは異なる場合があります。 たとえば、デバイスは RTD3 で D2/ウェイク準備状態に移行し、S3/S4 で D3/非ウェイク準備状態に移行する可能性があります。 このシナリオでは、DFx 遷移も D2/ウェイク準備に移行する必要があります。

DFx とランタイム D3 (RTD3)

  • RTD3 の場合、デバイスは通常、アイドル状態になるとさらに低電力の D 状態に移行します。 新しい作業が到着すると、デバイスはすぐに D0 に復帰します。 DFx の場合、デバイスは、デバイスに電源を入れるよう PoFx から指示されるまで、対象となる D 状態を維持する (および、キュー上の新しい作業を保留する) 必要があります。

参照