次の方法で共有


D3cold のファームウェア要件

Windows 8 以降では、システムが S0 電源状態の場合でも、デバイスは D3cold 電源サブ状態に入ることができます。 このトピックでは、埋め込みデバイスの D3cold サポートを実装するためのファームウェア要件について説明します。 次の説明は、ファームウェア開発者が埋め込みデバイスで D3cold に確実なアクセスと終了が行なえるようにすることを目的としています。

さらに、D3cold をサポートするためのデバイス ドライバの要件について簡単に説明します。 D3cold のデバイス ドライバのサポートについて詳しくは、「ドライバにおける D3cold のサポート」を参照してください。

はじめに

デバイスの電源状態 は、ACPI 仕様とさまざまなバス仕様で定義されています。 PCI バス仕様では、PCI 電源管理が導入されてから、D3 (オフ) デバイスの電源状態が D3hot と D3cold の 2 つのサブ状態に分割されています。 この区別は、ACPI 3.0 の ACPI 仕様に追加され、ACPI 4.0 で拡張されました。 Windows では常に両方の D3 サブ状態がサポートされていますが、Windows 7 以前のバージョンの Windows では、マシン全体が S0 (稼働中) システムの電源状態を終了してスリープ状態または休止状態 (通常は S3 または S4) に入った場合にのみ、D3cold サブ状態がサポートされます。 Windows 8 以降、デバイス ドライバは、システムが S0 のままであっても、デバイスを D3cold 状態にすることができます。

D3hot (単に「D3」と呼ばれることが多い)はデバイスの「ソフト オフ」状態です。 この状態では、デバイスはバス スキャンによって検出され、デバイスに送信されたコマンドによって再び電源をオンにできます。 D3cold では、デバイスのウェイク ロジックを駆動するための少量の電源を除いたすべての電源が停止します。 たとえば、PCI Express (PCIe) デバイスの場合、メイン デバイスの電源であるVcc は、D3cold への移行時はよくオフになります。 Vcc をオフにすることで、消費電力を削減し、モバイルハードウェアプラットフォームがバッテリ充電で実行できる時間を延長できます。 デバイスが D3cold 状態の場合、バス スキャンでは検出できず、コマンドを受信できません。 Vcc 電源を復元すると、デバイスは初期化されていない状態になります。これは通常、D0 状態と同等です。 続いて、ソフトウェアはデバイスを再初期化して動作状態にする必要があります。

デバイスを D3cold にすることで必ずしもデバイスのすべての電源が停止するとは限りません。つまり、メイン電源の Vcc のみが停止します。 補助電源の Vaux も、ウェイク ロジックに必要ない場合は停止することがあります。 ただし、ウェイク イベントをプロセッサに通知するために必要なデバイスは、ウェイク ロジックを動作するのに十分な電力を引き出せることが必要です。 たとえば、メイン電源が停止しているイーサネット ネットワーク インターフェイス カード (NIC) は、イーサネット ケーブルから十分な電力を引き出すことができます。 または、WI-Fi NIC へのスタンバイ電源が PCIe インターフェイスの外部のソースから供給される場合があります。この場合、PCIe インターフェイスを完全にオフにすることができます。

次の説明では、デバイスの電源状態を D3cold に移行できるようにするための一連の要件について説明します。 これらの要件は、2 つのカテゴリに分類されます。

  • ファームウェアとプラットフォーム要件

  • デバイス ドライバーの要件

これら 2 つのカテゴリの 1 つ目は、この説明で特に注目する点です。 2 番目のカテゴリには簡単な概要を示します。 デバイス ドライバ要件の詳細については、「ドライバにおける D3cold のサポート」を参照してください。

ファームウェアとプラットフォーム要件

次の説明では、これら 2 つのケースについて、D3cold を有効にするためのファームウェアとプラットフォームの要件について説明します。

  • デバイスが ACPI によって列挙されている場合。

  • デバイスが親バスによって列挙されている場合。

次の説明のほとんどは、PCIe に固有のものです。 ただし、ここで説明する一般的な原則は、他のバスにも広く適用されます。

