top page > X Window System > here

AT 互換機における X.Org 7 系 (driver)


概要

ここでは AT 互換機のための各々の driver の使用法について詳しく述べます.


目次

1. AT 互換機における X の特徴
2. mga
3. neomagic
4. savage
5. nv, nouveau
6. intel
7. vesa

1. AT 互換機における X の特徴

1.1  概要

driver は元々 AT 互換機のために作られているので,素直に動作します. ただし,様々な形で制約があることが多いので要注意です. すなわち,

  • 必ずしも全ての Card がサポートされているわけではない. (例えば Matrox の P 系列等.)
  • 機能に制約がある場合がある. (例えば Savage2000 で 3D をサポートしていない等.)
  • (うちの PC では) DDC1 はうまく動作しない.

これらの問題は,人手不足,資料不足等々の事情から進展しないでいる間に Card 自体が古くなってしまうという形で解決しないままになっている場合が多いです.

1.2  安定性に関する問題

以下に記す問題は,FreeBSD 7.4, 8.3 にて mga, savage, nv において生じました. (他の Card や driver でも生じないとは言い切れません.)

ImPS/2 マウスを使う場合,その Protocol"auto" (自動検出) に設定すると log にて以下の 2 行が延々と繰り返されることがあります.

(II) Mouse autoprobe: Changing protocol to ImPS/2
(II) Mouse autoprobe: Changing protocol to ExplorerPS/2

すなわち "ImPS/2""ExplorerPS/2" の間を行き来して log が増え続け,動作が緩慢になります. また X Server (Xorg) の CPU はほぼ 100% になります. (必ずそうなるわけではないし,その一方で使っている途中に突然そうなることもあり,悩ましいです.)
  また,Protocol"ImPS/2" もしくは "ExplorerPS/2" と指定するとマウスの動作がおかしくなります. "PS/2" に設定すれば正常に動作しますが,wheel は使えなくなります.

原因は不明ですが,私の経験則として,X や Window Manager も含めて起動中の Window の描画が完全に終わっていない状態でマウスを動かすとこうなることが多いようです. また,cursor は HW よりも SW にした方が問題が生じ難いですが,生じなくなるわけではありません.

2. mga

mga driver は,かっては Matrox から直接提供されていたものもあったのですが,数年前から更新されなくなりました.[1] ここでは X.Org の方の mga driver について記します. これは現在でも更新されています.

なお,P 系列 (P650, P750, P690) のためには,Matrox から mtx driver が提供されていました. ただしこれは Linux 用であり,FreeBSD 用のものはありません. 現在ではこれも更新されなくなくなりました.[2]

Matrox G200 (PCI) に対しては xorg.conf は次のようにします.

Section "Device"
   Identifier "MGA Millennium G200"
   Driver     "mga"

#  Option     "NoDDC"
#  Option     "NoDDC1"
#  Option     "NoDDC2"
#  Option     "Int10"  "off""

   Option     "DRI"    "off""    ← PCI でなく AGP ならば DRI を使えるかも.

   BusID      "PCI:0:1:0"
Endsection

log は次のようになります.

(--) MGA(0): Video BIOS info block at offset 0x07540
(==) MGA(0): VideoRAM: 8192 kByte
(==) MGA(0): Write-combining range (0xa0000,0x10000) was already clear
(II) MGA(0): I2C bus "DDC P1" initialized.
(II) MGA(0): I2C device "DDC P1:E-EDID segment register" registered at address 0x60.
(II) MGA(0): I2C device "DDC P1:ddc2" registered at address 0xA0.
(II) MGA(0): I2C Monitor info: 0x28750c00
(ここで取得したモニターの情報が xf86PrintEDID() により出力される.)
(II) MGA(0): end of I2C Monitor info           ← この後に vbe は load されない.
(II) MGA(0): EDID vendor "ENC", prod id 5673   ← 以下,xf86SetDDCproperties() の出力が続く.
(II) MGA(0): Using hsync ranges from config file
(II) MGA(0): Using vrefresh ranges from config file
(II) MGA(0): Printing DDC gathered Modelines:
(II) MGA(0): Modeline "1280x1024"x0.0  108.00  1280 1328 1440 1688  1024 1025 1028 1066
    +hsync +vsync (64.0 kHz)
