ACPI サービス用 PEP の使用

このトピックでは、ACPI サービスにプラットフォーム拡張プラグイン (PEP) を使用する方法について説明します。

PEP は、動的なランタイム ACPI メソッドを提供します。 静的テーブル (FADT、MADT、DBG2 など) は、ACPI ファームウェアと DSDT/SSDT デバイス階層に実装する必要があります。

PEP は、SoC 以外の電源管理方法に使用することを目的としています。 これらはインストール可能なバイナリであるため、ファームウェア フラッシュを必要とする ACPI ファームウェアとは対照的に、即座に更新できます。 つまり、Windows Update に更新されたドライバーを投稿することで、既にリリース済みのプラットフォームで電源管理コードを改善できます。 PEP の本来の意図は電源管理でしたが、任意の ACPI ランタイム メソッドを提供またはオーバーライドするために使用できます。

名前空間階層はファームウェア DSDT で提供する必要があるため、PEP は ACPI 名前空間階層の構築において何の役割も果たしません。 ACPI ドライバーは、実行時にメソッドを評価すると、対象のデバイスの PEP の実装メソッドに対してチェックし、存在する場合は PEP を実行し、ファームウェアのバージョンを無視します。 ただし、デバイス自体はファームウェアで定義する必要があります。

PEP を使用した電源管理の提供は、使用可能なツールのために ACPI ファームウェア用に記述されたコードよりもはるかに簡単にデバッグできます。 ACPI ファームウェアをデバッグするためのツールはあまり普及していないため、オプションは限られています。 これに対し、PEP は Windows ドライバーとして開発されているため、開発者は最も使い慣れた開発ツールやデバッグ ツールを使用できます。

ACPI サービスの代わりに PEP を使用する場合、サービスの役割を要求するために特別なアクションや操作は必要ありません。 PEP にメソッドが実装されると、Windows によって自動的に使用されます。 同じデバイス上の同じメソッドのファームウェア バージョンが提供されている場合は無視されます。

PEP は非常に早い段階で読み込まれるので、デバイス ドライバーでサービスを利用できます。 さらに、Windows を介した抽象化レイヤーは、デバイス ドライバーに対して透過的に設計されています。 ドライバーは、PEP が使用されていないかのように ACPI メソッドと対話できることが期待されます。

デバイス電源管理 (DPM) サービスと ACPI サービスの両方に PEP を使用する場合は、個別の PEP ハンドルを使用することをお勧めしますが、これは好みの問題にすぎません。 ハンドル DPM と ACPI 状態を共有する場合は、ハンドルが同じであるため、デバイスの状態を簡単に追跡できます。 ただし、ハンドルの有効期間管理は少し複雑です。 PEP は、ハンドルの参照カウントを提供して、DPM サービスと ACPI サービスの両方がそのハンドルに対して切断された後 (つまり、PEP_DPM_UNREGISTER_DEVICEPEP_NOTIFY_ACPI_UNREGISTER_DEVICE の両方がそのハンドルで受信された後) にのみ削除されるようにする必要があります 。 異なるハンドルが使用されている場合、DPM と ACPI の状態は個別に追跡されますが、ハンドルの有効期間管理は簡単です。 この場合、対応する登録解除通知が送信されたときにハンドルを破棄できます。

ACPI リソースの操作プロセスを簡略化するために、電源管理フレームワーク (PoFx) には、ACPI リソースを BIOS リソースに変換する PEP_REQUEST_COMMON_ACPI_CONVERT_TO_BIOS_RESOURCES ヘルパー ルーチンが用意されています。

PEP は、PoFx からの ACPI 通知に応答して同期的に実行できない作業をスケジュールする役割を担いますが、使用されるメソッドは PEP 開発者によって決定されます。 通常、PEP は内部キューで作業をキューに入れ、必要に応じてワーカー スレッドを開始します。 また、作業が何らかの外部イベント (デバイスの割り込みなど) を待機する必要があり、そのイベントのコンテキストで処理される可能性もあります。 作業が完了すると、PEP は、PEP_KERNEL_INFORMATION_STRUCT_V3->RequestWorker() を呼び出すことによって、PoFx に作業のクエリを要求できます。 これに対して、PoFx は、DPM 通知ハンドラー (AcceptDeviceNotification) を実装する PEP の PEP_DPM_WORK 通知、または ACPI 専用通知ハンドラー (AcceptAcpiNotification) を実装する PEP の PEP_NOTIFY_ACPI_WORK 通知 を送信します。

ACPI システム記述テーブル
PEP_DPM_UNREGISTER_DEVICE
PEP_NOTIFY_ACPI_UNREGISTER_DEVICE
PEP_KERNEL_INFORMATION_STRUCT_V3
PEP_DPM_WORK
PEP_NOTIFY_ACPI_WORK
RequestWorker
AcceptDeviceNotification
ACPI 通知