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

Re: OpenBlockSS



<20031226075914Y.masuda@tcp-ip.or.jp>の記事において
masuda@tcp-ip.or.jpさんは書きました。

> ちょっと前までconfigで吸収できるようにコードの変更が行なわれていた様に
> 見ていましたが(何度も言うけど最近サボっているので見てない)。理想系はや
> はりそこにあると思います。高々代入する数値の問題なので、
> 
> options	COM_FREQ=\"hoge\"
> 
> で充分だと思う。(というか、そうなるべきだ)

これなんですが、まず COM_FREQ は sys/dev/ic/comreg.h で
define されてる値なので config で直接 override はできません。
別のマクロ名を使うにしても、 walnut は COM_FREQ * 6、
opb が COM_FREQ * 4 と個別に決まっている値にもかかわらず
それを config 中で別に定義しなきゃいけなくなるわけで、
そうなるとその整合性を手動で確認しないといけなくなるので
それではソースを一つにまとめる意味があまりないと思います。

そもそも consinit() なんて操作は本質的にマシン依存なので
今の形のままでまとめてしまってもあまり意味はないと思います。
仮に今の {walnut,opb405}/consinit.c を evbppc/consinit.c とか
ibm4xx/consinit.c へまとめたとしても VGA console の explora450 や
ibmnws では使えないわけですし。

NetBSD的(?)にきっちりやるとするならば arc がやっているように

(1)マシン依存の consinit() を指す関数ポインタ (consinit_machdep() とか)
   を evbppc_machdep.c あたりに用意する
(2)マシン個別の初期化関数(obs405/machdep.c:initppc()とか)内で
   (1)の関数ポインタに各ボード別の consinit 関数
   (例えば consinit_explora()とか)を設定する
(3)evbppc 共通の consinit() 関数は evbppc_machdep.c の中に置いて
   上記の (*consinit_machdep)() を呼ぶだけにする
(4)今の {walnut,opb405}/consinit.c の consinit() で
   行っている処理は com_opb_cnattach() かなんかに名前を変えて
   arch/powerpc/ibm4xx/dev/com_opb.c の中に入れてしまう
   (周波数指定は清原さんのパッチのように com_freq の変数に直して、
    com_freq の値も各ボード依存初期化部で設定する)
(5)各マシン依存の (*consinit_machdep)() ではそれぞれに応じた処理を書く。
    walnut や obp405 のように com_obp しかないマシン用には
    上記の com_opb_cnattach() を呼ぶだけの関数をどこかに用意して
    それを共用すればよい。

……てな感じでここまで MI/MD を分ければ誰からも
文句は出ないんじゃないでしょうか。
#単一のカーネルですべての機種をサポートするわけじゃないので
#struct platform のような構造を導入するかどうかは微妙ですねえ。

ま、そこまでやる意味があるかどうかは別の問題ですけど、
清原さんの PR が拾われないのは まだなんか違う、
と思われてるからのような気がします。
---
Izuim Tsutsui
tsutsui@ceres.dti.ne.jp