jens.hatlak.de / Über mich      
Atari   PHP      
Dreamweaver Manual   Linux / R40 / Debian    
Akronyme   Mozilla   Notebook / Dualhead/DRI  
  SciTE   Samba   MergedFB  
  FASTA-Parser   Archos    
  Ich spreche...   Genius EM700    

SiS 630 Merged Framebuffer

MergedFB Der letzte Schrei in Sachen sis-Treiber für Linux ist sicherlich der Merged Framebuffer. Noch nie was davon gehört? Gut möglich, denn das ist ein spezielles und v.a. recht neues Feature von Thomas Winischhofers sis-Treiber. Wie wir im Folgenden sehen werden, erfordert dessen Aktivierung unter SuSE 8.1 allerdings einige Modifikationen, u.a. das Aktualisieren auf XFree 4.3, da es für SuSE 8.1 keine Binärpakete für XFree 4.2.1 gibt, und das Einspielen des aktuellen Winischhofer-Treibers (was aber durchaus als Vorteil zu sehen ist, da dieser gegenüber der in XFree 4.2 enthaltenen Version stark verbessert worden ist und auch die Konfiguration mittels des neuen Tools sisctrl erlaubt). Die gute Nachricht ist aber, dass der Kernel nicht neu kompiliert werden muss - eines der Dinge, die auch ich mich noch nie getraut habe (der Standard-SuSE-Kernel läuft einfach zu gut).

Anmerkung am Rande: Im neuen XFree 4.4 ist nicht nur eine Version des Winischhofer-Treibers enthalten, die den Merged Framebuffer unterstützt, sondern auch der DRI-Treiber wieder integriert! Siehe hierzu auch die Release Notes.

Im Folgenden werde ich nun das Einrichten des MergedFB unter SuSE 8.1 zeigen, und zwar am Beispiel meiner Konfiguration: 1280x1024/1024x768 (VGA/LCD). Ich übernehme jedoch ausdrücklich keine Verantwortung für jegliche Komplikationen, die durch das Befolgen oder Nichtbefolgen dieses Textes entstehen! Ihr handelt auf eigene Gefahr!

I: Treiber-Backup

Im Folgenden wird davon ausgegangen, dass SuSE 8.1 und XFree 4.2 installiert sind. Dann leisten folgende Befehle das Gewünschte:

mkdir sis-dri-bak
cd sis-dri-bak
WHEREAMI=`pwd`
mkdir -p usr/X11R6/lib/modules/dri
mkdir usr/X11R6/lib/modules/drivers
mkdir usr/X11R6/lib/modules/extensions
cd usr/X11R6/lib/modules
cd /usr/X11R6/lib/modules/dri
cp gamma_dri.so i830_dri.so r128_dri.so sis_dri.so \
   i810_dri.so mga_dri.so radeon_dri.so tdfx_dri.so \
   $WHEREAMI/usr/X11R6/lib/modules/dri
cd ../drivers
cp sis_drv.o $WHEREAMI/usr/X11R6/lib/modules/drivers
cd ../extensions
cp libGLcore.a  libGLcore.a.xf86_glx $WHEREAMI/usr/X11R6/lib/modules/extensions
cd $WHEREAMI
mkdir usr/lib
cd /usr/lib/
cp -r GL libGL* $WHEREAMI/usr/lib
cd $WHEREAMI

II: XFree 4.3 installieren

Zunächst sind natürlich die RPMs (am besten einfach alle samt DRI und sax2) von folgender Adresse zu beziehen:

ftp://ftp.suse.com/pub/suse/i386/supplementary/X/XFree86/XFree86-4.3.0-SuSE/suse81/

Diese sind dann mit rpm -Uvh *.rpm zu installieren, wobei zumindest bei mir einige Pakete mit Dateien aus dem Basispaket aaa_base kollidierten - da half dann leider nur noch ein --replacefiles.

III: Backup zurück spielen

Damit DRI wieder funktioniert, muss jetzt das Backup zurück gespielt werden, da die Treiber dafür nicht mehr in XFree 4.3 (aber wieder ab CSV-Version 4.3.99.14) enthalten sind. Einfach root werden und aus dem oben angelegten Verzeichnis sis-dri-bak alles dort hin kopieren, wo es hingehört, also einfach folgendes:

cp -r sis-dri-bak/* /

Ich möchte an dieser Stelle noch einmal ausdrücklich darauf hinweisen, dass alles was hier steht auf eigene Gefahr durchzuführen ist! Wenn ihr euch das System zerschießt, übernehme ich dafür, wie auch für sonst nichts - die Verantwortung; auch dann nicht, wenn ihr alles genau so macht, wie es hier steht! Bei mir hat es funktioniert, aber irren ist menschlich und vielleicht hat sich ja beim Schreiben dieses Howtos ein schwerwiegender Fehler eingeschlichen. Für Hinweise bin ich natürlich dankbar.

Nun sollte erst einmal überprüft werden, ob noch alles so funktioniert wie es sollte, konkret also entweder einen X-Server starten und die verschiedenen Modi/Layouts testen (Xinerama, Clone; verschiedene Auflösungen; DRI) oder bei normalem grafischem Login als root rckdm restart eingeben (bewirkt ein Neustarten des K Display Managers, also des grafischen Logins - hierbei wird KDE o.ä beendet!) bzw. den Rechner neu starten.

IV: sis-Treiber installieren

Hat bis hierher alles geklappt, sollte man sich nun von Thomas Winischhofers sis-Seite den aktuellen sis-Treiber holen. Dieser findet sich dort recht weit unten unter "VII. Download the latest versions", genauer: unter "For newbies:" und ist verlinkt als "X driver for 4.3.0 (...) gcc 3.2 (SuSE 8.1 wird mit gcc3 ausgeliefert und auch die XFree 4.3 RPMs sind damit kompiliert).

Das Archiv enhält dann (hoffentlich) den aktuellen sis-Treiber sis_drv.o, der nach /usr/X11R6/lib/modules/drivers muss (dort sollte sich nach dem Zurückspielen des Backups noch die zu XFree 4.2 gehörige Version befinden - einfach überschreiben; das Backup sollte man sowieso irgendwo sicher verwahren).

Von derselben Downloadseite und Position in derselben kann man sich gleich auch noch das SiS Display Control Panel besorgen; Kompilieren ist i.d.R. nicht notwendig. Dieses kann man dann z.B. in /usr/local/bin/ platzieren.

Thomas Winischhofer betreibt die Entwicklung des Treibers recht engagiert voran. Wann immer also eine neue sis-Treiberversion für XFree 4.3/gcc3 bei ihm verfügbar wird, sollte sich diese ebenso leicht aktualisieren lassen wie hier beschrieben (man bemerke, dass ich hier von keiner konkreten Treiberversion spreche). Zu beachten ist lediglich, dass man immer sis-Treiber und SiS Display Control Panel gleichzeitig auf den aktuellen Stand bringen sollte.

V: Konfiguration

Ebenfalls auf ThomaSite, der Homepage des Treiberautors, findet sich eine ausführliche Dokumentation aller Optionen, die in der XF86Config (er benutzt Debian und dort heißt sie XF86Config-4) zu machen sind und auch der Parameter, die das Kernelmodul akzeptiert (zur Erinnerung: Bei SuSE ist der sis-Treiber nicht in den Kernel integriert, sondern wird über die Modulschnittstelle nachgeladen, also mit insmod). Für den Anfang sollte es aber reichen, wenn man sich seine Beispielkonfigurationsdatei für den MergedFB-Modus anschaut: Unter "Other stuff (entirely optional)" findet sich ein Link auf example XF86Config-4 for merged framebuffer mode (please read!).

Zu beachten sind lediglich noch drei Dinge:

  1. Die Ctrl+Alt-Ziffernblock Plus/Minus Tastenkombinationen funktionieren nur dann wie erwartet (zyklisches Durchlaufen der mit der Option MetaModes definierten virtuellen Aufteilungen), wenn man in der Screen-Sektion den größten möglichen Mode beider Monitore (intern und extern) einträgt. Wenn das LCD also nur XGA kann der externe Monitor aber höhere Auflösungen, dann müssen bei Modes alle bei MetaModes irgendwo vorkommenden Auflösungen eingetragen werden, unabhängig davon, für welchen Monitor sie gelten. Das ist ein wichtiger Unterschied zu Xinerama und zu XFree 4.2.
  2. Zwar funktioniert 3D-Unterstützung (DRI) mit MergedFB (im Gegensatz zu Xinerama), wenn man aber mehrere X-Server startet, bekommt der zuletzt gestartete den "Zuschlag", die anderen gehen leer aus. Lässt man also mittels Xservers zwei X-Sessions starten, z.B. mit MergedFB und Clone, kommt es auf die Reihenfolge der Definition an, welcher X-Server DRI-enabled wird.
  3. Standardmäßig aktiviert der sis-Treiber eine Emulation der Xinerama-Unterstützung, wie sie z.B. KDE anbietet (Fenster- und Kickerplatzierung). Diese ist aber prinzipbedingt statisch über eine X-Session hinweg, da Xinerama im Gegensatz zum MergedFB kein "on the fly" Mode-Switching unterstützt). Daher definiert der beim Start aktive MetaMode das KDE-Verhalten in der X-Session.

Hier noch auszugsweise meine aktuelle /etc/X11/XF86Conf, die die beiden von der Dualhead-Seite bekannten Profile sowie das neu hinzugekommene Merged-Layout enthält. Letzteres definiert CRT2 (das Laptop-LCD) rechts vom externen Monitor (CRT1, immer an) und die MetaModes "links SXGA, rechts XGA", "links und rechts XGA", "XGA-Clone" und "SVGA-Clone". Der gesamte Framebufferbereich ist dabei aber immer 2304x1024, d.h. in jedem MetaMode wird bei Berühren der Bildschirmgrenzen gescrollt (beim ersten nur auf dem LCD) - das LCD kann nunmal nur XGA; den externen Monitor auch darauf zu beschränken wäre aber Platzverschwendung. Der sis-Treiber bzw. der Grafikchip SiS 630 kann extern auch höhere Auflösungen, mein Monitor aber nicht. ;-)

Section "Device"
    Driver     "sis"
    Identifier "SiS 630-0"
    VendorName "SiS"
    BoardName  "630"
    Option     "HWcursor"
    Option     "EnableSiSCtrl" "true"
    Option     "MergedFB" "true"
    Option     "CRT2Position" "RightOf"
    Option     "MetaModes" "1280x1024-1024x768 1024x768-1024x768 1024x768 800x600"
    Option     "CRT2HSync" "31-60"
    Option     "CRT2VRefresh" "50-75"
    Option     "ForceCRT2Type" "LCD"
    Option     "ForceCRT1" "TRUE"
    Option     "MaxXFBMem" "24000"
    BusID      "PCI:1:00:0"
    Screen     0
EndSection

Section "Device"
    Driver     "sis"
    Identifier "SiS 630-1"
    VendorName "SiS"
    BoardName  "630"
    Option     "HWcursor"
	Option     "ForceCRT2Type" "LCD"
	Option     "ForceCRT1" "TRUE"
	Option     "MaxXFBMem" "12288"
	BusID      "PCI:1:00:0"
	Screen     0

EndSection

Section "Device"
	Driver     "sis"
	Identifier "SiS 630-2"
	Option     "ForceCRT1" "TRUE"
    BusID      "PCI:1:00:0"
	Screen 	   1

EndSection

Section "Screen"
    Identifier "Screen0"
    Device     "SiS 630-0"
    Monitor    "Generic LCD"
    DefaultDepth 16
    SubSection "Display"
            Depth     16
            Virtual 2304 1024
            Modes     "1280x1024" "1024x768" "800x600" "640x480"
    EndSubSection
    SubSection "Display"
            Depth     24
            Virtual 2304 1024
            Modes     "1280x1024" "1024x768" "800x600" "640x480"
    EndSubSection
EndSection

Section "Screen"
	Identifier "Screen1"
	Device     "SiS 630-1"
	Monitor    "Generic LCD"
	DefaultDepth 16
	SubSection "Display"
		Depth     16
		Modes     "1024x768" "800x600" "640x480"
	EndSubSection
	SubSection "Display"
		Depth     24
		Modes     "1024x768" "800x600" "640x480"
	EndSubSection
EndSection

Section "Screen"
	Identifier "Screen2"
	Device     "SiS 630-2"
	Monitor    "Generic VGA"
	DefaultDepth 16
	SubSection "Display"
		Depth 16
		Modes "1280x1024" "1024x768" "800x600" "640x480"
	EndSubSection
	SubSection "Display"
		Depth 24
		Modes "1024x768" "800x600" "640x480"
	EndSubSection
EndSection

Section "ServerLayout"
    Identifier  "Merged"
    Screen      "Screen0"
    InputDevice "Generic Keyboard"
    InputDevice "Configured Mouse"
    InputDevice "USB Mouse"
EndSection

Section "ServerLayout"
	Identifier	"Multi"
	Screen		"Screen1"
	Screen		"Screen2" LeftOf "Screen1"
	Option		"Xinerama" "on"
	InputDevice	"Generic Keyboard"
	InputDevice	"Configured Mouse"
	InputDevice	"USB Mouse"
EndSection

Section "ServerLayout"
    Identifier  "Clone"
    Screen      "Screen1"
    InputDevice "Generic Keyboard"
    InputDevice "Configured Mouse"
    InputDevice "USB Mouse"
EndSection

Section "DRI"
	Mode	0666
EndSection

An dieser Stelle noch ein abschließendes, großes Dankeschön an Thomas Winischhofer, der mir beim Update und anschließendem Klären der letzten Feinheiten mit hilfreichem Rat zur Seite stand. Witziges Detail am Rande: Erst dadurch, dass er auf meine Seite aufmerksam wurde, kam überhaupt der Stein ins Rollen...

VI: Post-Install

Valid
  HTML 4.0!
Jens Hatlak
12. Oktober 2003