diff options
author | marha <marha@users.sourceforge.net> | 2009-10-19 20:43:37 +0000 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2009-10-19 20:43:37 +0000 |
commit | 9dbe22229a8031aa2f6d922896e1b6539441b7b5 (patch) | |
tree | bd567f1d98f9431b4963dc3d0b05aea8ac78a1b6 /xorg-server/hw/xfree86/os-support/misc | |
parent | 07d4e6e86e3167bed18d2af81a56f3d9352d2541 (diff) | |
parent | 7687adcc34c9fc43d526f30b1cf2039b0af48841 (diff) | |
download | vcxsrv-9dbe22229a8031aa2f6d922896e1b6539441b7b5.tar.gz vcxsrv-9dbe22229a8031aa2f6d922896e1b6539441b7b5.tar.bz2 vcxsrv-9dbe22229a8031aa2f6d922896e1b6539441b7b5.zip |
svn merge ^/branches/released
Diffstat (limited to 'xorg-server/hw/xfree86/os-support/misc')
-rw-r--r-- | xorg-server/hw/xfree86/os-support/misc/SlowBcopy.c | 62 |
1 files changed, 39 insertions, 23 deletions
diff --git a/xorg-server/hw/xfree86/os-support/misc/SlowBcopy.c b/xorg-server/hw/xfree86/os-support/misc/SlowBcopy.c index 182a3e6ec..0021b5544 100644 --- a/xorg-server/hw/xfree86/os-support/misc/SlowBcopy.c +++ b/xorg-server/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 |