一部の詳細を抜粋すると、埋め込みデバイスに Vcc 電力を再適用することで、D3cold から D0 への移行がトリガーされます。 電力の再適用により、バスへのデバイスの接続の復元が実現します。 Windows は、次の 2 つのケースを区別するために、デバイスの識別子を読み取ります。

  • デバイスが削除され、別のデバイスと交換された場合。

  • 同じデバイスが取り出され、再び取り付けられた場合。

識別子が一致する場合、デバイス ドライバはデバイスを再初期化します。 識別子が一致しない場合、Windows はデバイス ドライバをアンロードし、新しいデバイスに新しいドライバ スタックを構築します。 たとえば、PCIe は、ベンダー ID、デバイス ID、サブシステム ID (仕様の一部のバージョンではサブデバイス ID とサブベンダー ID に分割) のクエリを実行します。 これらの識別子は、電源が再適用された後 (およびバス指定の待機期間が経過後) に、以前に接続していたデバイスのものと一致する必要があります。それ以外の場合、Windows は新しいデバイスを前のデバイスとは異なるものと見なします。

ケース 1: 埋め込みデバイスが ACPI に列挙される場合

PCIe や USB などのバス仕様で定義されたメカニズムを介して埋め込みデバイスを検出することはできないが、デバイスは永続的に接続されている (または少なくとも接続は既知のデバイス専用である) 場合、このデバイスは ACPI _HIDまたは _CID オブジェクトによってプラットフォーム ファームウェアで記述できます。 これらのオブジェクトを使用すると、デバイスを OSPM で列挙できます。 (「OSPM」は、ACPI 仕様で定義されている用語です。これは、大まかに「ファームウェアではないソフトウェア」を意味します)。OSPM は、バス列挙体がデバイス ID を検出できない場合にのみ、デバイスを列挙します。 たとえば、ISA バス上のデバイスは OSPM によって列挙されます。 さらに、システム オン チップ (SoC) 上のデバイスは列挙不可なファブリック上にあるため、ACPI によって列挙されることがよくあります。 このようなデバイスの例としては、USB および SD ホスト コントローラーがあります。

プラットフォーム ファームウェア (ACPI で列挙)

OSPM では、\_SB._OSC を使用して、プラットフォーム全体の OSPM 機能をプラットフォーム ファームウェアに伝達します。 プラットフォーム ファームウェアは、デバイスが _PR3 をサポートしていることを OSPM に示すため、\_SB._OSC の戻り値にビット 2 を設定する必要があります。 詳細については、ACPI 5.0 仕様の 6.2.10.2 章「プラットフォーム全体の OSPM 機能」を参照してください。

埋め込みデバイス (ACPI 経由でのみ検出)

D3cold をサポートするには、プラットフォーム ファームウェアで埋め込みデバイス用に次の ACPI 電源リソース オブジェクトを実装する必要があります。

  • _PR0: このオブジェクトは、D0 (完全にオン) デバイスの電源状態におけるデバイスの電源要件に評価されます。 戻り値は、デバイスが D0 状態で必要とする電源リソースの一覧です。

  • _PR2: このオブジェクトは、D2 デバイスの電源状態におけるデバイスの電源要件に評価されます。 戻り値は、デバイスが D2 状態で必要とする電源リソースの一覧です。 履歴上の理由から、Windows では、_PR0 が存在するたびに _PR2 が存在すると想定されることに注意してください。 D2 がハードウェアに実装されている場合、_PR2 は D2 に必要な電源リソースを一覧表示します。 D2 が実装されていない場合、_PR2 には _PR0 と同じリソースが一覧表示されます。

  • _PR3: このオブジェクトは、D3hot デバイスの電源状態におけるデバイスの電源要件に評価されます。 戻り値は、デバイスが D3hot 状態で必要とする電源リソースの一覧です。

  • _PRx オブジェクトで識別される電源リソースごとに、次の制御メソッドを実装する必要があります。

    • _OFF: 電源リソースをオフ状態 (リソースの電源オフ) に設定します。

    • _ON: 電源リソースをオン状態 (リソースの電源オン) に設定します。

    • _STA: このオブジェクトは、電源リソースの現在のオン状態またはオフ状態 (0: オフ、1: オン) に評価します。

