[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[pbsd-mg2] Re: GIU-ISA bridge



内田さんの giu-ISA bridge のソースを見せていただきました。

 >  | pcic_vrgiu.c 内で platform ID で場合分けして、hard cording し
 >  | ようと考えていました。
 >  | 今のところ、Everex も MC-R も irq=3 で済んでいるみたいなので
 >  | (irq=3 は通常 pcic の何本かある irq のうち、最も番号が小さいもの)
 >  | ISA-bus で pcic_isa.c でももいいような気もしますが、
 >  | この先、へんな奴が出てくると破綻するような気がします。
 > 
 >  へんな奴が、Vr本来のISAバスを逸脱する(原理的にISAバスにつくPCICでない)
 > のであれば、それはvrip、あるいはvrgiuにつけるのがいいと思います。
 > で、IRQと、GPIOのマップは、これは、vrgiuバスで、そのマップ表(hard cording)
 > を切りかえればOKでは?

ISA バスを逸脱するというのがどういう意味かちょっとかからいないので
すが、割り込みを giu のポートにつなぐだけで OK なのは、ISA バスから
の逸脱といえるのではないでしょうか。

簡単にいうと、MC-R300 や Everex Freestyle の PCIC が2個ついていて、
pcic0 の IRQ3 が GIU の port 9 に、
pcic1 の IRQ3 が GIU の port 10 に接続されているような場合です。
これが、N-N で接続が固定でない場合です。

 >  vrgiubusにはなってないんですが、ちょっと僕のテストカーネルのソースを
 > あげときます。一応ブートするものですが、ソースだけ見るだけのものです。
 > 雰囲気的にこんな感じ...だめかな???
 > ftp://f77.nop.or.jp/users/uch/NetBSD/hpcmips/GIU/

まず、このコードは基本的にいいとおもいます。(私の書いたのよりずっと)
このコードでは、pcic が IRQ3 をカードに割り当てようとした場合、
isa_irq_alloc(chip_tag, IRQ3) を呼び出します。
isa_irq_alloc() の実装は vrgiu.c で行なわれており、
ここで、platform ID を調べて、IRQ3 は giu port 9 だな、っとなるわけですね。

giu port は uniq な識別子として使用できるが、IRQ# は
pcic などのデバイス内でしか uniq でないという問題があります。
ですから、デバイス+irq# → giu port というマッピングが必要に
なります。

ちょっと考えた私の案を書きます。

1. giu の先の isa バス上のデバイスの attach の際に、isa_chip を
   giu の sc ではなく、それぞれ uniq な alloc された小さな構造体
   にして、それぞれのデバイスの区別がつくようにする。
2. それぞれのデバイスは locator 'irq' で giu の port を指定されて
   いるので、その giu port を識別子として、IRQ#<->giu portのマップ
   を1.の小さな構造体からリンクする。
3. isa_irq_alloc() では1.の構造体が第一引数として渡ってくるので、
   N-N のマップを参照して正しい giu port を発見できる。

1.および2.は config_submatch() を使った vrip.c など
でやっている(こ汚い)手段で実現可能です。

どうでしょうか。

Takemura