(xf86SetDDCproperties() の出力の終りまで略)
(==) MGA(0): Using gamma correction (1.0, 1.0, 1.0)

"NoDDC" にすれば次のようになります.

(--) MGA(0): Video BIOS info block at offset 0x07540
(==) MGA(0): VideoRAM: 8192 kByte
(==) MGA(0): Write-combining range (0xa0000,0x10000) was already clear
(II) MGA(0): I2C bus "DDC P1" initialized.
(II) MGA(0): I2C Monitor info: 0x0     ← ddc2 が disable にされているので 0 である.
(II) MGA(0): end of I2C Monitor info   ← 即座に終わる.
(II) MGA(0): DDC Monitor info: 0x0     ← ddc1 が disable にされているので 0 である.
(II) MGA(0): end of DDC Monitor info   ← 即座に終わる.
(II) Loading /usr/local/lib/xorg/modules//libvbe.so
(II) Module vbe: vendor="X.Org Foundation"
        compiled for 1.6.1, module version = 1.1.0
(II) Loading /usr/local/lib/xorg/modules//libint10.so
(II) Module int10: vendor="X.Org Foundation"
        compiled for 1.6.1, module version = 1.0.0
(II) MGA(0): initializing int10
(==) MGA(0): Write-combining range (0xa0000,0x20000) was already clear
(==) MGA(0): Write-combining range (0xc0000,0x40000) was already clear
(II) MGA(0): Primary V_BIOS segment is: 0xc000
(==) MGA(0): Write-combining range (0x0,0x1000) was already clear
(II) MGA(0): VESA BIOS detected
(==) MGA(0): Write-combining range (0x0,0x1000) was already clear
"VBE DDC Monitor info:" が現われないので,vbe は情報の取得に失敗している.
xf86SetDDCproperties() からも,何も実行されずに戻る.
(==) MGA(0): Using gamma correction (1.0, 1.0, 1.0)

mga driver 1.6.2 (そしておそらくそれ以後) においては,xorg.conf に以下の内容を加える必要があります.

Section "Module"   ← 既に存在するなら,新設する必要はない.
   Load  "xaa"
EndSection

そうでないと,log に以下のように出力されて X server が終了してしまいます.

/libexec/ld-elf.so.1: /usr/local/lib/xorg/modules/drivers/mga_drv.so: Undefined symbol "XAACreateInfoRec"
xinit: giving up

[1] Matrox が提供する mga driver は以下のところにあります.

ftp://ftp.matrox.com/pub/mga/archive/linux/2006/matrox_driver-x86_32-src-4.4.0.tar.gz  (source)
                                                matrox_driver-x86_32-4.4.0.tar.gz      (binary)

binary 版は ports/x11-servers/mga_halmake install することにより導入することができますが,依存する X は X.Org 6.9.0 です. (なぜこの状態で ports に残っているのかは不明.)

source の方も,対応しているのは X.Org 7.0 および XFree86 4.3.0 までです.

[2] mtx driver は以下のところにあります. ただし,Linux 用の古い binary しかありません.

http://projects.tuxx-home.at/?id=matrox_drivers

3. neomagic

FreeBSD 6.2 + X.Org 6.9.0 にて動作を確認しています. xorg.conf は次のようにします.

Section "Device"
   Identifier "NM128"
   Driver     "neomagic"

#  Option     "NoDDC"        # not used
   Option     "Int10" "off"
   Option     "override_validate_mode"
   Clocks      25.20 28.30 40.00
#  BusID      "PCI:0:14:0"
EndSection

log は次のようになります.

(--) NEOMAGIC(0): Panel is a 800x600 color TFT display

