Videospeicher (shared memory) kann nicht reserviert werden.

Bjoern Seifert bjoern.seifert at gmail.com
Don Aug 31 20:22:45 BST 2006


Hallo Liste!

Fehlerbeschreibung:
Laptop mit VIA K8M800 (lspci und Xorg.0.log siehe unten) stürzt beim
Starten von GL-Spielen ab, so z.B.
gltron (bei "Start Game" -> Absturz)
ppracer (Pinguin steht an Startlinie -> Absturz)
Der Absturz für dazu, das das Notebook weder auf Strg-Alt-Entf,
Strg-Alt-Backspace, Strg-Alt-F1 oder auf ein Antippen des Powerknopfes
reagiert, nur wenn man ihn ca 4sek drückt, schaltet der Rechner ab.

DRI und Openchrome-Treiber sind aus dem aktuellen cvs kompiliert [siehe 1].

$ glxinfo
direct rendering: Yes

$ glxgears -printfps
2942 frames in 5.0 seconds = 588.216 FPS

Das klappt also schonmal!

Vermutete Fehlerursache:
Nach lesen von [2] wegen des Hinweises bei [3] hab ich nach dem
Videospeicher geschaut und dort Ungereimtheiten gefunden.
Der Grafikchip verwendet von den 512MB RAM die ich insgesamt habe, je
nach Bios-Einstellung 32MB oder 64MB shared memory. Dieser wird auch
dem verfügbaren Hauptspeicher korrekt abgezogen, aber dort wo Linux
den Videospeicher dann annimmt, kann er nicht sein! So komme ich auf
diese Idee:

Bei eingestellten 64 MB shared memory im BIOS:
$ free -m
             total       used       free     shared    buffers     cached
Mem:           440        319        121          0         36        153
-/+ buffers/cache:        130        310
Swap:         1294          0       1294

512-64=448, 8MB fehlen irgendwo. Eher nebensächlich denke ich.

$ sudo lspci -vv
0000:01:00.0 VGA compatible controller: VIA Technologies, Inc. S3
Unichrome Pro VGA Adapter (rev 01) (prog-if 00 [VGA])
        Subsystem: Mitac: Unknown device 8889
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop-
ParErr- Stepping- SERR- FastB2B-
        Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium
>TAbort- <TAbort- <MAbort- >SERR- <PERR-
        Latency: 128 (500ns min)
        Interrupt: pin A routed to IRQ 217
        Region 0: Memory at a4000000 (32-bit, prefetchable) [size=64M]
        Region 1: Memory at e1000000 (32-bit, non-prefetchable) [size=16M]
        Expansion ROM at a0000000 [disabled] [size=64K]
        Capabilities: [60] Power Management version 2
                Flags: PMEClk- DSI+ D1+ D2+ AuxCurrent=0mA
PME(D0-,D1-,D2-,D3hot-,D3cold-)
                Status: D0 PME-Enable- DSel=0 DScale=0 PME-
        Capabilities: [70] AGP version 3.0
                Status: RQ=256 Iso- ArqSz=0 Cal=7 SBA+ ITACoh- GART64-
HTrans- 64bit- FW- AGP3+ Rate=x4,x8
                Command: RQ=32 ArqSz=0 Cal=0 SBA+ AGP+ GART64- 64bit-
FW- Rate=x8


$ dmesg | grep reserve
[17179609.748000] PCI: Unable to reserve mem region
#1:4000000 at a4000000 for device 0000:01:00.0



Bei eingestellten 32 MB shared memory im BIOS:
$ free -m
             total       used       free     shared    buffers     cached
Mem:           472        316        155          0         34        152
-/+ buffers/cache:        129        342
Swap:         1294          0       1294

Wieder fehlen 8MB, sonst passt die Änderung.

0000:01:00.0 VGA compatible controller: VIA Technologies, Inc. S3
Unichrome Pro VGA Adapter (rev 01) (prog-if 00 [VGA])
        Subsystem: Mitac: Unknown device 8889
        Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop-
ParErr- Stepping- SERR- FastB2B-
        Status: Cap+ 66MHz+ UDF- FastB2B- ParErr- DEVSEL=medium
>TAbort- <TAbort- <MAbort- >SERR- <PERR-
        Latency: 128 (500ns min)
        Interrupt: pin A routed to IRQ 217
        Region 0: Memory at a4000000 (32-bit, prefetchable) [size=64M]
        Region 1: Memory at e1000000 (32-bit, non-prefetchable) [size=16M]
        Expansion ROM at a0000000 [disabled] [size=64K]
        Capabilities: [60] Power Management version 2
                Flags: PMEClk- DSI+ D1+ D2+ AuxCurrent=0mA
PME(D0-,D1-,D2-,D3hot-,D3cold-)
                Status: D0 PME-Enable- DSel=0 DScale=0 PME-
        Capabilities: [70] AGP version 3.0
                Status: RQ=256 Iso- ArqSz=0 Cal=7 SBA+ ITACoh- GART64-
HTrans- 64bit- FW- AGP3+ Rate=x4,x8
                Command: RQ=32 ArqSz=0 Cal=0 SBA+ AGP+ GART64- 64bit-
FW- Rate=x8


$ dmesg | grep reserve
[17179610.296000] PCI: Unable to reserve mem region
#1:4000000 at a4000000 for device 0000:01:00.0


Der verfügbare Total-Speicher wird also korrekt verkleinert (laut
free), aber lspci denkt beides Mal, die Karte würde 64MB Speicher
haben und beidesmal ist der Ort dieses Speichers offentsichtlich
falsch, weswegen (laut dmesg) die Region nicht reserved werden kann.
Deshalb falsch, weil 0xa4000000 in dezimal bei 2624MB liegt!! (ich hab
nur 512MB gesamt)
Was mit den 16MB bei 0xe1000000 ist, das läge bei 3600MB, weiß ich
nicht - in dmesg taucht dieser Bereich nicht auf.
In der Xorg.0.log [4] ist die Größe des Videospeichers korrekt (Zeile 366).

Also, kann mir jemand sagen, woher lspci die falschen Infos über den
Speicherbereich erhält oder wie man den Fehler beheben könnte?
Liegt es an dem "Subsystem: Mitac: Unknown device 8889" (laut lspci)?
Laut Xorg.0.log [4] scheint die Erkennung sonst okay.

Liebe Grüße!
Björn Seifert

[1] http://wiki.openchrome.org/tikiwiki/tiki-index.php?page=Compiling+the+source+code
[2] http://averatecforums.com/showthread.php?t=2014
[3] http://www.ubuntuforums.org/showthread.php?p=1072596#post1072596
[4] http://www.ubuntuusers.de/paste/3291/ (Xorg.0.log bei eingestellten 32MB)