D3cold への移行は、ACPI が _PR3 に記載されている電源リソースに対して _OFF 制御メソッドを実行するときに発生します。 デバイス ファンクション ドライバ が D3cold のサポートを示している場合、このサポートは、D3 へのすべての移行が D3cold への迅速な移行につながるということではない点に注意してください。 デバイスが D3hot になって長時間そのままの状態である場合、その後 D3cold にならずに D0 に戻るか、後で D3cold になる可能性があります。

親デバイス (ACPI で列挙)

親デバイスが電源管理されていることは要件ではありません。 ただし、親デバイスが電源管理されている場合、子 (依存デバイス) のいずれかが D3 にない場合、Windows はこのデバイスの電源を切ることはありません。

例 (ACPI で列挙)

次のブロック図は、システム バス上の埋め込みデバイス (EMBD とラベル) を示します。 デバイスへのメイン電力 (Vcc) と補助電源 (Vaux) は、電源ロジックのラベルが付いたブロックを介して個別にオンとオフを切り替えることができます。

an acpi-enumerated embedded device.

次の ASL コード例は、前図の埋め込みデバイスで使用される電力リソースについて説明しています。 この例は、デバイス ドライバの機能を記述する _OSC 制御メソッドの宣言から開始します。 次に、デバイスの 2 つの電源リソースが宣言されます。リソース名 PVCC とPVX は、デバイスのメイン電源と補助電源である VccVaux に割り当てられます。 最後に、デバイスがサポートするデバイスの電源状態ごとに電源リソースの要件が一覧表示され、デバイスのウェイク機能が説明されます。

Scope (\_SB)
{
     Method(_OSC, 4, NotSerialized) // Platform-wide Capabilities Check.
     {  
          ... // This must indicate support for _PR3.
     }

     PowerResource(PVCC,0,0) // Power resource representing the main power for the device.
                             // Required for the device to be fully functional (D0).
     {
          Name(_STA,VAR1)        // Return the state of the power resource.
          Method(_ON,0x0) {...}  // Turn on the power resource and set VAR1 to 1.
          Method(_OFF,0x0) {...} // Turn off the power resource and set VAR1 to 0.
     }

     PowerResource(PVAX,0,0) // Power resource representing the auxiliary power for the device.
                             // Required for low-power, less-functional states (e.g., D3hot).
     {
          Name(_STA,VAR2)
          Method(_ON,0x0) {...}
          Method(_OFF,0x0) {...}
     }

     Device(EMBD) // An ACPI-enumerated device on the processor bus that supports D3Cold
     {
               Name(_HID, ...)
               ... // Other (non-power) objects for this device

          // Indicate support for D0.
               Name(_PR0, Package() {PVCC, PVAX}) // Power resources required for D0

          // Indicate support for D1 (optional)...

          // Indicate support for D2.
               Name(_PR2, Package() {PVCC, PVAX}) // If D2 is implemented in the hardware,
                                                  //  list the power resources needed by D2.
                                                  // If D2 is not implemented, list the same
                                                  //  resources as _PR3.

          // Indicate support for D3Cold.
               Name(_PR3, Package() {PVCC, PVAX}) // Power resource for D3. These will be 
                                                  //  turned off ONLY if drivers opt-in to D3cold.
 
          // Indicate support for wake. Required for entry into D3cold, even if the device doesn't
          // need or have a wake mechanism.
               Name(_S0W, 4) // The existence of this object indicates that the platform is
                             //  capable of handling wake events from this device while in S0. 
                             // The value of this object indicates the lowest D-state this device
                             //  can be in to trigger wake events that can be handled while the
                             //  platform is in S0.

          // Enable wake events (optional) 
          //  If this device actually does generate wake events, there must be a way for OSPM to
          //  enable and disable them. The mechanism for this depends on the platform hardware:
               /*
               Name(_PRW, ...) // If the event is signaled via a GPE bit (SCI) OR
                               //  if there are power resources required only for wake.
               Name(_CRS, ...) // If the event is signaled via a wake-capable interrupt.
                
               Method(_DSW, 3) {...} // Can be used with either of the above, if wake enablement
                                     // varies depending on the target S-state and D-state.
               */
     }  // End of Device EMBD
} End Scope \_SB