(II) Loading /usr/X11R6/lib/modules/libvbe.so
(II) Module vbe: vendor="X.Org Foundation"
        compiled for 6.9.0, module version = 1.1.0
(II) Loading /usr/X11R6/lib/modules/libint10.so
(II) Module int10: vendor="X.Org Foundation"
        compiled for 6.9.0, module version = 1.0.0
(II) NEOMAGIC(0): initializing int10

(II) NEOMAGIC(0): Primary V_BIOS segment is: 0xc000   ← "Int10" "off" は効いていない.
(II) NEOMAGIC(0): VESA BIOS detected
(II) NEOMAGIC(0): VESA VBE DDC supported
f000:a68c: 01 ILLEGAL EXTENDED X86 OPCODE!

(II) NEOMAGIC(0): I2C bus "I2C bus" initialized.
(II) NEOMAGIC(0): I2C device "I2C bus:ddc2" registered at address 0xA0.
(II) NEOMAGIC(0): I2C device "I2C bus:ddc2" removed.
(--) NEOMAGIC(0): No DDC signal

(WW) NEOMAGIC(0): Option "Int10" is not used   ← "Int10" "off" が効くのはここから.

int10 に関連してエラーが出ていますが,動作に悪影響はないようです. (他のボードでは,ここで動作が止まる場合が多い.)

4. savage

この driver は Savage2000 に対しては 3D をサポートしておりません. それゆえ mplayer にて -vo xv (default) を使うと画面全体の表示がおかしくなります.

AGP でなく PCI だからかもしれませんが,DRI は使えません. /boot/loader.confdrm_load="YES" を設定しても何も検知してくれません. (この部分はマニュアルの記述がすごく曖昧なので,使えるという期待を抱いてしまうのですが....)

Savage4, Savage2000 に対しては xorg.conf は次のようにします.

Section "Device"
   Identifier "GA-S2K32/PCI"
   Driver     "savage"

#  Option     "DRI"  "off""

#  Option     "sw cursor"

   BusID      "PCI:0:1:0"
Endsection

以下の log は Savage2000 の例です.

(==) SAVAGE(0): Using video BIOS to set modes
(II) Loading /usr/local/lib/xorg/modules//libvbe.so
(II) Module vbe: vendor="X.Org Foundation"
        compiled for 1.6.1, module version = 1.1.0
        ABI class: X.Org Video Driver, version 5.0
(II) Loading /usr/local/lib/xorg/modules//libint10.so
(II) Module int10: vendor="X.Org Foundation"
        compiled for 1.6.1, module version = 1.0.0
        ABI class: X.Org Video Driver, version 5.0
(II) SAVAGE(0): initializing int10
(==) SAVAGE(0): Write-combining range (0xa0000,0x20000) was already clear
(==) SAVAGE(0): Write-combining range (0xc0000,0x40000) was already clear
(II) SAVAGE(0): Primary V_BIOS segment is: 0xc000
(==) SAVAGE(0): Write-combining range (0x0,0x1000) was already clear
(II) SAVAGE(0): VESA BIOS detected

(==) SAVAGE(0): Using gamma correction (1.0, 1.0, 1.0)
(--) SAVAGE(0): probed videoram:  32768k
(--) SAVAGE(0): No DDC signal
(II) SAVAGE(0): I2C bus "I2C bus" initialized.
(II) SAVAGE(0): I2C device "I2C bus:E-EDID segment register" registered at address 0x60.
(II) SAVAGE(0): I2C device "I2C bus:ddc2" registered at address 0xA0.

(II) SAVAGE(0): EDID vendor "ENC", prod id 5673

(--) SAVAGE(0): Detected current MCLK value of 150.341 MHz
(--) SAVAGE(0): Found 19 modes at this depth:

(II) Reloading /usr/local/lib/xorg/modules//libint10.so
(II) SAVAGE(0): initializing int10
(==) SAVAGE(0): Write-combining range (0xa0000,0x20000) was already clear
(II) SAVAGE(0): Primary V_BIOS segment is: 0xc000
(==) SAVAGE(0): Write-combining range (0x0,0x1000) was already clear
(II) SAVAGE(0): VESA BIOS detected

