SlowBcopy.c (2468B)
1 /******************************************************************************* 2 for Alpha Linux 3 *******************************************************************************/ 4 5 /* 6 * Create a dependency that should be immune from the effect of register 7 * renaming as is commonly seen in superscalar processors. This should 8 * insert a minimum of 100-ns delays between reads/writes at clock rates 9 * up to 100 MHz---GGL 10 * 11 * Slowbcopy(char *src, char *dst, int count) 12 * 13 */ 14 15 #ifdef HAVE_XORG_CONFIG_H 16 #include <xorg-config.h> 17 #endif 18 19 #include <X11/X.h> 20 #include "xf86.h" 21 #include "xf86Priv.h" 22 #include "xf86_OSlib.h" 23 #include "compiler.h" 24 25 static int really_slow_bcopy; 26 27 void 28 xf86SetReallySlowBcopy(void) 29 { 30 really_slow_bcopy = 1; 31 } 32 33 #if defined(__i386__) || defined(__amd64__) 34 static void 35 xf86_really_slow_bcopy(unsigned char *src, unsigned char *dst, int len) 36 { 37 while (len--) { 38 *dst++ = *src++; 39 outb(0x80, 0x00); 40 } 41 } 42 #endif 43 44 /* The outb() isn't needed on my machine, but who knows ... -- ost */ 45 void 46 xf86SlowBcopy(unsigned char *src, unsigned char *dst, int len) 47 { 48 #if defined(__i386__) || defined(__amd64__) 49 if (really_slow_bcopy) { 50 xf86_really_slow_bcopy(src, dst, len); 51 return; 52 } 53 #endif 54 while (len--) 55 *dst++ = *src++; 56 } 57 58 #ifdef __alpha__ 59 60 #ifdef __linux__ 61 62 unsigned long _bus_base(void); 63 64 #define useSparse() (!_bus_base()) 65 66 #define SPARSE (7) 67 68 #else 69 70 #define useSparse() 0 71 72 #define SPARSE 0 73 74 #endif 75 76 void 77 xf86SlowBCopyFromBus(unsigned char *src, unsigned char *dst, int count) 78 { 79 if (useSparse()) { 80 unsigned long addr; 81 long result; 82 83 addr = (unsigned long) src; 84 while (count) { 85 result = *(volatile int *) addr; 86 result >>= ((addr >> SPARSE) & 3) * 8; 87 *dst++ = (unsigned char) (0xffUL & result); 88 addr += 1 << SPARSE; 89 count--; 90 outb(0x80, 0x00); 91 } 92 } 93 else 94 xf86SlowBcopy(src, dst, count); 95 } 96 97 void 98 xf86SlowBCopyToBus(unsigned char *src, unsigned char *dst, int count) 99 { 100 if (useSparse()) { 101 unsigned long addr; 102 103 addr = (unsigned long) dst; 104 while (count) { 105 *(volatile unsigned int *) addr = 106 (unsigned short) (*src) * 0x01010101; 107 src++; 108 addr += 1 << SPARSE; 109 count--; 110 outb(0x80, 0x00); 111 } 112 } 113 else 114 xf86SlowBcopy(src, dst, count); 115 } 116 #endif