ThinkPad 240X


研究室の学生が ThinkPad 240X を yahoo オークションで買った.
14万円也. 気合いが入りまくってた奴なので,さっそく Winshit を 消して HDD 12G 全部に FreeBSD 4.1.1-RELEASE を install.
キーボードは最高. ThinkPad いいわぁ. でも問題発生.
  • 音が出ない
  • X が noaccel でしか起動しない
音源チップは Crystal Semiconductor の CS4281 ってやつを使ってて Soundblaster 互換って書いてあったから

options PNPBIOS
device pcm
device sbc

でいけるかと思ったんだけど,さっぱり認識せず.
じゃあ, csa0 を 使うように真っ向勝負だ!! と思ってソースを見てみると, /sys/dev/sound/pci/csareg.h に CS4281_PCI_ID って define だけ されてる. csa_probe() には全く書いてない. 強引に認識するように csa.c の csa_probe() をごちょごちょいじるも,どうやら csa_attach() の resp->mem に NULL が入ってアウト.
resp->mem_rid に CS461x_MEM_OFFSET を入れてるのが違うのか, もはや手が出ず. サウンドはとりあえずあきらめ.

ビデオチップは SMI の LynxEM+ とか言う奴らしい. 最近は結構いろんな ノートで使われてるみたい. ThinkPad 240X では日によって noaccel でも 起動したり,しなかったりするらしい. ほんとか?
とりあえず X が noaccel なのはどーしても許せん. xengine で 泣ける値をたたき出す. 遅すぎ. nomads とかを検索しても世の中の人は みーんな noaccel で我慢してるらしい. まじ? うそでしょー.
いやでしょー. いじるでしょー.

とりあえず,なんとなくの予想としては,
  • noaccel にすると多くの acceleration が無効になるらしい.
  • accel にして,なんとか option で critical なものだけ無効に出来な いか?
と考えて,ソースを読む.
xc/programs/Xserver/hw/xfree86/common/xf86_Option.h
に, XF86Config に書ける option 一覧があった. ふーん. man より 多い気がするぞ. で,ここにある option を片っ端から試す. でも 結局ぜーんぜんうまくいかない. ということで
  • noaccel で無効になる acceleration のうち, 全部を無効にする必要はないだろー.
  • でも option では制御できなーい. noaccel を指定したら 複数の acceleration が無効になっちゃう.
  • じゃあソースをいじって, accel な状態で 一部の critical な acceleration を 無効にして,他の acceleration は有効のままにすべし.
と,考えてソースを読む.
xc/programs/Xserver/hw/xfree86/vga256/drivers/smi/smi_accel.c
に LynxEM+ のアクセラレーションのコードがあった. そのなかの アクセラレーションをかたっぱしから無効にして, make して,試して... を繰り返して,ついに「安定しててそこそこ速い」X ができた. 以下の4つに問題があったらしい.

xf86AccelInfoRec.SetupForScreenToScreenCopy
xf86AccelInfoRec.SubsequentScreenToScreenCopy
xf86AccelInfoRec.SetupForFillRectSolid
xf86AccelInfoRec.SubsequentFillRectSolid

で,これらを無効にするパッチ. XFree86 3.3.6 用っす. 4.0.1 には SMI のコードが無いらしい.

% cd $somewhere/xc/programs/Xserver/hw/xfree86/vga256/drivers/smi
% patch < smi.accel.patch

make World した新しい XF86_SVGA を install して, XF86Config の Section "Device" には

Option xaa_no_color_exp
Option no_pixmap_cache
Option pci_burst_on
Option speedup "all"

を付ける. これで以前の noaccel な X と比べて xengine で倍以上速くなった. めでたい. 学生も大喜び. 本当は X の acceleration をまともに直すべきなんだけど, 技量がないのでこれにて終了.
サウンドはまた今度,暇になったらね.

Generated with mkdiary.pl
Back to my diary