ケース 2: 埋め込みデバイスがバスに列挙される場合

埋め込みデバイスが PCIe や USB などの一般的なバス仕様に準拠している場合、このデバイスはバスで定義されたメカニズムを介して検出でき、バスを介して部分的または完全に電源供給されます。 このデバイスが他のサイドバンド電源リソースから電源供給されていない場合、デバイスのメイン電源は、デバイスを親バス コントローラーに接続するリンクです。 バス列挙のデバイスは、埋め込みデバイスの定義内の _ADR オブジェクトによって識別できます。 _ADR オブジェクトは、埋め込みデバイスの親バス上のデバイスのアドレスを OSPM に提供するために使用されます。 このアドレスは、バスのデバイスの表現 (バス ハードウェアで表示されるように) をデバイスのプラットフォームの表現 (ACPI ファームウェアで表示されるように) に結び付けるために使用されます。 (_ADR アドレス エンコードはバス固有です。 詳細については、ACPI 5.0 仕様の 6.1.1 章「_ADR (Address)」を参照してください。) このメカニズムを使用する場合は、D3cold のサポートを親バス ドライバで調整する必要があります。

埋め込みデバイスのメイン電源がこのデバイスを親バスに接続するリンクである場合、デバイスを D3cold にするための重要な要件は、リンクの電源を電源を切ることです。 D3cold への移行の詳細については、「デバイスの電源状態」の状態グラフを参照してください。

プラットフォーム ファームウェア (バス列挙)

OSPM では、\_SB._OSC を使用して、プラットフォーム全体の OSPM 機能をプラットフォーム ファームウェアに伝達します。 プラットフォーム ファームウェアは、デバイスが _PR3 をサポートしていることを OSPM に示すため、\_SB._OSC の戻り値にビット 2 を設定する必要があります。 詳細については、ACPI 5.0 仕様の 6.2.10.2 章「プラットフォーム全体の OSPM 機能」を参照してください。

埋め込みデバイス (バス列挙)

D3cold 固有の ACPI の変更は必要ありません。 この場合、デバイス ドライバとプラットフォームが D3cold のサポートを示している限り、親バスが D0 を出て低電力状態 Dx に入ったときに、埋め込みデバイスに電源を供給するバス リンクをオフにすることができます。 埋め込みデバイスの D3hot から D3cold への移行は、リンクからの電源が停止したときに発生します。 親バスがなる Dx 状態は、リンク電源がオフになる任意の状態にすることができます。

親デバイス (バス列挙)

親バスの ACPI 記述子は、次を行う必要があります。

  • _S0W(Dx) を実装します。 このオブジェクトは、システムが S0 状態のときに子 (埋め込み) デバイスがスリープ解除できる最小電力の D 状態として Dx を指定します。

  • 子 (埋め込み) デバイスを親バスに接続するリンクを表す電源リソースを定義します。 さらに、この電源リソースには、_ON、_OFF、および_STA オブジェクトを定義する必要があります。 この一覧に続く ASL コード例は、リンク電源が PVC1 と PVX1 の 2 つのリソースとして記述されています。 これらのリソースごとに、_ON、_OFF、および_STA オブジェクトが定義されます。

  • 「Dx」 (最小電力の D 状態。最初のリスト項目を参照) が D3cold の場合は、子 (埋め込み) デバイスが D3hot に必要とする電力リソースを含む_PR3 オブジェクトを指定します (Vaux や Vaux など)。 D0、D2、D3hot に同じ電源が必要な場合は、_PR0、_PR2、_PR3 すべてに同じ電源リソースを指定します。 これらのリソースは、子デバイスが D3cold に入った場合にのみオフになります。

    履歴上の理由から、Windows では、_PR0 が存在するたびに _PR2 が存在すると想定されます。 D2 がハードウェアに実装されている場合、_PR2 は D2 に必要な電源リソースを一覧表示します。 D2 が実装されていない場合、_PR2 には _PR0 と同じリソースが一覧表示されます。

  • _PR0 を実装します。 親バスの_PR0 オブジェクト内のリソースの一覧には、親バスを子 (埋め込み) デバイスに接続するリンクに電力を供給するリソースが含まれていることが必要です。

