電源管理について

みなさまにアドバイスいただき大変参考になります。

立て続けに質問になってしまいますが、
以下の件、アドバイス頂けますでしょうか。

自作のPCIボードは常にPowerDeviceD0の状態を保ちたく思います。
(OSのサスペンド状態の時も含め)

その場合、
IRP_MJ_POWERのIRP_MN_SET_POWERで
システムパワーの変更、
デバイスパワーの変更
に対し、どのように処理したらよいのかで迷っています。

【質問1】
そもそも、最初に書いたPowerDeviceD0の状態を保つ事は
問題ありますでしょうか?

【質問2】
システムパワーの変更の場合:
PoRequestPowerIrp()に渡すPowerState構造体のDeviceStateに
常にPowerDeviceD0を入れて良いのでしょうか?

【質問3】
デバイスパワーの(PowerDeviceD3への)変更の場合、
どのように処理したらよいのでしょうか?
pIrpStack->Parameters.Power.State.DeviceStateをPowerDeviceD0に変更し、
PoStartNextPowerIrp();
IoSkipCurrentIrpStackLocation();
PoCallDriver();
等を呼んでバスデバイスドライバに処理を丸投げして良いのでしょうか?

以上、曖昧な質問で申し訳ございませんが、
アドバイス頂けないでしょうか。
よろしくお願いします。

Pooh様 貴重なアドバイ

Pooh様

貴重なアドバイスありがとうございます。

確かに、DEVICE_CAPABILITES構造体の設定と異なる点や、
QUERY_POWERへの応答の仕方が気になっていたのですが、
どのようにした良いかが書籍やnetからは分からなかったので、
SET_POWERでD0に変更する方法をとりあえず取りました。

ファンクションデバイスである自分のデバドラが
DEVICE_CAPABILITES構造体を変更して
良いのでしょうか?

また、QUERY_POWERでデバイスパワーダウンの許可を聞かれて不可と答える場合は、
下位に渡さず、STATUS_UNSUCCESSFULを返せば良いのでしょうか?

因みに、(実験した環境では)"SET_POWERでD0に変更する方法"でも
windowsのスタートメニューからスリープを選択すると
スリープ状態になりました。

何か情報やアドバイスあれば教えて頂けますでしょうか。
自分でも書籍などを引き続き調べてみます。

ccgrape

ccgrape 様、お返事が遅くなって申し訳ありません。

デバイスを常にフルパワー状態に保ちたいと言うことは、スリープ状態をサポートしないことだと思ったのですが、
この場合、IRP_MJ_PNP - IRP_MN_QUERY_CAPABILITIES で返される DEVICE_CAPABILITES 構造体との整合性を取る
必要があるのでは。。。と思った次第です。

たとえば、IRP_MJ_PNP - IRP_MN_QUERY_CAPABILITIES で ACPI ドライバを経由して BIOS から取得した
DEVICE_CAPABILITES 構造体で、DeviceD1 / DeviceD2 ビットが立っている状態だったとしたら、そもそも
D0 状態を保つと言うことに矛盾があるように思います。

それに、IRP_MN_SET_POWER は IRP_MN_QUERY_POWER で Power State の変更が可能である場合に通知されてくる
はずだったと思います。
だとしたら、IRP_MN_SET_POWER 以前に IRP_MN_QUERY_POWER での処理を先に確認すべきでは?

私も実際に試したことはありませんが、そもそも Device Power State が D0 の場合、システムはスリープ状態に
入らないような気がします。。。。

あんまり適切なアドバイスができずにすみません。。。。

IRP_MN_QUERY_CAPABILITIESで

IRP_MN_QUERY_CAPABILITIESでは、
下位のドライバ処理を丸投げしています。

もしかして、IRP_MN_QUERY_CAPABILITIESで
何か設定出来るのでしょうか?

すいません、勉強不足で。
教えて頂けますでしょうか?

ccgrape

ccgrape 様、こんばんは。
IRP_MJ_PNP - IRP_MN_QUERY_CAPABILITIES では、どのような処理ををされているのでしょうか?