PCICONF(8)

名称
pciconf - PCI バスのための診断ユーティリティ

書式
pciconf -l [-v] pciconf -a selector pciconf -r selector [-b | -h] sel addr[:addr] pciconf -w selector [-b | -h] sel addr[value]

解説
pciconf コマンドは、 /dev/pci の ioctl(2) インタフェースにより提供されている機能への コマンドラインインタフェースを提供します。 -l オプションを付けると、ブート時のプローブにより見つかったすべてのデバイスを 以下の書式で表示します:

    foo0@pci0:4:0: class=0x010000 card=0x00000000 chip=0x000f1000 rev=0x01 hdr=0x00
    bar0@pci0:5:0: class=0x000100 card=0x00000000 chip=0x88c15333 rev=0x00 hdr=0x00
    none0@pci0:6:0: class=0x020000 card=0x00000000 chip=0x802910ec rev=0x00 hdr=0x00

-v オプションを指定すると、 pciconf はベンダ/デバイス情報をデータベースからの読み取りを試み、 各デバイスに対してベンダ、デバイス、クラス、サブクラスの 識別文字列を表示します。

最初の欄は、デバイス名、ユニット番号、 セレクタ を表示します。 対象の PCI デバイスに関して、カーネル内のデバイスの設定がなされていない場合、 デバイス名は “none” になります。 設定されていないデバイスのユニット番号は 0 から開始し、 設定されていないデバイスに出会う度に増やされます。 セレクタ は、このコマンドの他の書式で直接使えるような形で表示されます。 2 番目の欄はクラスコードで、2 桁の 16 進数で表されるクラスバイトと サブクラスバイト、インタフェースバイトからなります。 3 番目の欄は PCI 規格のリビジョン 2.1 で導入されたサブベンダ ID レジスタの内容です。 今日のほとんどの PCI カード (2.0) ではこれは 0 となりますが、新しく開発された PCI カードではそのカード固有の識別コード (unique card identification code) が入れられます。この値は上位 2 バイトのカード ID と、 下位 2 バイトのカードベンダ ID から構成されます。

4 番目の欄にはこのカードがどのチップに基づいているか識別する チップデバイス ID が含まれます。この値は上記と同様に二つの フィールドに分けられ、チップとベンダを識別します。 5 番目の欄はチップのリビジョンを表示します。 6 番目の欄はヘッダタイプを示します。 現在割り当てられているヘッダタイプは PCI - PCI ブリッジのチップが 1 となる以外はすべて 0 となります。 ヘッダタイプレジスタが 0 となっている PCI デバイスの最上位ビットがセットされていると、そのデバイスは 多機能 (multi-function) デバイスであり、ひとつのチップにいくつかの (似たものかもしれないし、 まったく異なるものかもしれない) 機能を備えています。

-l オプションは root ではないユーザが使うことのできる唯一のものです。 pciconf を他の方法で実行するには pcibus:device (オプションで :function が続きます) という形式で セレクタ を指定する必要があります。 最後にコロンを付けても構いませんが無視されますので、 pciconf -l の出力の最初の欄をそのまま使うことができます。 すべての番号は 10 進数で表します。

-a フラグを付けると、 selector で識別したデバイスになんらかのドライバが割り当てられているかを、 pciconf は判定します。 終了状態 0 はデバイスがドライバを持つことを意味します; 非 0 はデバイスがドライバを持たないことを意味します。

-r オプションはデバイス selector のバイトオフセット reg の所のコンフィギュレーションスペースレジスタ (configuration space register) を読み取り、 その値を 16 進数で表示します。 省略可能な第 2 引数 reg2 は、読み取る範囲を指定します。 -w オプションはデバイス selector のバイトオフセット reg の所のコンフィギュレーションスペースレジスタへ value を書き込みます。 この二つのオプションでは、 -b フラグと -h フラグで読み書きの大きさを指定できます。 -b は 1 バイトの読み書きを行い、 -h は 2 バイト (halfword) の読み書きを行います。 読み書きの大きさのデフォルトは 4 バイト (longword) です。

環境変数
通常、PCI ベンダ/デバイスの情報データベースは、 /usr/share/misc/pci_vendors から読み込まれます。 環境変数 PCICONF_VENDOR_DATABASE を設定することにより、このパスを変更可能です。

関連項目
ioctl(2), kldload(8)

歴史
pciconf コマンドは FreeBSD 2.2 で初めて登場しました。 -a オプションは PCI KLD サポートのために FreeBSD 3.0 で追加されました。

作者
-nosplit pciconf は Stefan Esser と Garrett Wollman によって書かれました。

バグ
-b オプションと -h オプションは pciconf の内部で実装されており、 ioctl(2) に基づいているわけではありません。

root ではないユーザが -a オプションと -r オプションを使うことを許可することは有用かもしれませんが、 KLD ドライバでデバイスを供給するために kldload を実行できるのは root だけでしょうし、 一部の粗悪な PCI チップではコンフィギュレーションスペースレジスタの 読み込みが故障を引き起こす場合があるのです。