GUID_D3COLD_SUPPORT_INTERFACE ドライバー インターフェイスの使用

Windows 8 以降では、ドライバーは、デバイスの D3cold 機能を決定し、これらのデバイスで D3cold を使用できるように、GUID_D3COLD_SUPPORT_INTERFACE インターフェイスのルーチンを呼び出すことができます。 このインターフェイスの 2 つの主要なルーチンは、SetD3ColdSupportGetIdleWakeInfo です。

GUID_D3COLD_SUPPORT_INTERFACE ドライバー インターフェイスは、D3 デバイスの電源状態の D3cold サブ状態をサポートします。 D3 は、D3hot と D3cold の 2 つのサブ状態に分かれています。 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 ルーチンを呼び出して、コンピューターが S0 の場合に発生する可能性がある D3cold へのデバイスの切り替えを動的に有効または無効にします。 デバイスが入いるどの低電力 Dx 状態からもウェイク イベントを通知できるようにする必要がある場合、ドライバーは、デバイスが D3cold からウェイク イベントを通知できる場合にのみ、デバイスが D3cold に入いることを有効にする必要があります。 それ以外の場合、デバイスが D3cold に入ると、コンピューターが S0 状態になるまで使用できなくなる可能性があります。

既定では、SetD3ColdSupport ルーチンの最初の呼び出しの前は、D3hot から D3cold への切り替えは無効です。 最初の SetD3ColdSupport 呼び出しの前に D3hot から D3cold への切り替えが有効になるようにこの既定値を変更するには、デバイスのドライバー パッケージは、ドライバーをインストールする INF ファイルの DDInstall.HW セクションに次の 2 行を含めることができます。

Include = machine.inf
Needs = PciD3ColdSupported

GetIdleWakeInfo ルーチンを使用すると、デバイスのドライバーは、コンピューターが特定のシステム電源状態にあるときに、デバイスがウェイク イベントを通知できるデバイスの電源状態を検出できます。 このルーチンの呼び出し元は、システム電源状態を入力パラメーターとして指定し、出力パラメーターとして、コンピューターが指定されたシステム電源状態のときにデバイスが待機イベントを通知できる、最も低い電力のデバイスの電源状態を報告します。 たとえば、GetIdleWakeInfo ルーチンは、コンピューターが S0 にあるときに、デバイスが D3cold からウェイク イベントを通知できるかどうかをドライバーに通知できます。

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 仕様では、ウェイク イベントを通知する 2 つの別個のメカニズムが定義されています。1 つのメカニズムは、PCI Express リンク (バス) がオンのときに使用され、もう 1 つはリンクがオフのときに使用されます。 リンクがオンになると、デバイスは PM_PME トランザクション 層パケット (TLP) のストリームを送信して、デバイスが低電力 Dx 状態から D0 に移行する必要があることを通知します。 リンクがオフの場合、デバイスは、デバイスが TLP PM_PME 送信できるように、リンクをオンにするように要求します。 リンクのオンを要求するために、デバイスは WAKE# 信号をアサートするか (より一般的なデバイス フォーム ファクター用)、または "ビーコン" メカニズム (あまり一般的ではない) を使用します。

PCI Express 仕様では、D3cold から電源管理イベント (PMEs) を通知する機能をアドバタイズするすべてのデバイスに、これらのデバイス ウェイク メカニズムの両方が実装されている必要がありますが、ドライバー開発者は、これらのメカニズムを正しく実装していないデバイスを有効にする必要がある場合があります。

デバイスがリンクをオンにしたときに、PM_PME TLP を正しく配信できる場合、ドライバーは、コンピューターが S0 にあるときに D3hot を入力するデバイスを有効にすることができます。 デバイスが WAKE# 信号を正しくアサートしてリンクをオンにしてから、PM_PME TLP を使用して D0 への移行を開始できる場合、ドライバーは、コンピューターが S0 の場合に D3cold を入力するようにデバイスを有効にすることができます。

ただし、システム ファームウェア (BIOS) が PCI Express デバイス ウェイク メカニズムがハードウェア プラットフォームによって正しく処理されることを保証できない場合、ドライバーはデバイスが D3hot または D3cold を入力できるようにしないでください。 ドライバーは、GetIdleWakeInfo ルーチンを呼び出して、ファームウェアがこれらのメカニズムをサポートしているかどうかを検出できます。 ドライバーがカーネル モード ドライバー フレームワーク (KMDF) 1.11 以降を使用する場合は、GetIdleWakeInfo を呼び出す便利な代替手段として、WdfDeviceAssignS0IdleSettings メソッドを使用して、デバイスがウェイク イベントを通知できる最も低い電源の Dx 状態でデバイスをアイドル状態にすることです。