コンポーネント レベルの電源管理
Windows 8以降、電源管理フレームワーク (PoFx) を使用すると、ドライバーはデバイス内の個々のコンポーネントの電源状態を管理できます。 コンポーネントレベルの電源管理は、デバイスレベルの電源管理と並行して存在します。 概要については、電源管理フレームワークの概要を参照してください。
このページでは、コンポーネントレベルの電源管理のための PoFx API について説明します。
PoFx によって管理されるデバイスを登録するために、ドライバーは PoFxRegisterDeviceルーチンを呼び出します。 ドライバーは、このルーチンに、他のデータの中でも、PO_FX_COMPONENT構造体の配列を含む PO_FX_DEVICE構造体を渡します。 この配列の各要素は、デバイス内のコンポーネントの Fx 電源状態と各 Fx 状態の属性を記述します。 (少なくとも、コンポーネント レベルの電源管理をサポートしていないコンポーネントは、F0 状態のみを実装します)。特定のコンポーネントの特定の Fx 電源状態の属性は、次の値を含む PO_FX_COMPONENT_IDLE_STATE 構造体によって記述されます。
- 遷移レイテンシは、この Fx 状態から F0 (完全にオン) 状態に移行するのに必要な時間です。
- 常駐要件は、コンポーネントがこの Fx 状態に移行する価値あるものにするために費やす必要がある時間です。
- 公称電力は、この Fx 状態のコンポーネントによって消費される電力です。
PoFx は、この情報を (他のシステム全体の入力と依存関係に加えて) 使用して、コンポーネントが特定の時点でどの Fx 電源状態にある必要があるかについてインテリジェントな決定を下します。 PoFx は、2 つの競合する目標のバランスを取る必要があります。 まず、アイドル状態のコンポーネントは、できるだけ電力を消費しないように構成する必要があります。 第 2 に、コンポーネントは、常にオンで常時接続されているデバイスの外観を維持するのに十分な速さで、低電力の Fx 状態から F0 に切り替わるように準備する必要があります。
コンポーネント レベルの電源管理は、デバイスが D0 (完全にオン) の電源状態の場合にのみ実行できます。 デバイスが D1 (ほぼオン)、D2 (ほぼオフ)、または D3 の電源状態の場合、デバイスにアクセスできません。 デバイスが D0 状態の場合、ドライバーがアクティブに使用しているコンポーネントのみが F0 状態のままである必要があります。 アイドル状態のコンポーネントは、低電力 Fx 状態に切り替えて、電力消費量を削減できる可能性があります。
デバイスが D0 電源状態にある間、ドライバーは単純なプロトコルに従ってコンポーネント レベルの電源管理を有効にします。 ドライバーがコンポーネントにアクセスする必要がある場合、ドライバーはPoFxActivateComponentルーチンを呼び出してコンポーネントへのアクセスを要求します。 この呼び出しが発生したときにコンポーネントが低電力 Fx 状態の場合、PoFx は F0 状態への遷移を開始し、この遷移が完了したときにドライバーに通知します。 その後、ドライバーはコンポーネントにアクセスできます。 ドライバーがコンポーネントにアクセスする必要がなくなった場合、ドライバーはPoFxIdleComponentルーチンを呼び出して PoFx に通知します。 この呼び出しに応答して、PoFx はコンポーネントを低電力 Fx 状態に切り替える可能性があります。
アクセス可能なコンポーネントはアクティブ状態にあります。 アクセスできないコンポーネントは、アイドル状態です。 デバイス内のコンポーネントのアクセシビリティを追跡するために、PoFx メイン各コンポーネントのアクティブ化参照数が含まれます。 PoFxActivateComponent 呼び出しは、指定されたコンポーネントのカウントを 1 つインクリメントし、PoFxIdleComponent 呼び出しはカウントを 1 つ減らします。
PoFxActivateComponent 呼び出しによってカウントが 0 から 1 にインクリメントされた場合、PoFx はアイドル状態からアクティブ状態への切り替えを開始し、この移行が完了するとドライバーに通知します。 コンポーネントが既にアクティブな状態にあるときにPoFxActivateComponent が発生した場合、コンポーネントはアクティブな状態のままになり、ドライバーは通知を受け取りません。
PoFxIdleComponent 呼び出しでカウントが 1 から 0 にデクリメントされた場合、PoFx はアクティブ状態からアイドル状態への遷移を開始し、この遷移が完了するとドライバーに通知します。 PoFxIdleComponent 呼び出しによってカウントがデクリメントされても、カウントが 0 以外のままの場合、コンポーネントはアクティブな状態のままになり、ドライバーは通知を受け取りません。
アクティブ化参照カウントは、同じドライバー内の 2 つ以上のコード パスがデバイス内の同じコンポーネントに同時にアクセスする必要がある状況を簡単に処理します。 このカウントを維持することで、PoFx を使用すると、ドライバーがコンポーネントへのアクセスを一元的に管理しなくても、ドライバーのさまざまな部分がコンポーネントへのアクセスを個別に維持できます。
コンポーネントのアクティブ/アイドル状態は、ドライバーがコンポーネントにアクセスできるかどうかを判断するための唯一の信頼できる手段です。 電源状態が F0 でアイドル状態のコンポーネントが、低電力の Fx 状態に切り替わろうとしている可能性があります。
アクティブ状態にあるコンポーネントは、常に F0 状態です。 コンポーネントは、アイドル状態になるまで F0 を残すことはできません。 アイドル状態のコンポーネントは、F0 または低電力 Fx 状態である可能性があります。 PoFxActivateComponent 呼び出しによってアイドル状態からアクティブ状態への遷移が開始されたときにコンポーネントが低電力 Fx 状態の場合、PoFx は、コンポーネントがアクティブ状態に入る前に、まずコンポーネントを F0 に切り替える必要があります。