(--) SAVAGE(0): Detected current MCLK value of 150.341 MHz
(--) SAVAGE(0): Found 19 modes at this depth:
    [10f] 320 x 200, 70Hz

(II) SAVAGE(0): EIZO FlexScan L461: Using hsync range of 31.50-80.00 kHz
(II) SAVAGE(0): EIZO FlexScan L461: Using vrefresh range of 50.00-75.00 Hz
(II) SAVAGE(0): EIZO FlexScan L461: Using maximum pixel clock of 140.00 MHz
(II) SAVAGE(0): Clock range:  10.00 to 220.00 MHz
SavageValidMode
(--) SAVAGE(0): Chose mode 11b at 75Hz.

(EE) SAVAGE(0): DRI isn't enabled
SavageModeInit(1280x1024, 135000Hz)
(--) SAVAGE(0): DCLK is 135.000 MHz
(--) SAVAGE(0): Chose mode 11b at 75Hz.
SavageWriteMode(11b)

なお,デジタル出力は console, X 共に特別な設定なしに使えています.

5. nv, nouveau

FreeBSD においては,NVIDIA 用の driver として三つの選択肢があります. すなわち,

  1. nv (ports/x11-drivers/xf86-video-nv)
  2. nouveau (ports/x11-drivers/xf86-video-nv)
  3. nvidia (ports/x11/nvidia-driver etc.)

資料がないので,FreeBSD のユーザーがどれを好んで選んでいるのか分かりません. 一方,Linux では標準として nouveau が採用されているようです. (かつ,容易に nvidia を導入できるようになっているようです.[1])

私は PC-98 にて GeForce2 MX400 を動かしたいので,ソースを修正することができる nvnouveau を選びました.[2][3][4]

GeForce2 MX400 に対しては,xorg.conf は次のようにします.

Section "Device"
   Identifier "GF2MX400"
   Driver     "nv"
#  Driver     "nouveau"

#  Option     "sw cursor"

   BusID      "PCI:0:1:0"
Endsection

[1] FreeBSD にて nvidia driver を使うためには Linux emulator を導入する必要があります.
  FreeBSD native な driver を供給して欲しいものです. (それを言うなら Flash や acroread も....)

[2] GeForce2 MX400 には VGA BIOS を off にする機能はありませんが,「偶然にも」それが PC-98 の BIOS とかち合わないので,無改造で PC-98 で使えます. (すなわち,OS は起動します.) X を使う場合には,当然ながら driver の修正が必要です.

[3] PC-98 への移植は,現時点で nv だけしか試みておりませんが,非常に困難です. 初期化が何もされていないのが辛いです.

[4] nouveau は,make install する際に OS の kernel を修正するよう指示されるのですが,それを行なわなくても動きます. (そもそも,その修正用の patch が古いのです.) ただし,それだと drm は動作しません.

6. intel

Pineview にて動作を確認しています. xorg.conf は次のようにします.

Section "Device"
   Identifier "Pineview"
   Driver     "intel"

#  Option     "sw cursor"

   BusID      "PCI:0:2:0"
Endsection

また,drm を動かすために boot/loader.conf に次の内容を追加します. (drm がないなら,graphics/libdrm を導入します.)

drm_load="YES"

7. vesa

Matrox G200, Savage4, Savage2000, GeForce2 MX400, Pineview にて動作を確認しています. xorg.conf は次のようにします.

Section "Device"
   Identifier "MGA Millennium"
   Driver     "vesa"

#  Option     "sw cursor"

   BusID      "PCI:0:1:0"
Endsection

多くのカードに対応している一方で,各々のカード専用の driver に比べて動作が遅い,カードのビデオ再生機能が (備わっていても) 利用できない,解像度の選択肢が制限されるなどの弱点があります. カード専用の driver が未対応だったり動作に致命的な欠陥がある場合にお世話になる,という位置付けでしょう.