PCI 電源管理とデバイス ドライバー

この記事では、ベンダーで経験された混乱に基づいて、PCI Power Management (PCI-PM) に準拠するハードウェアがオペレーティング システムのデバイス ドライバーとやり取りする方法と、PCI-PM と ACPI を統合する方法を説明します。 詳細については、https://www.uefi.org/specifications を参照してください

デバイスドライバと PCI 電源管理

この説明では、現在の Windows DDK で説明されているように、Windows Driver Model (WDM) ドライバーが電源管理イベントを処理する方法に精通していることを前提としています。 一般に、デバイス ドライバーの役割には、次のものがあります。

  • バス ドライバー: バス ドライバーは、デバイスの列挙、構成、制御を担当します。 PCI-PM では、PCI バス ドライバーは、PCI-PM レジスタを読み取って、ハードウェアの機能を判断する役割を担います。 POWER IRP が電源状態の変更を要求すると、PCI ドライバーが PCI 電源管理レジスタに書き込み、ハードウェアを異なる Dx 状態に設定します。

    デバイスでウェイクアップが有効になっている場合、PCI ドライバーは PCI-PM レジスタに書き込み、デバイスが PME を起動できるようにします (ACPI もアクションを実行します。次のセクションを参照)。 最後に、ACPI が、PCI バスがシステムをスリープ解除していると判断した場合、PCI ドライバーは、PCI 構成領域をスキャンして、どのデバイスが PME をアサートするかを探し、そのデバイスの PME を無効にして、そのデバイスのドライバーに通知します。

  • デバイス ドライバー: デバイスの特定のドライバーは、デバイス コンテキストの保存と復元に加えて、デバイスのポリシー所有者として電源状態の変更を要求する役割を担います。 デバイス ドライバーが低いデバイスの電源状態の変更を要求する POWER IRP を受信した場合、後でデバイスをオンにするために必要な独自のデバイス コンテキストを保存する責任はデバイス ドライバーにあります。 場合によっては、保存するものが何もない場合があります。

PCI-PM レジスタは、厳密には PCI ドライバーのドメインです。IHV のデバイス ドライバーは、これらのレジスタのいずれにもアクセスする必要はありません。 アクセスした場合は、システムが確実に動作しない原因となる場合があります。 デバイス ドライバーの責任は、独自の操作のみを実行することです。

ACPI と PCI PM の統合

一部のデバイス、特に、ポータブルのマザーボード ビデオ デバイスでは、デバイスの電源を完全に管理できるように、PCI 電源管理と ACPI ソース言語アセンブラー (ASL) の両方が必要になる場合があります。 PCI 電源管理レジスタは、内部クロックや電源プレーンなど、デバイスの内部状態を制御します。 ASL は、外部クロックや電源プレーンなどの外部状態を制御し、ビデオ コントローラーの場合は、ASL がビデオ バックライトを制御します。 注: ASL と PCI-PM は、マザーボード デバイス上でのみ、組み合わせることができます。

OnNow アーキテクチャは階層型アーキテクチャであり、デバイス ドライバー、PCI ドライバー、ACPI ドライバー (および ASL) の統合を自然に処理します。 次のシナリオは、ドライバーがこれらのデバイスを処理するために呼び出される順序を示しています。

Note

上記のシナリオが説明どおりに動作するには、WDM ドライバーは、現在のバージョンの Microsoft WDK で説明されているように、POWER IRP を正しく転送する必要があります。

シナリオ 1: デバイスをオフにする

  1. デバイス ドライバー: 独自のデバイスの状態を保存します。

  2. PCI ドライバー: プラグ アンド プレイ構成を保存し、デバイスを無効にし (割り込みと BAR)、PCI-PM レジスタを使用して、デバイスを D3 に配置します。

  3. ACPI ドライバー: ASL コード (_PS3 および電源リソースが使用されなくなった _OFF) を実行して、チップの外部の状態を制御します。

シナリオ2: PCI 電源管理とデバイス ドライバー

  1. ACPI ドライバー: ASL コード (_PS0 および OnNow に必要な電源リソースの_ON) を実行して、チップの外部の状態を制御します。

  2. PCI ドライバー: PCI-PM レジスタを使用して D0 にデバイスを配置し、プラグ アンド プレイ構成を復元します (割り込みと BAR -- これらは、デバイスが、以前にオンになっていたものとは異なる場合があります)。

  3. デバイス ドライバー: デバイス内の独自のコンテキストを復元します。

シナリオ 3: ウェイクアップを有効にする

  1. デバイス ドライバー: ウェイクアップを有効にするために、チップに独自のレジスタを設定します。 たとえば、パターン マッチング ネットワーク ウェイクアップでは、これは、パターンがアダプターにプログラムされる場合となります。

  2. PCI ドライバー: デバイスが PME をアサートできるように、PCI PM レジスタのウェイクアップ 有効化ビットを設定します。

  3. ACPI ドライバー: PME に関連付けられているチップ セット内の GPE を有効にします (ルート PCI バスの下にリストされている _PRW オブジェクトによって説明されます)。

シナリオ 4: ウェイクアップ

  1. ACPI ドライバー: ウェイクアップ イベントの GPE ステータス ビットをウェイクアップしてスキャンし、設定された GPE ステータス ビットの GPE を無効にし、設定された GPE ビットに関連付けられた _Lxx または _Exx メソッドを実行します。 PCI バスでのウェイクアップ通知に応答する際に、ACPI ドライバーは PCI ドライバーの WAIT_WAKE IRP を完了し、システムをスリープ解除していることを PCI ドライバーに通知します。

  2. PCI ドライバー: コンフィギュレーション スペースをスキャンして、PME ステータス ビットが設定されているデバイスを探します。 デバイスごとに、PME を無効にし、そのデバイスの WAIT_WAKE IRP を完了して、ウェイクアップをアサートしていることをドライバーに通知します。 PCI ドライバーは、アサート PME が見つからなかったすべての PCI デバイスを完全に通過し、PME のアサートが停止すると、スリープ解除デバイスのスキャンを停止します。

  3. デバイス ドライバー: デバイスを D0 に入れるように要求し (シナリオ 2 を参照)、ウェイクアップ イベントの処理に必要なチップ内の独自のレジスタを設定します。

PCI 電源管理とデバイス ドライバーでのアクションの呼び出し

  • この記事の説明に従って、ACPI と PCI-PM の機能をデバイスに統合してください。

  • PCI 電源管理の仕様は、PCI-SIG の Web サイトで入手できます。

  • ACPI 仕様は、次の Web サイトで入手できます: https://www.uefi.org/specifications。 (このリンクを選択すると、Microsoft.com サイトから移動します。)

  • ACPI コンポーネント アーキテクチャ (ACPICA) コンパイラは、次で見つかります: https://acpica.org/downloads/binary-tools