例 (バス列挙)

次のブロック図のハードウェア構成例は、PCIe デバイスで D3cold を有効にできる 2 つの異なる方法を示しています。 まず、エンドポイント (ENDP のラベル) を PCIe ルート ポート (RP01) に接続し、PCIe リンクを介して親デバイスから補助電源を受け取ります。 次に、図に示す HD オーディオ デバイスには、親デバイス (PCI0 のラベルが付いた PCI コントローラ) への標準リンクがないため、ACPI 列挙ケースのようにモデル化されます。

a bus-enumerated embedded device.

この図に示す RP01 デバイスには、メイン電源の Vcc1 と補助電源の Vaux1 があります。 同様に、HD オーディオ デバイスには、メイン電源の Vcc2 と補助電源の Vaux2 があります。

次の ASL コードでは、前図に示す親バス コントローラ (PCI0) と ENDP および HD オーディオ デバイスに必要な電源リソースについて説明します。

Scope (_SB)
{
     Method(_OSC, 4, NotSerialized) // Platform-wide Capabilities Check.
     {  
          ... // This must indicate support for _PR3.
     }

     PowerResource(PVC1,0,0) // Power resource representing Vcc1 for the RP01 device.
                             // Required for the device(s) to be fully functional (D0).
     {
          Name(_STA,VAR0)
          Method(_ON,0x0) {...}
          Method(_OFF,0x0) {...}
     }

     PowerResource(PVX1,0,0) // Power resource representing Vaux1 for the RP01 device.
                             // Required for low-power, less-functional states (e.g., D3hot).
     {
          Name(_STA,VAR1)
          Method(_ON,0x0) {...}
          Method(_OFF,0x0) {...}
     }

     PowerResource(PVC2,0,0) // Power resource representing Vcc2 for the HD device.
                             // Required for the device(s) to be fully functional (D0).
     {
          Name(_STA,VAR2)
          Method(_ON,0x0) {...}
          Method(_OFF,0x0) {...}
     }

     PowerResource(PVX2,0,0) // Power resource representing Vaux2 for the HD device.
                             // Required for low-power, less-functional states (e.g., D3hot).
     {
          Name(_STA,VAR3)
          Method(_ON,0x0) {...}
          Method(_OFF,0x0) {...}
     }

     ... // Power resources for other child devices

     Device(PCI0) // The PCI root complex
     {
          Name(_HID, EISAID("PNP0A08"))  // ACPI enumerated
          Method(_OSC, 4, NotSerialized) // PCIe-specific Capabilities Check.
          {     
               ... // This must support hand-off of PCIe control to the OS.
          }
          ... // Other (non-power) objects for this device

          Device(RP01) // PCIe Root Port 1
          {
                    Name(_ADR, "...") // Bus enumerated
                    ... // Other (non-power) objects for this device
    
               // Indicate support for D0.
                    Name(_PR0, Package() {PVC1, PVX1}) // Power resources required for D0.
                                                       // Includes the Link Power for ENDP.

               // Indicate support for D1 (optional)...

               // Indicate support for D2.
                    Name(_PR2, Package(){PVC1, PVX1}) 

               // Indicate support for wake. Required for entry into D3cold, even if the
               // device doesn't need or have a wake mechanism.
                    Name(_S0W, 4) // The existence of this object indicates the platform
                                  //  is capable of handling wake events from this device
                                  //  while the platform is in S0. 
                                  // The value of this object indicates the lowest D-state
                                  //  this device can be in to trigger wake events that 
                                  //  can be handled while the platform is in S0.

               // Enable wake events (optional) 
               //  If this device actually does generate wake events, there must be a way
               //  for OSPM to enable and disable them. The mechanism for this depends on
               //  the platform hardware:

                    /*
                    Name(_PRW, ...) // If the event is signaled via a GPE bit (SCI) OR
                                    //  if there are power resources required only for wake.
                    Name(_CRS, ...) // If the event is signaled via a wake-capable interrupt.

                    Method(_DSW, 3) {...} // Can be used with both of the above, if wake
                                          //  enablement varies depending on the target 
                                          //  S-state and D-state.
                    */

                    Device(ENDP) // This device supports D3cold. No power-related objects
                                 // are required.
                    {
                         Name(_ADR, "...")  // Bus enumerated
                         ... // Other (non-power) objects
                    }  // End of Device ENDP
          }  // End of Device RP01

          Device(HD) // A PCIe Bus0 device (HD Audio) that supports D3cold. Note that
                     //  this case is modeled similar to the ACPI-enumerated case
                     //  because device HD has no standard link to its parent.
          {
                    Name(_ADR, "...") // Bus enumerated
                    ... // Other (non-power) objects for this device
    
               // Indicate support for D0.
                    Name(_PR0, Package() {PVC2, PVX2}) // Power resources required for D0
                            
               // Indicate support for D1 (optional)...

               // Indicate support for D2.
                    Name(_PR2, Package(){PVC2, PVX2})

               // Indicate support for D3Cold.
                    Name(_PR3, Package() {PVC2, PVX2}) // Power resource for D3; These will
                                                       //  be turned off ONLY if drivers
                                                       //  opt-in to D3cold.
 
               // Indicate support for wake. Required for entry into D3cold, even if the
               // device doesn't need or have a wake mechanism.
                    Name(_S0W, 4) // The existence of this object indicates that the platform
                                  //  is capable of handling wake events from this device 
                                  //  while the platform is in S0. 
                                  // The value of this object indicates the lowest D-state
                                  //  this device can be in to trigger wake events that can
                                  //  be handled while the platform is in S0.

               // Enable wake events (optional). 
               //  If this device actually does generate wake events, there must be a way for
               //  OSPM to enable and disable them. The mechanism for this depends on the HW:
                    /*
                    Name(_PRW, ...) // If the event is signaled via a GPE bit (SCI) OR
                                    //  if there are power resources required only for wake.
                    Name(_CRS, ...) // If the event is signaled via a wake-capable interrupt.

                    Method(_DSW, 3) {...} // Can be used with both of the above, if wake
                                          //  enablement varies depending on the target
                                          //  S-state and D-state.
                    */
          }  // End Device HD

          ... // Device objects for other child devices

     }  // End Device PCI0
}  // End Scope _SB

