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 状態に入ることができます。
しばしば「D3」と呼ばれるD3hotは、デバイスの「ソフトオフ」状態です。 この状態では、デバイスはバス スキャンによって検出され、デバイスに送信されたコマンドによって再び電源がオンになる可能性があります。 D3cold では、デバイスのウェイク ロジックを駆動するための少量の電源を除き、すべての電源が削除されます。 たとえば、PCI Express (PCIe) デバイスの場合、メイン デバイスの電源であるVcc は、D3cold への移行時に頻繁にオフになります。 Vccをオフにすると、消費電力を削減し、モバイルハードウェアプラットフォームがバッテリ充電で実行できる時間を延長できます。 デバイスが D3cold 内にある場合、バス スキャンでは検出できず、コマンドを受信できません。 電源を復元すると、デバイスは初期化されていない状態に移動します。これは通常、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 によって列挙されます。 さらに、システム オン a チップ (SoC) 上のデバイスは、列挙不可能なファブリック上にあるため、ACPI によって列挙されることがよくあります。 このようなデバイスの例としては、USB および SD ホスト コントローラーがあります。
プラットフォーム ファームウェア (ACPI で列挙)
OSPM では、\_SB._OSC を使用して、プラットフォーム全体の OSPM 機能をプラットフォーム ファームウェアに伝達します。 プラットフォーム ファームウェアは、デバイスが_PR3をサポートしていることを OSPM に示すために、\_SB._OSC 戻り値にビット 2 を設定する必要があります。 詳細については、ACPI 5.0 仕様のセクション 6.2.10.2「Platform-Wide 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: 電源リソースを on 状態 (リソースの電源オン) に設定します。
_STA: このオブジェクトは、電源リソースの現在の オン または オフ の状態 (0: off、1: on) に評価されます。
D3cold への移行は、ACPI が _PR3 に記載されている電源リソースに対して_OFF制御メソッドを実行するときに発生します。 デバイスファンクションドライバがD3coldのサポートを示している場合、このサポートは、D3へのすべての遷移がD3coldへの迅速な遷移につながることを意味しない点に注意してください。 デバイスが D3hot に長期間出入りし、D3cold に入らずに D0 に戻るか、後で D3cold に入る可能性があります。
親デバイス (ACPI で列挙)
親デバイスが電源管理できる必要はありません。 ただし、親デバイスが電源管理されている場合、子 (依存デバイス) のいずれかが D3 にない場合、Windows はこのデバイスの電源を切ることはありません。
例 (ACPI で列挙)
次のブロック図は、システム バス上の埋め込みデバイス ( EMBD というラベルが付いた) を示しています。 デバイスの主電源 (Vcc) と補助電源 (Vaux) は、電源 ロジックというラベルが付いたブロックを介して個別にオンとオフを切り替えることができます。
次の ASL コード例では、前の図の埋め込みデバイスで使用される電力リソースについて説明します。 この例では、デバイス ドライバーの機能を記述する_OSCコントロール メソッドの宣言から始めます。 次に、デバイスの 2 つの電源リソースが宣言されます。リソース名 PVCC とPVX は、デバイスのメインおよび補助電源 であるVcc と Vaux に割り当てられます。 最後に、デバイスがサポートするデバイスの電源状態ごとに電源リソースの要件が一覧表示され、デバイスのウェイク機能が説明されています。
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「Platform-Wide 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 オブジェクトに Vcc および 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 列挙ケースと同様にモデル化されます。
この図の 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 のサポート」を参照してください。