PCI バス

Virtex-II の Linux で PnP が出来ないか検討した。まずはどのようなリソースを PnP するか?についてだが、そもそも GPIO といった漠然としたものはドライバとして存在しにくい。通常のGPIO でもボードによって違う(スイッチの数やLEDの数など)ので、ちょっとでも構成が違えば物理的に違うデバイスとしなければならない。再配置可能なリソースはメモリマップと割り込みの優先順位。同じデバイスでもこれは変わってくる。
そこで、PCI バスはどうしているのかソースを追ってみた。大分複雑ですべては追いきれないが、デバイス(物理的なもの)とドライバを登録しておく。さらに、ドライバでは受け付ける ID などをあらかじめOSに教えておく。すると、すべてのデバイスをなめて、ID の一致をみたら、該当するドライバの probe ルーチンをコールバックし、そこで、デバイスとドライバの組を決めるようになっていた。
最初、PCI のルーチンをそのまま流用できるかと思ったのだが、ID は PCI のコンフィグ空間を参照するような形になっていたので、そのままでは使えない。
xparameter からマップされたアドレス、サイズ、割り込みの番号を拾ってくればよさそうだ。デバイスを特定する ID は特別に必要そうだ。そのテーブルさえ、出来てしまえば、ドライバの初期化ルーチンで ID をキーにアドレス、サイズ、割り込みの番号を lookup 出来そうだ。う〜む。それだと、結局カーネルのコンパイルが必要になるのか、、、あまりスマートではないな。
PCI の場合はハードウェアが教えてくれるから、マップされた位置がわかるんだよね。その仕組みがないと(そしてそれは難しい)、結局カーネルを作り直すすことにはなるなぁ、、、CAN や RS-232-C のようなコアを複数置けるケースでは楽になるかもしれないな。