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 に offset と generation をリセットしなければならないことが分かります。
- PCI_GETCONF_MORE_DEVS
- これは、バッファができるだけ基準に一致するデバイスリストの中の残っているデバイスのすべてを保持するために十分大きくなかったとユーザに伝えます。リスト中に残っているデバイスのいずれもユーザの基準に一致しないときでさえ、この状態を返さすことができます。
- PCI_GETCONF_ERROR
- これは、ユーザの要求を行なっている間の一般的なエラーを示します。 pat_buf_len が sizeof( 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 ではじめて登場しました。作者
<ken@FreeBSD.org>バグ
別の方法で現世代の番号を知る方法が全くないので、ユーザが少なくとも一度 PCIOCGETCONF を呼び出さないでデバイスリスト中に正確なオフセットを指定することはできません。もっとも、ユーザがパターンかカーネルに一致するパターンを指定することによって容易にそれらの検索を狭くすることができるので、これは、たぶん深刻な問題ではありません。January 3, 2008 | FreeBSD |