[ TOP | Recently ]

2008-02-20 Xorg 1024x600 on SA5SX04A

ひきつづき XorgのAMDドライバを動かすべく修正。こいつはx86のMSRレジスタの読み書きを必要とする。
linuxでは /dev/cpu/0/msr とかで userland から簡単に MSR レジスタを read/write できるのだが、NetBSDにはそんなの無いょ…
でも sys/arch/i386/cpufunc.S には rdmsr() と wrmsr() なる関数があるので、こいつを使えば問題なし! というわけで、あとはインターフェイスの問題。

おそらくちゃんと(NetBSDっぽく)実装するには、sysarch(2) を使って sysarch(X86_GET_MSR,...) みたいに作るのが正解なのだろうが、試しにやってみるだけなのと、read/write用の関数作るのがめんどくさかったので sys/arch/i386/i386/mem.c に minor番号の違うデバイスを作ってやることにした。
(この方法だと xf86-video-amd-2.7.7.6/src/amd_msr.c をほとんど変更せずに済むし…)

適当なマイナー番号を定義して、そいつにアクセスすると rdmsr()/wrmsr() するコードを追加。mknod /dev/cpu/msr c 2 13 して、/dev/cpu/msr で MSR レジスタをちゃんと読み書きできていることを確認しつつ、Xorg 起動…失敗。ううむ。
MSR読み書きの所は進むようになったが、その先で止まってしまった。

色々試してみたら、1024x768 にするとチラつきながらも画面が表示されるので、どうも設定している周波数の問題っぽい。グーグル先生と相談しつつ、Kohjinsha SA1F00 Users groupを見たら Xorg の 1024x600 用の ModeLine があったので、コピペして起動。おー1024x600が表示されたー。

というわけで、良い子は真似してはいけないquick hackと、xorg.conf
xf86-video-amd-2.7.7.6/src/amd_msr.c は /dev/cpu/0/msr を /dev/cpu/msr にして lseek64 を lseek にすればいいだけなので省略。(z4l.cはmakeする必要なし)

そのうちちゃんと sysarch(2) を使うように書き直そう。


EOF