戻る

PCI

目次


USB(UniversalSerialBus)


トップへ戻る

PCIデバイス探索

大まかな流れ

  1. PCIバスに接続されたPCIデバイスをすべて列挙する
  2. 列挙されたデバイスの一覧からxHCを探す
  3. xHCを初期化する
  4. USBバス上でマウスを探す
  5. マウスを初期化する
  6. マウスからデータを受信する

PCI(PeripheralComponentInterconnect)

部品とマザーボードを繋ぐための規格。現代のパソコンの中心的な技術。xHCI規格ではxHCはPCIデバイスであると定められている。そのほかにも「NVMeSSD」「高精度タイマ」「ネットワークカード」「GPU」といったパソコンを構成する主要な部品がPCI、およびその後継規格「PCIe」によって接続される。現代のパソコン用OSを作るうえでは必須の技術。PCIとPCIeは互換性があるためPCIを扱えればよい。

PCIコンフィギュレーション空間

「PCI規格に準拠した機器」が持っている256byteの空間。ここにはPCIデバイスのベンダID(制作会社ごとに割り振られたID)、クラスコード(PCIデバイスの種類を表す数値)などのPCIデバイスに関する基礎的な情報が書かれている。

PCIコンフィギュレーション空間の構造
名称場所説明
Vendor ID0-15bit(1-2byte)
  • 0xffff(無効値)以外でデイバスがあると判断できる。
  • 0x8086:Intel製PCIデバイス
Device ID16-31bit(3-4byte)
Command32-47bit(5-6byte)
Status48-63bit(7-8byte)
Revision ID64-71bit(9byte)
Interface72-79bit(10byte)Programming Interfaceという。レジスタレベルの仕様を表す。
  • 0x20:USB2.0(EHCI)
  • 0x30:USB3.0(xHCI)

APIがソフトウェア同士のインターフェースであるのに対して、ハードウェアに関するインターフェースといえる。
Sub Class80-87bit(11byte)Sub ClassとBase Class合わせてクラスコード
  • Sub Class:細かいデバイス種別
    • 0x03:USB
    • 0x04:PCI-to-PCIブリッジ
  • Base Class:大雑把なデバイス種別
    • 0x0c:シリアル通信コントローラ
    • 0x06:PCI-to-PCIブリッジ

※PCI-to-PCIブリッジの場合には、「Base Address Register2」にセカンダリバスの番号が格納されている。それを参照することで、ブリッジに接続されたデバイスを検索できる
Base Class88-95bit(12byte)
Cacheline Size96-103bit(13byte)
Latency Timer104-111bit(14byte)
Header Type112-119bit(15byte)7bit(先頭1bit)目が1でマルチファンクションデバイスを表す。0でシングルファンクションデバイス。一般的なデバイスはすべて0x00(シングルファンクションデバイス)。
BIST120-127bit(16byte)
これ以下(16byte[0x10~])はPCIデバイスのHeaderTypeにより異なる
Base Address Register 0128-159bit(17-20byte)xHCのレジスタ群が配置されているメモリアドレスが記載されている。xHCを制御するレジスタ群はMMIOとなっていて、MMIOアドレスは「Base ADdress Register 0~1」に記録されている(64bit)。
Base Address Register 1160-191bit(21-24byte)
Base Address Register 2192-223bit(25-28byte)
Base Address Register 3224-255bit(29-32byte)
Base Address Register 4256-287bit(33-36byte)
Base Address Register 5288-297bit(37-40byte)
Cardbus CIS Pointer298-329bit(41-44byte)
Subsystem Vendor ID330-345bit(45-46byte)
Subsystem ID346-361bit(47-48byte)
Expansion ROM Address362-393bit(49-52byte)
Capabilities Pointer362-369bit(53byte)
Reserved370-425bit(54-60byte)
Interup Line426-433bit(61byte)
Interrupt Pin434-441bit(62byte)
Min_Gnt442-449bit(63byte)
Max_lat450-457bit(64byte)
Device dependent region458-1865bit(65-256byte)

CPIコンフィギュレーション空間を読むためには・・・

IOアドレス空間

結論

結果として、CONFIG_ADDRESSを指定してそれに一致するデータを呼び出す。データはデバイスが持っているPCIコンフィギュレーション空間の256byteのデータである。CONFIG_DATAを参照することで、該当のデータが得られる。CONFIG_DATAへはCONFIG_ADDRESSのレジスタオフセットによって移動された箇所のデータが入る。ベンダIDであれば、オフセット0で32bitが呼び出されるため16bitをandすることで算出できる。デバイスIDであれば、オフセット0で32bitが呼び出されるため16bit右シフトすることで算出できる。(ベンダIDは0xffffで無効なベンダID)なのでベンダIDを判定することで実装されていないファンクション番号を特定できる。ファンクション0が実装されていない場合にはバスが存在しない。バス、デバイス、ファンクションの番号をそれぞれ用いて、HeaderTypeを読み込む。HeaderTypeによって16byte目以降が異なる。(一般的なHeaderTypeは0x00になっている)シングルファンクションデバイスかマルチファンクションデバイスかで、


トップへ戻る

MSI割り込み

MSI(Message Signaled Interrupts)

MessageAddressRegisterのフォーマット(x86-64)

名称場所説明
0xfee31:20
Destination ID19:12割り込みを通知するCPUコアの番号(Local APIC ID)を設定する。(LocalAPIC ID:0xfee00020番地のビット31:24にある。これがプログラムで動作しているCPUコアの番号。マルチコアCPUではコアごとに固有のLocal APIC IDが割り振られている。これは割り込みをどのCPUコアに通知するかを指定するために必要。マルチコアでは電源投入時には唯一のコアしか起動していない。他のコアは明示的に起動されるまで停止している。最初に動くコアをBSP(Bootstrap Processor)という。)
予約(Reserved)11:4
Redirection Hint3本書では0を入力。1に設定するとDestination Modeとの組み合わせで柔軟な割り込みの配送が可能となる。
Destination Mode2
XX1:0

MessageDataRegisterのフォーマット(x86-64)

名称場所説明
予約(Reserved)31:16
Trigger Mode15
Level14
予約(Reserved)13:11
Delivery Mode10:8
Vector7:0割り込みベクタ番号を設定する。イベント時にはここに設定した割り込みベクタに対して割り込み処理が発生する。

トップへ戻る


トップへ戻る


トップへ戻る