I complained few days ago that 'agpgart.o' module from 2.2.18pre
is causing a kernel oops.  The problem turned out to be an apparent
assumption that PCI memory <-> memory mapping is an identity and
this is not always the case.

Here is a patch applicable to all 2.2.18pre kernels with agpgart
support:

--- linux-2.2.18px/drivers/char/agp/agp.h~      Tue Oct  3 16:03:13 2000
+++ linux-2.2.18px/drivers/char/agp/agp.h       Tue Oct 17 10:23:14 2000
@@ -27,6 +27,8 @@
 #ifndef _AGP_BACKEND_PRIV_H
 #define _AGP_BACKEND_PRIV_H 1
 
+#include <asm/io.h>
+
 enum aper_size_type {
        U8_APER_SIZE,
        U16_APER_SIZE,
@@ -119,13 +121,13 @@
        void (*free_by_type) (agp_memory *);
 };
 
-#define OUTREG32(mmap, addr, val)   *(volatile u32 *)(mmap + (addr)) = (val)
-#define OUTREG16(mmap, addr, val)   *(volatile u16 *)(mmap + (addr)) = (val)
-#define OUTREG8 (mmap, addr, val)   *(volatile u8 *) (mmap + (addr)) = (val)
-
-#define INREG32(mmap, addr)         *(volatile u32 *)(mmap + (addr))
-#define INREG16(mmap, addr)         *(volatile u16 *)(mmap + (addr))
-#define INREG8 (mmap, addr)         *(volatile u8 *) (mmap + (addr))
+#define OUTREG32(mmap, addr, val)   writel((val),(mmap + (addr)))
+#define OUTREG16(mmap, addr, val)   writew((val),(mmap + (addr)))
+#define OUTREG8 (mmap, addr, val)   writeb((val),(mmap + (addr)))
+
+#define INREG32(mmap, addr)         readl(mmap + (addr))
+#define INREG16(mmap, addr)         readw(mmap + (addr))
+#define INREG8 (mmap, addr)         readb(mmap + (addr))
 
 #define CACHE_FLUSH    agp_bridge.cache_flush
 #define A_SIZE_8(x)    ((aper_size_info_8 *) x)

With this patch 'agpgart.o' module compiled on x86 machine is
byte-by-byte identical as the one without it.  OTOH on UP1100 Alpha
with an Irongate after the fixed module is inserted instead of
crashing prints this in dmesg:

Linux agpgart interface v0.99 (c) Jeff Hartmann
agpgart: Maximum main memory to use for agp memory: 204M
agpgart: Detected AMD Irongate chipset
agpgart: AGP aperture is 512M @ 0x40000000

I have no idea if this is really useful on Alpha and if there are no
other address mapping problems still there but the patch above should
at least be a start. :-)

A peek at agpgart sources from 2.4 reveals that this mapping problem
is absent there as INREG... and OUTREG... macros are defined with
a help of __raw_read... and __raw_write... which function the same
like the stuff above from 2.2.

On x86 machines 'agpgart' appears to be really doing something. :-)
A small test program 'testgart' (got in mail from somebody) reports
a memory benchmark speed in 580-590 mb/s range before I started my
X server and some 720+ mb/s after X was started and exited.  Don't
ask me why. :-)

The same 'testgart' on Alpha, after obviously x86 specific or not
applicable stuff was edited out, is causing a spectacular crash
with mulitple oopses, a total lockup and zilch in log files.  So
not everything is healthy yet but not bombing out for a start
seems like a good beginning.

  Michal
  [EMAIL PROTECTED]

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to