Remove the remnants of Jensen support
As being an EISA-only machine, and as ISA support is gone now...
This commit is contained in:
parent
df14682a31
commit
c7680befe5
|
@ -1541,8 +1541,6 @@ extern void (*xf86WriteMmio32)(int, void *, unsigned long);
|
||||||
extern void (*xf86WriteMmioNB8)(int, void *, unsigned long);
|
extern void (*xf86WriteMmioNB8)(int, void *, unsigned long);
|
||||||
extern void (*xf86WriteMmioNB16)(int, void *, unsigned long);
|
extern void (*xf86WriteMmioNB16)(int, void *, unsigned long);
|
||||||
extern void (*xf86WriteMmioNB32)(int, void *, unsigned long);
|
extern void (*xf86WriteMmioNB32)(int, void *, unsigned long);
|
||||||
extern void xf86JensenMemToBus(char *, long, long, int);
|
|
||||||
extern void xf86JensenBusToMem(char *, char *, unsigned long, int);
|
|
||||||
extern void xf86SlowBCopyFromBus(unsigned char *, unsigned char *, int);
|
extern void xf86SlowBCopyFromBus(unsigned char *, unsigned char *, int);
|
||||||
extern void xf86SlowBCopyToBus(unsigned char *, unsigned char *, int);
|
extern void xf86SlowBCopyToBus(unsigned char *, unsigned char *, int);
|
||||||
|
|
||||||
|
@ -1556,20 +1554,13 @@ extern void xf86SlowBCopyToBus(unsigned char *, unsigned char *, int);
|
||||||
# define MMIO_IN32(base, offset) xf86ReadMmio32(base, offset)
|
# define MMIO_IN32(base, offset) xf86ReadMmio32(base, offset)
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
# if defined (JENSEN_SUPPORT)
|
# define MMIO_OUT32(base, offset, val) \
|
||||||
# define MMIO_OUT32(base, offset, val) \
|
|
||||||
(*xf86WriteMmio32)((CARD32)(val), base, offset)
|
|
||||||
# define MMIO_ONB32(base, offset, val) \
|
|
||||||
(*xf86WriteMmioNB32)((CARD32)(val), base, offset)
|
|
||||||
# else
|
|
||||||
# define MMIO_OUT32(base, offset, val) \
|
|
||||||
do { \
|
do { \
|
||||||
write_mem_barrier(); \
|
write_mem_barrier(); \
|
||||||
*(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset)) = (val); \
|
*(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset)) = (val); \
|
||||||
} while (0)
|
} while (0)
|
||||||
# define MMIO_ONB32(base, offset, val) \
|
# define MMIO_ONB32(base, offset, val) \
|
||||||
*(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset)) = (val)
|
*(volatile CARD32 *)(void *)(((CARD8*)(base)) + (offset)) = (val)
|
||||||
# endif
|
|
||||||
|
|
||||||
# define MMIO_OUT8(base, offset, val) \
|
# define MMIO_OUT8(base, offset, val) \
|
||||||
(*xf86WriteMmio8)((CARD8)(val), base, offset)
|
(*xf86WriteMmio8)((CARD8)(val), base, offset)
|
||||||
|
|
|
@ -77,8 +77,6 @@ extern int iopl(int __level);
|
||||||
|
|
||||||
extern void sethae(unsigned long hae);
|
extern void sethae(unsigned long hae);
|
||||||
|
|
||||||
# define isJensen (axpSystem == JENSEN)
|
|
||||||
|
|
||||||
# define BUS_BASE bus_base
|
# define BUS_BASE bus_base
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
@ -97,10 +95,6 @@ static void unmapVidMem(int, pointer, unsigned long);
|
||||||
static pointer mapVidMemSparse(int, unsigned long, unsigned long, int);
|
static pointer mapVidMemSparse(int, unsigned long, unsigned long, int);
|
||||||
extern axpDevice lnxGetAXP(void);
|
extern axpDevice lnxGetAXP(void);
|
||||||
static void unmapVidMemSparse(int, pointer, unsigned long);
|
static void unmapVidMemSparse(int, pointer, unsigned long);
|
||||||
# if defined(JENSEN_SUPPORT)
|
|
||||||
static pointer mapVidMemJensen(int, unsigned long, unsigned long, int);
|
|
||||||
static void unmapVidMemJensen(int, pointer, unsigned long);
|
|
||||||
# endif
|
|
||||||
static axpDevice axpSystem = -1;
|
static axpDevice axpSystem = -1;
|
||||||
static Bool needSparse;
|
static Bool needSparse;
|
||||||
static unsigned long hae_thresh;
|
static unsigned long hae_thresh;
|
||||||
|
@ -388,17 +382,7 @@ xf86OSInitVidMem(VidMemInfoPtr pVidMem)
|
||||||
}
|
}
|
||||||
bus_base = _bus_base();
|
bus_base = _bus_base();
|
||||||
}
|
}
|
||||||
if (isJensen) {
|
if (needSparse) {
|
||||||
# ifndef JENSEN_SUPPORT
|
|
||||||
FatalError("Jensen is not supported any more\n"
|
|
||||||
"If you are intereseted in fixing Jensen support\n"
|
|
||||||
"please contact xorg@lists.freedesktop.org\n");
|
|
||||||
# else
|
|
||||||
xf86Msg(X_INFO,"Machine type is Jensen\n");
|
|
||||||
pVidMem->mapMem = mapVidMemJensen;
|
|
||||||
pVidMem->unmapMem = unmapVidMemJensen;
|
|
||||||
# endif /* JENSEN_SUPPORT */
|
|
||||||
} else if (needSparse) {
|
|
||||||
xf86Msg(X_INFO,"Machine needs sparse mapping\n");
|
xf86Msg(X_INFO,"Machine needs sparse mapping\n");
|
||||||
pVidMem->mapMem = mapVidMemSparse;
|
pVidMem->mapMem = mapVidMemSparse;
|
||||||
pVidMem->unmapMem = unmapVidMemSparse;
|
pVidMem->unmapMem = unmapVidMemSparse;
|
||||||
|
@ -922,175 +906,4 @@ _X_EXPORT int (*xf86ReadMmio16)(pointer Base, unsigned long Offset)
|
||||||
_X_EXPORT int (*xf86ReadMmio32)(pointer Base, unsigned long Offset)
|
_X_EXPORT int (*xf86ReadMmio32)(pointer Base, unsigned long Offset)
|
||||||
= readDense32;
|
= readDense32;
|
||||||
|
|
||||||
#ifdef JENSEN_SUPPORT
|
|
||||||
|
|
||||||
static int
|
|
||||||
readSparseJensen8(pointer Base, register unsigned long Offset);
|
|
||||||
static int
|
|
||||||
readSparseJensen16(pointer Base, register unsigned long Offset);
|
|
||||||
static int
|
|
||||||
readSparseJensen32(pointer Base, register unsigned long Offset);
|
|
||||||
static void
|
|
||||||
writeSparseJensen8(int Value, pointer Base, register unsigned long Offset);
|
|
||||||
static void
|
|
||||||
writeSparseJensen16(int Value, pointer Base, register unsigned long Offset);
|
|
||||||
static void
|
|
||||||
writeSparseJensen32(int Value, pointer Base, register unsigned long Offset);
|
|
||||||
static void
|
|
||||||
writeSparseJensenNB8(int Value, pointer Base, register unsigned long Offset);
|
|
||||||
static void
|
|
||||||
writeSparseJensenNB16(int Value, pointer Base, register unsigned long Offset);
|
|
||||||
static void
|
|
||||||
writeSparseJensenNB32(int Value, pointer Base, register unsigned long Offset);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The Jensen lacks dense memory, thus we have to address the bus via
|
|
||||||
* the sparse addressing scheme.
|
|
||||||
*
|
|
||||||
* Martin Ostermann (ost@comnets.rwth-aachen.de) - Apr.-Sep. 1996
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef TEST_JENSEN_CODE
|
|
||||||
#define SPARSE (5)
|
|
||||||
#else
|
|
||||||
#define SPARSE (7)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define JENSEN_SHIFT(x) ((long)x<<SPARSE)
|
|
||||||
|
|
||||||
static pointer
|
|
||||||
mapVidMemJensen(int ScreenNum, unsigned long Base, unsigned long Size, int flags)
|
|
||||||
{
|
|
||||||
pointer base;
|
|
||||||
int fd, prot;
|
|
||||||
|
|
||||||
xf86WriteMmio8 = writeSparseJensen8;
|
|
||||||
xf86WriteMmio16 = writeSparseJensen16;
|
|
||||||
xf86WriteMmio32 = writeSparseJensen32;
|
|
||||||
xf86WriteMmioNB8 = writeSparseJensenNB8;
|
|
||||||
xf86WriteMmioNB16 = writeSparseJensenNB16;
|
|
||||||
xf86WriteMmioNB32 = writeSparseJensenNB32;
|
|
||||||
xf86ReadMmio8 = readSparseJensen8;
|
|
||||||
xf86ReadMmio16 = readSparseJensen16;
|
|
||||||
xf86ReadMmio32 = readSparseJensen32;
|
|
||||||
|
|
||||||
fd = open(DEV_MEM, (flags & VIDMEM_READONLY) ? O_RDONLY : O_RDWR);
|
|
||||||
if (fd < 0) {
|
|
||||||
FatalError("xf86MapVidMem: failed to open " DEV_MEM " (%s)\n",
|
|
||||||
strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flags & VIDMEM_READONLY)
|
|
||||||
prot = PROT_READ;
|
|
||||||
else
|
|
||||||
prot = PROT_READ | PROT_WRITE;
|
|
||||||
|
|
||||||
/* This requires linux-0.99.pl10 or above */
|
|
||||||
base = mmap((caddr_t)0, JENSEN_SHIFT(Size),
|
|
||||||
prot, MAP_SHARED, fd,
|
|
||||||
(off_t)(JENSEN_SHIFT((off_t)Base) + _bus_base_sparse()));
|
|
||||||
close(fd);
|
|
||||||
if (base == MAP_FAILED) {
|
|
||||||
FatalError("xf86MapVidMem: Could not mmap framebuffer"
|
|
||||||
" (0x%08x,0x%x) (%s)\n", Base, Size,
|
|
||||||
strerror(errno));
|
|
||||||
}
|
|
||||||
return base;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
unmapVidMemJensen(int ScreenNum, pointer Base, unsigned long Size)
|
|
||||||
{
|
|
||||||
munmap((caddr_t)Base, JENSEN_SHIFT(Size));
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
readSparseJensen8(pointer Base, register unsigned long Offset)
|
|
||||||
{
|
|
||||||
register unsigned long result, shift;
|
|
||||||
|
|
||||||
mem_barrier();
|
|
||||||
shift = (Offset & 0x3) << 3;
|
|
||||||
|
|
||||||
result = *(vuip) ((unsigned long)Base + (Offset << SPARSE));
|
|
||||||
|
|
||||||
result >>= shift;
|
|
||||||
return 0xffUL & result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
readSparseJensen16(pointer Base, register unsigned long Offset)
|
|
||||||
{
|
|
||||||
register unsigned long result, shift;
|
|
||||||
|
|
||||||
mem_barrier();
|
|
||||||
shift = (Offset & 0x2) << 3;
|
|
||||||
|
|
||||||
result = *(vuip)((unsigned long)Base+(Offset<<SPARSE)+(1<<(SPARSE-2)));
|
|
||||||
|
|
||||||
result >>= shift;
|
|
||||||
return 0xffffUL & result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
readSparseJensen32(pointer Base, register unsigned long Offset)
|
|
||||||
{
|
|
||||||
register unsigned long result;
|
|
||||||
|
|
||||||
mem_barrier();
|
|
||||||
result = *(vuip)((unsigned long)Base+(Offset<<SPARSE)+(3<<(SPARSE-2)));
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
writeSparseJensen8(int Value, pointer Base, register unsigned long Offset)
|
|
||||||
{
|
|
||||||
register unsigned int b = Value & 0xffU;
|
|
||||||
|
|
||||||
write_mem_barrier();
|
|
||||||
*(vuip) ((unsigned long)Base + (Offset << SPARSE)) = b * 0x01010101;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
writeSparseJensen16(int Value, pointer Base, register unsigned long Offset)
|
|
||||||
{
|
|
||||||
register unsigned int w = Value & 0xffffU;
|
|
||||||
|
|
||||||
write_mem_barrier();
|
|
||||||
*(vuip)((unsigned long)Base+(Offset<<SPARSE)+(1<<(SPARSE-2))) =
|
|
||||||
w * 0x00010001;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
writeSparseJensen32(int Value, pointer Base, register unsigned long Offset)
|
|
||||||
{
|
|
||||||
write_mem_barrier();
|
|
||||||
*(vuip)((unsigned long)Base+(Offset<<SPARSE)+(3<<(SPARSE-2))) = Value;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
writeSparseJensenNB8(int Value, pointer Base, register unsigned long Offset)
|
|
||||||
{
|
|
||||||
register unsigned int b = Value & 0xffU;
|
|
||||||
|
|
||||||
*(vuip) ((unsigned long)Base + (Offset << SPARSE)) = b * 0x01010101;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
writeSparseJensenNB16(int Value, pointer Base, register unsigned long Offset)
|
|
||||||
{
|
|
||||||
register unsigned int w = Value & 0xffffU;
|
|
||||||
|
|
||||||
*(vuip)((unsigned long)Base+(Offset<<SPARSE)+(1<<(SPARSE-2))) =
|
|
||||||
w * 0x00010001;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
writeSparseJensenNB32(int Value, pointer Base, register unsigned long Offset)
|
|
||||||
{
|
|
||||||
*(vuip)((unsigned long)Base+(Offset<<SPARSE)+(3<<(SPARSE-2))) = Value;
|
|
||||||
}
|
|
||||||
#endif /* JENSEN_SUPPORT */
|
|
||||||
|
|
||||||
#endif /* __alpha__ */
|
#endif /* __alpha__ */
|
||||||
|
|
|
@ -26,233 +26,8 @@ Thanks to Linus Torvalds for contributing this code.
|
||||||
|
|
||||||
#include "compiler.h"
|
#include "compiler.h"
|
||||||
|
|
||||||
/*
|
|
||||||
* The Jensen lacks dense memory, thus we have to address the bus via
|
|
||||||
* the sparse addressing scheme. These routines are only used in s3im.c
|
|
||||||
* Non time critical code uses SlowBCopy_{from/to} bus.
|
|
||||||
*
|
|
||||||
* Martin Ostermann (ost@comnets.rwth-aachen.de) - Apr.-Sep. 1996
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef TEST_JENSEN_CODE /* define to test the Sparse addressing on a non-Jensen */
|
|
||||||
#define LWORD_CODING (0x18)
|
|
||||||
#define SPARSE (5)
|
|
||||||
#else
|
|
||||||
#define LWORD_CODING (0x60)
|
#define LWORD_CODING (0x60)
|
||||||
#define SPARSE (7)
|
#define SPARSE (7)
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
|
||||||
xf86JensenMemToBus(char *Base, long dst, long src, int count)
|
|
||||||
{
|
|
||||||
if( ((long)src^((long)dst)) & 3) {
|
|
||||||
/* src & dst are NOT aligned to each other */
|
|
||||||
unsigned long addr;
|
|
||||||
unsigned long low_word, high_word,last_read;
|
|
||||||
long rm,loop;
|
|
||||||
unsigned long tmp,org,org2,mask,src_org,count_org;
|
|
||||||
|
|
||||||
src_org=src;
|
|
||||||
count_org=count;
|
|
||||||
|
|
||||||
/* add EISA longword coding and round off*/
|
|
||||||
addr = (long)(Base+(dst<<SPARSE) + LWORD_CODING) & ~(3<<SPARSE);
|
|
||||||
rm = (long)dst & 3;
|
|
||||||
count += rm;
|
|
||||||
|
|
||||||
count = count_org + rm;
|
|
||||||
org = *(volatile unsigned int *)addr;
|
|
||||||
__asm__("ldq_u %0,%1"
|
|
||||||
:"=r" (low_word):"m" (*(unsigned long *)(src_org)));
|
|
||||||
src = src_org - rm;
|
|
||||||
if( count > 4 ) {
|
|
||||||
last_read = src_org+count_org - 1;
|
|
||||||
__asm__("ldq_u %0,%1"
|
|
||||||
:"=r" (high_word):"m" (*(unsigned long *)(src+4)));
|
|
||||||
__asm__("extll %1,%2,%0"
|
|
||||||
:"=r" (low_word)
|
|
||||||
:"r" (low_word), "r" ((unsigned long)(src)));
|
|
||||||
__asm__("extlh %1,%2,%0"
|
|
||||||
:"=r" (tmp)
|
|
||||||
:"r" (high_word), "r" ((unsigned long)(src)));
|
|
||||||
tmp |= low_word;
|
|
||||||
src += 4;
|
|
||||||
__asm__("mskqh %1,%2,%0"
|
|
||||||
:"=r" (tmp)
|
|
||||||
:"r" (tmp), "r" (rm));
|
|
||||||
__asm__("mskql %1,%2,%0"
|
|
||||||
:"=r" (org2)
|
|
||||||
:"r" (org), "r" (rm));
|
|
||||||
tmp |= org2;
|
|
||||||
|
|
||||||
loop = (count-4) >> 2; /* loop eqv. count>=4 ; count -= 4 */
|
|
||||||
while (loop) {
|
|
||||||
/* tmp to be stored completly -- need to read next word*/
|
|
||||||
low_word = high_word;
|
|
||||||
*(volatile unsigned int *) (addr) = tmp;
|
|
||||||
__asm__("ldq_u %0,%1"
|
|
||||||
:"=r" (high_word):"m" (*(unsigned long*)(src+4)));
|
|
||||||
loop --;
|
|
||||||
__asm__("extll %1,%2,%0"
|
|
||||||
:"=r" (low_word)
|
|
||||||
:"r" (low_word), "r" ((unsigned long)src));
|
|
||||||
__asm__("extlh %1,%2,%0"
|
|
||||||
:"=r" (tmp)
|
|
||||||
:"r" (high_word), "r" ((unsigned long)src));
|
|
||||||
src += 4;
|
|
||||||
tmp |= low_word;
|
|
||||||
addr += 4<<SPARSE;
|
|
||||||
}
|
|
||||||
if ( count & 3 ) {
|
|
||||||
/* Store tmp completly, and possibly read one more word.*/
|
|
||||||
*(volatile unsigned int *) (addr) = tmp;
|
|
||||||
__asm__("ldq_u %0,%1"
|
|
||||||
:"=r" (tmp):"m" (*((unsigned long *)(last_read)) ));
|
|
||||||
addr += 4<<SPARSE;
|
|
||||||
__asm__("extll %1,%2,%0"
|
|
||||||
:"=r" (low_word)
|
|
||||||
:"r" (high_word), "r" ((unsigned long)src));
|
|
||||||
__asm__("extlh %1,%2,%0"
|
|
||||||
:"=r" (tmp)
|
|
||||||
:"r" (tmp), "r" ((unsigned long)src));
|
|
||||||
tmp |= low_word;
|
|
||||||
org = *(volatile unsigned int *)addr;
|
|
||||||
|
|
||||||
__asm__("mskql %1,%2,%0"
|
|
||||||
:"=r" (tmp)
|
|
||||||
:"r" (tmp), "r" (count&3));
|
|
||||||
__asm__("mskqh %1,%2,%0"
|
|
||||||
:"=r" (org)
|
|
||||||
:"r" (org), "r" (count&3));
|
|
||||||
|
|
||||||
tmp |= org;
|
|
||||||
}
|
|
||||||
*(volatile unsigned int *) (addr) = tmp;
|
|
||||||
return;
|
|
||||||
} else { /* count > 4 */
|
|
||||||
__asm__("ldq_u %0,%1"
|
|
||||||
:"=r" (high_word):"m" (*(unsigned long *)(src+4)));
|
|
||||||
__asm__("extll %1,%2,%0"
|
|
||||||
:"=r" (low_word)
|
|
||||||
:"r" (low_word), "r" ((unsigned long)(src)));
|
|
||||||
__asm__("extlh %1,%2,%0"
|
|
||||||
:"=r" (tmp)
|
|
||||||
:"r" (high_word), "r" ((unsigned long)(src)));
|
|
||||||
tmp |= low_word;
|
|
||||||
if( count < 4 ) {
|
|
||||||
|
|
||||||
mask = -1;
|
|
||||||
__asm__("mskqh %1,%2,%0"
|
|
||||||
:"=r" (mask)
|
|
||||||
:"r" (mask), "r" (rm));
|
|
||||||
__asm__("mskql %1,%2,%0"
|
|
||||||
:"=r" (mask)
|
|
||||||
:"r" (mask), "r" (count));
|
|
||||||
tmp = (tmp & mask) | (org & ~mask);
|
|
||||||
*(volatile unsigned int *) (addr) = tmp;
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
__asm__("mskqh %1,%2,%0"
|
|
||||||
:"=r" (tmp)
|
|
||||||
:"r" (tmp), "r" (rm));
|
|
||||||
__asm__("mskql %1,%2,%0"
|
|
||||||
:"=r" (org2)
|
|
||||||
:"r" (org), "r" (rm));
|
|
||||||
|
|
||||||
tmp |= org2;
|
|
||||||
*(volatile unsigned int *) (addr) = tmp;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else { /* src & dst are aligned to each other */
|
|
||||||
unsigned long addr;
|
|
||||||
unsigned int tmp,org,rm;
|
|
||||||
unsigned int *src_r;
|
|
||||||
|
|
||||||
/* add EISA longword coding and round off*/
|
|
||||||
addr = (long)(Base+(dst<<SPARSE) + LWORD_CODING) & ~(3<<SPARSE);
|
|
||||||
|
|
||||||
src_r = (unsigned int*)((long)src & ~3L);
|
|
||||||
rm=(long)src & 3;
|
|
||||||
count += rm;
|
|
||||||
|
|
||||||
tmp = *src_r;
|
|
||||||
org = *(volatile unsigned int *)addr;
|
|
||||||
|
|
||||||
__asm__("mskqh %1,%2,%0"
|
|
||||||
:"=r" (tmp)
|
|
||||||
:"r" (tmp), "r" (rm));
|
|
||||||
__asm__("mskql %1,%2,%0"
|
|
||||||
:"=r" (org)
|
|
||||||
:"r" (org), "r" (rm));
|
|
||||||
|
|
||||||
tmp |= org;
|
|
||||||
|
|
||||||
while (count > 4) {
|
|
||||||
*(volatile unsigned int *) addr = tmp;
|
|
||||||
addr += 4<<SPARSE;
|
|
||||||
src_r += 1;
|
|
||||||
tmp = *src_r;
|
|
||||||
count -= 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
org = *(volatile unsigned int *)addr;
|
|
||||||
__asm__("mskql %1,%2,%0"
|
|
||||||
:"=r" (tmp)
|
|
||||||
:"r" (tmp), "r" (count));
|
|
||||||
__asm__("mskqh %1,%2,%0"
|
|
||||||
:"=r" (org)
|
|
||||||
:"r" (org), "r" (count));
|
|
||||||
tmp |= org;
|
|
||||||
*(volatile unsigned int *) (addr) = tmp;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
xf86JensenBusToMem(char *Base, char *dst, unsigned long src, int count)
|
|
||||||
{
|
|
||||||
#if 0
|
|
||||||
/* Optimization of BusToMem() is left as an exercise to the reader ;-)
|
|
||||||
* Consider that ldq_u/extlh/extll won't work because of the bus being
|
|
||||||
* only 4 bytes wide!
|
|
||||||
*/
|
|
||||||
#else
|
|
||||||
unsigned long addr;
|
|
||||||
long result;
|
|
||||||
|
|
||||||
addr = (unsigned long)(Base+(src<<SPARSE)) ;
|
|
||||||
while( addr & (3<<SPARSE) ){
|
|
||||||
if(count <= 0) return;
|
|
||||||
result = *(volatile int *) addr;
|
|
||||||
result >>= ((addr>>SPARSE) & 3) * 8;
|
|
||||||
*dst++ = (char) result;
|
|
||||||
addr += 1<<SPARSE;
|
|
||||||
count--;
|
|
||||||
}
|
|
||||||
count -=4;
|
|
||||||
while(count >= 0){
|
|
||||||
int i;
|
|
||||||
|
|
||||||
result = *(volatile int *) (addr+LWORD_CODING);
|
|
||||||
for(i=4;i--;) {
|
|
||||||
*dst++ = (char) result;
|
|
||||||
result >>= 8;
|
|
||||||
}
|
|
||||||
addr += 4<<SPARSE;
|
|
||||||
count -= 4;
|
|
||||||
}
|
|
||||||
count +=4;
|
|
||||||
|
|
||||||
while( count ){
|
|
||||||
result = *(volatile int *) addr;
|
|
||||||
result >>= ((addr>>SPARSE) & 3) * 8;
|
|
||||||
*dst++ = (char) result;
|
|
||||||
addr += 1<<SPARSE;
|
|
||||||
count--;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static unsigned long __memcpy(unsigned long dest, unsigned long src, int n);
|
static unsigned long __memcpy(unsigned long dest, unsigned long src, int n);
|
||||||
|
|
||||||
|
|
|
@ -56,29 +56,13 @@ xf86SlowBcopy(unsigned char *src, unsigned char *dst, int len)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __alpha__
|
#ifdef __alpha__
|
||||||
/*
|
|
||||||
* The Jensen lacks dense memory, thus we have to address the bus via
|
|
||||||
* the sparse addressing scheme. Time critical code uses routines from
|
|
||||||
* BUSmemcpy.c
|
|
||||||
*
|
|
||||||
* Martin Ostermann (ost@comnets.rwth-aachen.de) - Apr.-Sep. 1996
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef linux
|
#ifdef linux
|
||||||
|
|
||||||
unsigned long _bus_base(void);
|
|
||||||
|
|
||||||
#ifdef TEST_JENSEN_CODE /* define to test the Sparse addressing on a non-Jensen */
|
|
||||||
#define SPARSE (5)
|
|
||||||
#else
|
|
||||||
#define SPARSE (7)
|
#define SPARSE (7)
|
||||||
#endif
|
|
||||||
|
|
||||||
#define isJensen() (!_bus_base())
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define isJensen() 0
|
|
||||||
#define SPARSE 0
|
#define SPARSE 0
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -86,42 +70,32 @@ unsigned long _bus_base(void);
|
||||||
_X_EXPORT void
|
_X_EXPORT void
|
||||||
xf86SlowBCopyFromBus(unsigned char *src, unsigned char *dst, int count)
|
xf86SlowBCopyFromBus(unsigned char *src, unsigned char *dst, int count)
|
||||||
{
|
{
|
||||||
if (isJensen())
|
unsigned long addr;
|
||||||
{
|
long result;
|
||||||
unsigned long addr;
|
|
||||||
long result;
|
|
||||||
|
|
||||||
addr = (unsigned long) src;
|
addr = (unsigned long) src;
|
||||||
while( count ){
|
while( count ){
|
||||||
result = *(volatile int *) addr;
|
result = *(volatile int *) addr;
|
||||||
result >>= ((addr>>SPARSE) & 3) * 8;
|
result >>= ((addr>>SPARSE) & 3) * 8;
|
||||||
*dst++ = (unsigned char) (0xffUL & result);
|
*dst++ = (unsigned char) (0xffUL & result);
|
||||||
addr += 1<<SPARSE;
|
addr += 1<<SPARSE;
|
||||||
count--;
|
count--;
|
||||||
outb(0x80, 0x00);
|
outb(0x80, 0x00);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
xf86SlowBcopy(src,dst,count);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_X_EXPORT void
|
_X_EXPORT void
|
||||||
xf86SlowBCopyToBus(unsigned char *src, unsigned char *dst, int count)
|
xf86SlowBCopyToBus(unsigned char *src, unsigned char *dst, int count)
|
||||||
{
|
{
|
||||||
if (isJensen())
|
unsigned long addr;
|
||||||
{
|
|
||||||
unsigned long addr;
|
|
||||||
|
|
||||||
addr = (unsigned long) dst;
|
addr = (unsigned long) dst;
|
||||||
while(count) {
|
while(count) {
|
||||||
*(volatile unsigned int *) addr = (unsigned short)(*src) * 0x01010101;
|
*(volatile unsigned int *) addr = (unsigned short)(*src) * 0x01010101;
|
||||||
src++;
|
src++;
|
||||||
addr += 1<<SPARSE;
|
addr += 1<<SPARSE;
|
||||||
count--;
|
count--;
|
||||||
outb(0x80, 0x00);
|
outb(0x80, 0x00);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
xf86SlowBcopy(src,dst,count);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -91,33 +91,15 @@ xf86ReadBIOS(unsigned long Base, unsigned long Offset, unsigned char *Buf,
|
||||||
* re: boundaries and sizes and such...
|
* re: boundaries and sizes and such...
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
* The Jensen lacks dense memory, thus we have to address the bus via
|
|
||||||
* the sparse addressing scheme.
|
|
||||||
*
|
|
||||||
* Martin Ostermann (ost@comnets.rwth-aachen.de) - Apr.-Sep. 1996
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef linux
|
#ifdef linux
|
||||||
|
|
||||||
#ifdef TEST_JENSEN_CODE /* define to test the Sparse addressing on a non-Jensen */
|
|
||||||
#define SPARSE (5)
|
|
||||||
#define isJensen (1)
|
|
||||||
#else
|
|
||||||
#define isJensen (!_bus_base())
|
|
||||||
#define SPARSE (7)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
extern unsigned long _bus_base(void);
|
extern unsigned long _bus_base(void);
|
||||||
extern unsigned long _bus_base_sparse(void);
|
#define BUS_BASE _bus_base()
|
||||||
#define BUS_BASE (isJensen ? _bus_base_sparse() : _bus_base())
|
|
||||||
#define JENSEN_SHIFT(x) (isJensen ? ((long)x<<SPARSE) : (long)x)
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
extern u_int64_t dense_base(void);
|
extern u_int64_t dense_base(void);
|
||||||
#define BUS_BASE dense_base()
|
#define BUS_BASE dense_base()
|
||||||
#define JENSEN_SHIFT(x) ((long) x)
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -141,8 +123,8 @@ xf86ReadBIOS(unsigned long Base, unsigned long Offset, unsigned char *Buf,
|
||||||
Offset += Base & (psize - 1);
|
Offset += Base & (psize - 1);
|
||||||
Base &= ~(psize - 1);
|
Base &= ~(psize - 1);
|
||||||
mlen = (Offset + Len + psize - 1) & ~(psize - 1);
|
mlen = (Offset + Len + psize - 1) & ~(psize - 1);
|
||||||
base = mmap((caddr_t)0, JENSEN_SHIFT(mlen), PROT_READ,
|
base = mmap((caddr_t)0, mlen, PROT_READ,
|
||||||
MAP_SHARED, fd, (off_t)(JENSEN_SHIFT(Base) + BUS_BASE));
|
MAP_SHARED, fd, (off_t)(Base + BUS_BASE));
|
||||||
|
|
||||||
if (base == MAP_FAILED)
|
if (base == MAP_FAILED)
|
||||||
{
|
{
|
||||||
|
@ -151,10 +133,9 @@ xf86ReadBIOS(unsigned long Base, unsigned long Offset, unsigned char *Buf,
|
||||||
return(-1);
|
return(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
xf86SlowBCopyFromBus((unsigned char *)(base+JENSEN_SHIFT(Offset)),
|
xf86SlowBCopyFromBus((unsigned char *)(base+Offset), Buf, Len);
|
||||||
Buf, Len);
|
|
||||||
|
|
||||||
munmap((caddr_t)JENSEN_SHIFT(base), JENSEN_SHIFT(mlen));
|
munmap((caddr_t)base, mlen);
|
||||||
close(fd);
|
close(fd);
|
||||||
return(Len);
|
return(Len);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue