EN JA
PCI(4)
PCI(4) FreeBSD Kernel Interfaces Manual PCI(4)

名称

pci一般的な PCI ドライバ

書式

device pci

解説

pci ドライバは、ユーザランドプログラムが PCI 設定レジスタを読み書きする方法を提供します。また、それは、ユーザランドプログラムがすべての PCI デバイスまたは様々なパターンに一致する PCI デバイスのリストを得る方法を供給します。

pci ドライバが PCI 設定レジスタのための書き込みインタフェースを提供するので、システム管理者は、 pci デバイスへのアクセスを承諾するとき用心するべきです。不適切に使用されるなら、このドライバは、ユーザランドアプリケーションにマシンの破壊かデータの損失を起こさせることができます。

pci ドライバは、カーネル内の PCI バスを実装しています。それは、 PCI バスで任意のデバイスを列挙し、それらにアタッチする機会を PCI クライアントドライバに与えます。それは、BIOS が割り当てないとき、リソースを子供に割り当てます。必要なときに、それは、ルーティング割り込みを管理します。 PCI クライアントドライバが実行時に動的にロードされるとき、アタッチを解除された PCI 子供を再プローブします。

カーネルの設定

pci デバイスは、「書式」セクションに記述されているようにカーネルに含まれています。 kld(4) として pci ドライバを構築することはできません。

IOCTL

次の ioctl(2) 呼び出しは、 pci ドライバによってサポートされます。それらは、ヘッダファイル < sys/pciio.h> で定義されます。
PCIOCGETCONF
この ioctl(2) は、 pci_conf_io 構造体を取ります。ユーザは、システムのすべての PCI デバイスで、またはユーザによって供給されたパターンに一致した PCI デバイスで情報を検索して取得できます。呼び出しは、 copyin(9)copyout(9) のいずれかで指定されたどんな値にも errno を設定するかもしれません。 pci_conf_io 構造体は、次の多くのフィールドから構成されています:
pat_buf_len
ユーザによって供給されたパターンで埋められたバッファのバイト単位の長さ。
num_patterns
ユーザによって供給されたパターンの数。
patterns
ユーザによって供給されたパターンで満たされたバッファへのポインタ。 patterns は、 num_patterns pci_match_conf 構造体へのポインタです。 pci_match_conf 構造体は、次の要素から構成されています:
pc_sel
PCI ドメイン、バス、スロットと機能。
pd_name
PCI デバイスドライバ名。
pd_unit
PCI デバイスドライバユニット番号。
pc_vendor
PCI ベンダ ID。
pc_device
PCI デバイス ID。
pc_class
PCI デバイスクラス。
flags
フラグは、カーネルのどのフィールドに一致すべきであるかを記述します。デバイスは、返されるすべての指定されたフィールドに一致しなければなりません。一致フラグは、 pci_getconf_flags 構造体で列挙されます。願わくは、フラグの値は、詳細に説明される必要がないほど明白です。
match_buf_len
PCIOCGETCONF 問い合わせの結果を保持するためにユーザによって割り付けたられた matches バッファの長さ。
num_matches
カーネルによって返される一致の数。
matches
カーネルによって返される一致デバイスを含むバッファ。このバッファの中のアイテムは、次のアイテムから構成されるタイプ pci_conf です。
pc_sel
PCI ドメイン、バス、スロットと機能。
pc_hdr
PCI ヘッダタイプ。
pc_subvendor
PCI サブベンダ ID。
pc_subdevice
PCI サブデバイス ID。
pc_vendor
PCI ベンダ ID。
pc_device
PCI デバイス ID。
pc_class
PCI デバイスクラス。
pc_subclass
PCI デバイスサブクラス。
pc_progif
PCI デバイスプログラミングインタフェース。
pc_revid
PCI リビジョン ID。
pd_name
ドライバ名。
pd_unit
ドライバユニット番号。
offset
オフセットは、デバイスリストを横断し始めるべきであるところでカーネルに伝えるためにユーザによって渡されます。カーネルによって渡された値は、最後の 1 つが返された直後のレコードを指します。ユーザは、 PCIOCGETCONF ioctl へのその後の呼び出しにおいてカーネルによって返された値を渡すことができます。ユーザがオフセットを使用しないつもりであるなら、それは、0 に設定しなければなりません。
generation
PCI 設定世代。この値は、オフセットが設定される場合にだけ設定される必要があります。カーネルは、ユーザが最後の PCIOCGETCONF ioctl を呼び出し以来、デバイスリストが変化しているかどうか決定するためにユーザによって渡された内部のデバイスリストの現世代の番号を比較します。デバイスリストが変化したなら、 PCI_GETCONF_LIST_CHANGED の状態が戻されます。
status
status は、デバイスリストのための要求の傾向をユーザに伝えます。指定できる status の値は、次の通りです:
PCI_GETCONF_LAST_DEVICE
これは、 matches バッファ中で返された後に、PCI デバイスリストには、それ以上のデバイスが全くないことを意味します。
PCI_GETCONF_LIST_CHANGED
この状態から、 PCIOCGETCONF ioctl への最後の呼び出し以来 PCI デバイスリストが変化しており、そしてリストの始めにやり直すために 0 に offsetgeneration をリセットしなければならないことが分かります。
PCI_GETCONF_MORE_DEVS
これは、バッファができるだけ基準に一致するデバイスリストの中の残っているデバイスのすべてを保持するために十分大きくなかったとユーザに伝えます。リスト中に残っているデバイスのいずれもユーザの基準に一致しないときでさえ、この状態を返さすことができます。
PCI_GETCONF_ERROR
これは、ユーザの要求を行なっている間の一般的なエラーを示します。 pat_buf_lensizeof( struct pci_match_conf) の num_patterns 倍と等しくないなら、 errno は、 EINVAL に設定されます。
PCIOCREAD
この ioctl(2) は、渡された pci_io 構造体によって指定された PCI 設定レジスタを読み込みます。 pci_io 構造体は、次のフィールドから構成されます:
pi_sel
ユーザが問い合わせしたいドメイン、バス、スロットと機能を指定する pcisel 構造体。特定のバスが見つけられないなら、 errno は、 ENODEV に設定され、 ioctl から -1 が返されます。
pi_reg
ユーザがアクセスしたい PCI 設定レジスタ。
pi_width
ユーザは、読み込みたいデータのバイト単位の幅。この値は、1、2 または 4 のいずれかです。 3 バイトの読み込みと 4 バイトより大きい読み込みはサポートされません。無効の幅が渡されるなら、 errno は、 EINVAL に設定されます。
pi_data
カーネルによって返されるデータ。
PCIOCWRITE
この ioctl(2) は、渡された pci_io 構造体で指定された PCI にユーザが書き込めるようにします。 pci_io 構造体は、上記に説明されています。読み込みレジスタのための上記に説明されたデータ幅の制限は、 PCI 設定レジスタの書き込みも適用されます。

関連ファイル

/dev/pci
pci ドライバのためのキャラクタデバイス。

関連項目

pciconf(8)

歴史

pci ドライバ (カーネルの PCI サポートコードでない) は、 FreeBSD 2.2 ではじめて登場し、 Stefan Esser と Garrett Wollman によって書かれました。デバイスのリストとマッチングのサポートは、 Kenneth Merry によって再実装されて、 FreeBSD 3.0 ではじめて登場しました。

作者

Kenneth Merry <ken@FreeBSD.org>

バグ

別の方法で現世代の番号を知る方法が全くないので、ユーザが少なくとも一度 PCIOCGETCONF を呼び出さないでデバイスリスト中に正確なオフセットを指定することはできません。もっとも、ユーザがパターンかカーネルに一致するパターンを指定することによって容易にそれらの検索を狭くすることができるので、これは、たぶん深刻な問題ではありません。
January 3, 2008 FreeBSD