PCI デバイスコンフィグレーション空間へのアクセス方法
皆さん、こんにちは。A寿です。
突然ですが、皆さんは、イルカに触ったことはありますか?・・・このお話にご興味のある方は本文の最後の【閑話休題】までどうぞ。
さて、今回は、 PCI デバイスコンフィグレーション空間へのアクセス方法についてご紹介したいと思います。
PCI デバイスコンフィグレーション空間への Read/Write を行うには、以下の2種類の方法のいずれかを利用します。
(1) BUS_INTERFACE_STANDARD バス インターフェースの GetBusData メソッド(読み取り)/ SetBusData メソッド(書き込み)
(2) IRP_MJ_PNP の IRP_MN_READ_CONFIG(読み取り)/ IRP_MN_WRITE_CONFIG(書き込み)
このどちらの方法も下記の公開情報にサンプルも含めて方法が載っておりますので、ご参照いただければ幸いです。
PCI デバイスの構成情報と場所情報の取得方法
https://support.microsoft.com/kb/253232/ja
上記ドキュメントにも記載がありますが、 HalGetBusData などの HAL API は、廃止されておりますので、ご利用されないことを推奨いたします。
このことは、以下のドキュメントにも記載があります。
HalGetBusData
https://msdn.microsoft.com/en-us/library/ff546599(VS.85).aspx
The HalGetBusData routine is obsolete and is exported only to support existing drivers. Use the PnP manager's IRP_MN_QUERY_INTERFACE and IRP_MN_READ_CONFIG requests instead.
また、上記 (1), (2) の方法は、「拡張 PCI デバイスコンフィグレーション空間 ( コンフィグレーション データの 256 バイト以上 ) 」でもご利用いただけます。ただし、「拡張PCIデバイスコンフィグレーション空間」にアクセスするためには、デバイスが拡張コンフィグレーション空間を持つ、または、プラットフォームがデバイス上の拡張コンフィグレーション空間へのパスを定義している必要があります。もしデバイスが拡張コンフィグレーション空間を持たない、または、プラットフォームがデバイス上の拡張コンフィグレーション空間へのパスを定義していない場合、 Read リクエストは 0xFFFF を返し、 Write リクエストは何もしません。そのため、ドライバが拡張コンフィグレーション空間への Read/Write が成功するかどうかを、 Read/Write するバイト数を指定して結果を見ることで判断できます。
「拡張 PCI デバイスコンフィグレーション空間」にアクセスするためには、さらに、 BIOS やハードウェア側のサポートも必要になります。必要となるサポートは以下の両方です。
(A) ACPI BIOS 内で、ルートバスは PNP0A08 または PNP0A03 の PNP ID を持つ必要があります。
PNP0A03 を持つルートバスには、 funcition 4 (PCI bus capabilities) を持つ _DSM メソッドが current mode を PCI-X mode 2 であると示さなければなりません。
全てのブリッジとデバイスは PCI express または PCI-X mode 2 でなければなりません。
(B) システムはメモリ マップド コンフィグレーション空間へのアクセスをサポートしなければなりません。
これは、システム BIOS / ファームウェアの MCFG テーブルを定義することによって行われます。
Windows Vista と Windows Server 2008 以降の OS は自動的にメモリ マップドコンフィグレーション空間へのアクセスをサポートしています。
以上の内容については、英語となりますが、以下のドキュメントを併せて参照いただければ幸いです。
Accessing PCI Device Configuration Space
https://msdn.microsoft.com/en-us/library/ff536890(VS.85).aspx
また、上記 (A) について、 ACPI BIOS のルートバスが PNP0A08 または PNP0A03 の PNP ID を持っているかどうかをデバイスマネージャで確認する方法は、以下の通りです。なお、以下は DELL OPTIPLEX 745 で Windows 7 x64 を使用した場合の例であるため、環境によって表示は異なる可能性があります。
■ PNP IDの確認方法
1. デバイスマネージャを開きます。
2. ウィンドウ上部の「表示」メニューをクリックし、「デバイス(接続別)」をクリックします。
3. ツリーのルートにあるPC名をクリックして展開します。
4. その子ノードにある、「ACPI x64-based PC」をクリックして展開します。
5. その子ノードにある、「Microsoft ACPI-Compliant System」をクリックして展開します。
6. その子ノードにある、「PCIバス」を右クリックし、プロパティを開きます。
7. プロパティの詳細タブを開き、「ハードウェアID」を選択すると、
ACPI\PNP0A03
*PNP0A03
と表示されます。
以上のように、基本的に公開された情報をまとめた内容となりますが、従来よりも見つけやすいように今回ブログに記載させていただきました。お役に立てば幸いです。
――――――――――――――――
【閑話休題】突然ですが、皆さんは、イルカに触ったことはありますか?
私は、静岡にある、某水族館で触ったことがあります。その水族館は海に面していて、その海でイルカが泳いでいる状態のため、水着で波打ち際から海に入っていき、泳いでいるイルカに触ることができる、というアクティビティに参加しました。イルカに触る時には、いくつか注意点がありました。例えば、目を触らない、 鼻をふさがない 、 (たたかれないように)尾びれをつかまない 、 親が子供をイルカに乗せようとしない 、 親自身も乗らない、といったことです。イルカが「人間に触ってほしいな」と思ったら寄ってくるので、このような注意点を守りながら、目と尾びれの間だけを触ることになります。イルカは4頭くらい泳いでいましたが、実際は、それほど 「人間に触ってほしい」と思ってくれるイルカはおらず、ちょっと寄ってきたと思ったら、「どんな客が来たのかな~」と眺めては、触られないぎりぎりのところをスイーッと通り過ぎていきます。結局、たくましい係員のお姉さんが、胴から尾びれまでの細くなったところをガッと抱え込み、横一列に並んだ客に触らせることが多かったです。参加前の注意事項として、「イルカにとっては休憩時間なので、触れなくてもご了承ください」と言われていたので、ここまでして触らせてもらえるのはありがたかったです。比較的小さいお子様も参加していましたが、基本的に、お子様たちにとって注意事項は理解するのが難しい内容のようでした。こっちを見ながら通り抜けるイルカの目をめがけて、両手で作った水鉄砲で水をかけているお子様もいれば、自分の近くに来たイルカの尾びれを必ずつかんでは、イルカに尾びれをバシャバシャ動かされて頭から水をかぶっているお子様もいらっしゃいました。ともあれ、夏の思い出に、イルカに癒されるのは、よい経験ですので、ご興味のある方は、一度経験しに行かれるとよいかもしれません。が、小さなお子様のいらっしゃる方は、お子様がイルカにイタズラをして、仕返しにイルカに突き飛ばされないよう、ご注意ください。(私が体験した際は、誰もそんなことにはなりませんでしたが、実際突き飛ばされると大人でも倒れる強さだそうです。)