diff options
author | root <root@zombrain.(none)> | 2011-07-25 08:54:41 (GMT) |
---|---|---|
committer | root <root@zombrain.(none)> | 2011-07-25 08:54:41 (GMT) |
commit | ab4fcaad149d4bdccefa8f693c2a8e044b40dd4c (patch) | |
tree | c95c280caabc70e7aedbde723e38820047357be7 /hw/xfree86/os-support/misc/SlowBcopy.c |
initial state (xorg-server 1.10.2)
Diffstat (limited to 'hw/xfree86/os-support/misc/SlowBcopy.c')
-rw-r--r-- | hw/xfree86/os-support/misc/SlowBcopy.c | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/hw/xfree86/os-support/misc/SlowBcopy.c b/hw/xfree86/os-support/misc/SlowBcopy.c new file mode 100644 index 0000000..0021b55 --- /dev/null +++ b/hw/xfree86/os-support/misc/SlowBcopy.c @@ -0,0 +1,117 @@ +/******************************************************************************* + for Alpha Linux +*******************************************************************************/ + +/* + * Create a dependency that should be immune from the effect of register + * renaming as is commonly seen in superscalar processors. This should + * insert a minimum of 100-ns delays between reads/writes at clock rates + * up to 100 MHz---GGL + * + * Slowbcopy(char *src, char *dst, int count) + * + */ + +#ifdef HAVE_XORG_CONFIG_H +#include <xorg-config.h> +#endif + +#include <X11/X.h> +#include "xf86.h" +#include "xf86Priv.h" +#include "xf86_OSlib.h" +#include "compiler.h" + +static int really_slow_bcopy; + +void +xf86SetReallySlowBcopy(void) +{ + really_slow_bcopy = 1; +} + +#if defined(__i386__) || defined(__amd64__) +static void xf86_really_slow_bcopy(unsigned char *src, unsigned char *dst, int len) +{ + while(len--) + { + *dst++ = *src++; + outb(0x80, 0x00); + } +} +#endif + +/* The outb() isn't needed on my machine, but who knows ... -- ost */ +void +xf86SlowBcopy(unsigned char *src, unsigned char *dst, int len) +{ +#if defined(__i386__) || defined(__amd64__) + if (really_slow_bcopy) { + xf86_really_slow_bcopy(src, dst, len); + return; + } +#endif + while(len--) + *dst++ = *src++; +} + +#ifdef __alpha__ + +#ifdef linux + +unsigned long _bus_base(void); + +#define useSparse() (!_bus_base()) + +#define SPARSE (7) + +#else + +#define useSparse() 0 + +#define SPARSE 0 + +#endif + +void +xf86SlowBCopyFromBus(unsigned char *src, unsigned char *dst, int count) +{ + 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) +{ + 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 |