On Wed, Dec 03, 2003 at 04:45:46PM -0500, Brendan Burns wrote:
> Jose,
> thanks for the quick response, here are the details:
> 
> Intel 440BX motherboard
> Intel Pentium III (Coppermine) 500mhz
> 192Mb RAM
> ATI Rage Pro (On the motherboard) 4mb graphics memory

Well, nothing special here. The hardware which experienced problems was
for AMD processors and PowerPC...

> It dies in either AGP 1x or AGP 2x mode (it actually seems to die faster
> in 1x mode, although that's not a very scientific observation)
> 
> When it dies, it prints the message:
> "Error flushing DMA" to stdout.
> 
> I'm a fairly decent programmer, although I've never done anything with
> XFree86, if you point me in the right direction, I can try to figure it
> out too...
> 

Ok. I'll give you some hints, because this is actually very difficult to solve 
remotely.

The mach64 DMA works (as Leif Delgass so nicely described it once) like
putting tracks in front of a speeding train!  

The 3D geometry is put in tiny DMA buffers, and then a pointer to several
of the buffers is put into a ring buffer (also on system memory). Mach64 reads that 
ring buffer
until if finds a "stop" marker.

Since Mach64 (the train) has no IRQ to notify that it has find a stop
marker (like a red sign in the rails). What we do is add another track,
put another stop marker on the end, and then remove the former. When the
trains stops (which may happen at any time), we see if there any any
tracks left, and tell it to keep going. Now see below for more detailed
description:

> Nov 30 19:29:29 epiphany -- MARK --
> Nov 30 19:46:46 epiphany kernel: [drm] mach64_ring_idle failed! GUI_STAT=0x00800001
> Nov 30 19:46:46 epiphany kernel: [drm]

The ring buffer (extracts):

> Nov 30 19:46:46 epiphany kernel: [drm] ring contents:
> Nov 30 19:46:46 epiphany kernel: [drm]   head_addr: 0xf4000080 head: 32 tail: 140
> Nov 30 19:46:46 epiphany kernel:
> Nov 30 19:46:46 epiphany kernel: [drm]   0xf4000000:  0x007ffe48 0xf4194000 
> 0x40000128 0x00000000
> Nov 30 19:46:46 epiphany kernel: [drm]   0xf4000010:  0x007ffe48 0xf40d8000 
> 0x40000068 0x00000000
> Nov 30 19:46:46 epiphany kernel: [drm]   0xf4000020:  0x007ffe48 0xf40b8000 
> 0x40000128 0x00000000
> Nov 30 19:46:46 epiphany kernel: [drm]   0xf4000030:  0x007ffe48 0xf4184000 
> 0x40000048 0x00000000
> Nov 30 19:46:46 epiphany kernel: [drm]   ...
> Nov 30 19:46:46 epiphany kernel: [drm]   0xf4000050:  0x007ffe48 0xf417c000 
> 0x40000068 0x00000000
> Nov 30 19:46:46 epiphany kernel: [drm]   0xf4000060:  0x007ffe48 0xf4114000 
> 0x40000048 0x00000000
> Nov 30 19:46:46 epiphany kernel: [drm]   0xf4000070:  0x007ffe48 0xf41cc000 
> 0x40000068 0x00000000

The head, i.e., the speeding train (mach64 is reading the buffers
pointed by the entries below and drawing the geometry):

> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000080:  0x007ffe48 0xf4044000 
> 0x40000088 0x00000000 (head)

> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000090:  0x007ffe48 0xf4198000 
> 0x40000068 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf40000a0:  0x007ffe48 0xf4158000 
> 0x40000088 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf40000b0:  0x007ffe48 0xf4098000 
> 0x40000068 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   ...
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000200:  0x007ffe48 0xf4148000 
> 0x40000330 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000210:  0x007ffe48 0xf4030000 
> 0x40000068 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000220:  0x007ffe48 0xf40a0000 
> 0xc0000088 0x00000000
                                                                                ^
The red light ------------------------------------------------------------------+

The tail, i.e., where new tracks are added:

> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000230:  0x007ffe48 0xf40fc000 
> 0x40000320 0x00000000 (tail)
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000240:  0x007ffe48 0xf4058000 
> 0x40000068 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000250:  0x007ffe48 0xf40d4000 
> 0x40000190 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000260:  0x007ffe48 0xf412c000 
> 0x40000048 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   ...
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4003fd0:  0x007ffe48 0xf416c000 
> 0x40000068 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4003fe0:  0x007ffe48 0xf41bc000 
> 0x40000190 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4003ff0:  0x007ffe48 0xf4140000 
> 0x40000068 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]

This is the buffer Mach64 is reading (it has commands to draw the
primitives such as triangles, quads, or has texture data), this one
appears to be : 

> Nov 30 19:46:50 epiphany kernel: [drm] buffer contents:
> Nov 30 19:46:50 epiphany kernel: [drm] f4044000:  0x00060190
> Nov 30 19:46:50 epiphany kernel: [drm] f4044004:    0x0240 = 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm] f4044008:    0x0244 = 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm] f404400c:    0x0248 = 0x3f800000
> Nov 30 19:46:50 epiphany kernel: [drm]   ...
> Nov 30 19:46:50 epiphany kernel: [drm] f4044074:    0x024c = 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm] f4044078:    0x0250 = 0x7fff8000
> Nov 30 19:46:50 epiphany kernel: [drm] f404407c:    0x0254 = 0xffffffff

