diff options
author | Matt Turner <mattst88@gmail.com> | 2009-10-06 20:58:30 -0400 |
---|---|---|
committer | Matt Turner <mattst88@gmail.com> | 2009-10-06 20:58:30 -0400 |
commit | 9625f6d328d6f516520930227b218979309938bc (patch) | |
tree | 6a926421788f262700a43fc0f5a4a5c42ddb8103 | |
parent | aa07957373fd7cbe67458a001e4afd6a7f1ea37f (diff) |
Fix breakage on alpha caused by c7680befe5ae
Pinpointed by by Michael Cree.
Commit c7680befe5ae removed Jensen support, but at the same time broke
support for dense memory systems.
Signed-off-by: Matt Turner <mattst88@gmail.com>
-rw-r--r-- | hw/xfree86/os-support/misc/SlowBcopy.c | 62 |
1 files changed, 39 insertions, 23 deletions
diff --git a/hw/xfree86/os-support/misc/SlowBcopy.c b/hw/xfree86/os-support/misc/SlowBcopy.c index 182a3e6ec..0021b5544 100644 --- a/hw/xfree86/os-support/misc/SlowBcopy.c +++ b/hw/xfree86/os-support/misc/SlowBcopy.c @@ -59,10 +59,16 @@ xf86SlowBcopy(unsigned char *src, unsigned char *dst, int len) #ifdef linux +unsigned long _bus_base(void); + +#define useSparse() (!_bus_base()) + #define SPARSE (7) #else +#define useSparse() 0 + #define SPARSE 0 #endif @@ -70,32 +76,42 @@ xf86SlowBcopy(unsigned char *src, unsigned char *dst, int len) void xf86SlowBCopyFromBus(unsigned char *src, unsigned char *dst, int count) { - unsigned long addr; - long result; - - addr = (unsigned long) src; - while( count ){ - result = *(volatile int *) addr; - result >>= ((addr>>SPARSE) & 3) * 8; - *dst++ = (unsigned char) (0xffUL & result); - addr += 1<<SPARSE; - count--; - outb(0x80, 0x00); - } + if (useSparse()) + { + unsigned long addr; + long result; + + addr = (unsigned long) src; + while (count) { + result = *(volatile int *) addr; + result >>= ((addr>>SPARSE) & 3) * 8; + *dst++ = (unsigned char) (0xffUL & result); + addr += 1<<SPARSE; + count--; + outb(0x80, 0x00); + } + } + else + xf86SlowBcopy(src, dst, count); } - + void xf86SlowBCopyToBus(unsigned char *src, unsigned char *dst, int count) { - unsigned long addr; - - addr = (unsigned long) dst; - while(count) { - *(volatile unsigned int *) addr = (unsigned short)(*src) * 0x01010101; - src++; - addr += 1<<SPARSE; - count--; - outb(0x80, 0x00); - } + if (useSparse()) + { + unsigned long addr; + + addr = (unsigned long) dst; + while (count) { + *(volatile unsigned int *) addr = (unsigned short)(*src) * 0x01010101; + src++; + addr += 1<<SPARSE; + count--; + outb(0x80, 0x00); + } + } + else + xf86SlowBcopy(src, dst, count); } #endif |