その他の可能性

上記 2 例で示した手法を組み合わせて、バス電力とサイドバンド電力の両方を使用する構成をサポートできます。

デバイス ドライバーの要件

デバイスの電源ポリシー所有者 (通常はファンクション ドライバー) は、デバイスの D3hot から D3cold への移行を有効にするかについてオペレーティング システムに指示します。 ドライバーは、デバイスをインストールする INF ファイルでこの情報を提供できます。 または、ドライバーは、D3cold へのデバイスの移行を動的に有効または無効にするランタイムで SetD3ColdSupport ルーチンを呼び出すことができます。 デバイスが D3cold に入ることができるようにすることで、ドライバーは次の動作を保証します。

  • コンピューターを S0 のままにする場合、デバイスは D3hot から D3cold への移行を許容できます。

  • デバイスが D3cold から D0 に戻ると、正常に動作します。

いずれかの要件を満たさないデバイスは、D3cold に入った後、コンピューターが再起動されるかスリープ状態になるまで使用できなくなる可能性があります。 デバイスが入っていた低電力 Dx 状態からウェイク イベントを通知できることが必要な場合は、ドライバーがデバイスのウェイク 信号が D3cold で動作することが確実でない限り、D3cold へのエントリを有効にすることはできません。

詳細については、「ドライバーでの D3cold のサポート」をご覧ください。