The Mach64 appears to have stoped (locked) here (see BM_SYSTEM_MEM_ADDR):

0x0258 = MACH64_VERTEX_1_X_Y (seexc/lib/GL/mesa/src/drv/mach64/mach64_reg.h)

> Nov 30 19:46:50 epiphany kernel: [drm] f4044080:    0x0258 = 0x05400400

0x025c is an alias for OOA (one over the area in FP format):

> Nov 30 19:46:50 epiphany kernel: [drm] f4044084:    0x025c = 0xba800000

0xba800000 => Triangle area of 1024 (!?)

> Nov 30 19:46:50 epiphany kernel: [drm]
> Nov 30 19:46:50 epiphany kernel: [drm]
> Nov 30 19:46:50 epiphany kernel: [drm]        BM_GUI_TABLE = 0xf4000090
> Nov 30 19:46:50 epiphany kernel: [drm]
> Nov 30 19:46:50 epiphany kernel: [drm] BM_FRAME_BUF_OFFSET = 0x007ffe48
> Nov 30 19:46:50 epiphany kernel: [drm]  BM_SYSTEM_MEM_ADDR = 0xf4044080
> Nov 30 19:46:50 epiphany kernel: [drm]          BM_COMMAND = 0x40000008
> Nov 30 19:46:50 epiphany kernel: [drm]
> Nov 30 19:46:50 epiphany kernel: [drm]           BM_STATUS = 0x134060ca
> Nov 30 19:46:50 epiphany kernel: [drm]            BUS_CNTL = 0x7b33a110
> Nov 30 19:46:50 epiphany kernel: [drm]           FIFO_STAT = 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]            GUI_STAT = 0x00800001
> Nov 30 19:46:50 epiphany kernel: [drm]            SRC_CNTL = 0x00000f00


Afterwards the engine is stuck (the tail is set to zero, but the engine
nevers recovers, even with a reset):

> Nov 30 19:46:50 epiphany kernel: [drm] mach64_ring_idle failed! GUI_STAT=0x00800001
> Nov 30 19:46:50 epiphany kernel: [drm]
> Nov 30 19:46:50 epiphany kernel: [drm] ring contents:
> Nov 30 19:46:50 epiphany kernel: [drm]   head_addr: 0xf4000270 head: 156 tail: 0
> Nov 30 19:46:50 epiphany kernel:
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000000:  0x007ffe48 0xf4194000 
> 0x40000128 0x00000000 (tail)
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000010:  0x007ffe48 0xf40d8000 
> 0x40000068 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000020:  0x007ffe48 0xf40b8000 
> 0x40000128 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000030:  0x007ffe48 0xf4184000 
> 0x40000048 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   ...
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000240:  0x007ffe48 0xf4058000 
> 0x40000068 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000250:  0x007ffe48 0xf40d4000 
> 0x40000190 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000260:  0x007ffe48 0xf412c000 
> 0x40000048 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000270:  0x007ffe48 0xf4164000 
> 0x4000015c 0x00000000 (head)
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000280:  0x007ffe48 0xf4010000 
> 0x40000048 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4000290:  0x007ffe48 0xf4030000 
> 0x40000284 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf40002a0:  0x007ffe48 0xf40c4000 
> 0x40000048 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   ...
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4003fd0:  0x007ffe48 0xf416c000 
> 0x40000068 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4003fe0:  0x007ffe48 0xf41bc000 
> 0x40000190 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]   0xf4003ff0:  0x007ffe48 0xf4140000 
> 0x40000068 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]
> Nov 30 19:46:50 epiphany kernel: [drm]
> Nov 30 19:46:50 epiphany kernel: [drm]        BM_GUI_TABLE = 0xf4000280
> Nov 30 19:46:50 epiphany kernel: [drm]
> Nov 30 19:46:50 epiphany kernel: [drm] BM_FRAME_BUF_OFFSET = 0x007ffe48
> Nov 30 19:46:50 epiphany kernel: [drm]  BM_SYSTEM_MEM_ADDR = 0xf4164100
> Nov 30 19:46:50 epiphany kernel: [drm]          BM_COMMAND = 0x4000005c
> Nov 30 19:46:50 epiphany kernel: [drm]
> Nov 30 19:46:50 epiphany kernel: [drm]           BM_STATUS = 0x134060ca
> Nov 30 19:46:50 epiphany kernel: [drm]            BUS_CNTL = 0x7bb3a110
> Nov 30 19:46:50 epiphany kernel: [drm]           FIFO_STAT = 0x00000000
> Nov 30 19:46:50 epiphany kernel: [drm]            GUI_STAT = 0x00800001
> Nov 30 19:46:50 epiphany kernel: [drm]            SRC_CNTL = 0x00004300

and repeats several times...

Conclusion: it may be Quake2 is givin some strange GL primitives triggering a bug in 
the driver...

See if forcing the driver in MMIO or DMA Sync mode helps, be setting the
"dma_mode" in the driver section Xf86config to "sync" or "mmio" instead
of "async" (the default and fatest).

Jose Fonseca


-------------------------------------------------------
This SF.net email is sponsored by OSDN's Audience Survey.
Help shape OSDN's sites and tell us what you think. Take this
five minute survey and you could win a $250 Gift Certificate.
http://www.wrgsurveys.com/2003/osdntech03.php?site=8
_______________________________________________
Dri-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to