From aa07957373fd7cbe67458a001e4afd6a7f1ea37f Mon Sep 17 00:00:00 2001 From: Peter Hutterer Date: Mon, 28 Sep 2009 12:20:03 +1000 Subject: [PATCH 1/5] Revert "alpha: kill xf86SlowBCopyToBus and xf86SlowBCopyFromBus" The vesa driver still uses slowbcopy_frombus and slowbcopy_tobus. This reverts commit 5ef53a94ce4e48e11de26290cd677266308640c8. Signed-off-by: Peter Hutterer --- hw/xfree86/common/compiler.h | 16 ++++++++ hw/xfree86/os-support/misc/SlowBcopy.c | 52 ++++++++++++++++++++++++ hw/xfree86/os-support/shared/bios_mmap.c | 2 +- hw/xfree86/vgahw/vgaHW.c | 16 ++++---- 4 files changed, 77 insertions(+), 9 deletions(-) diff --git a/hw/xfree86/common/compiler.h b/hw/xfree86/common/compiler.h index cdb493a23..a450bd676 100644 --- a/hw/xfree86/common/compiler.h +++ b/hw/xfree86/common/compiler.h @@ -1211,6 +1211,8 @@ extern _X_EXPORT void (*xf86WriteMmio32)(int, void *, unsigned long); extern _X_EXPORT void (*xf86WriteMmioNB8)(int, void *, unsigned long); extern _X_EXPORT void (*xf86WriteMmioNB16)(int, void *, unsigned long); extern _X_EXPORT void (*xf86WriteMmioNB32)(int, void *, unsigned long); +extern _X_EXPORT void xf86SlowBCopyFromBus(unsigned char *, unsigned char *, int); +extern _X_EXPORT void xf86SlowBCopyToBus(unsigned char *, unsigned char *, int); /* Some macros to hide the system dependencies for MMIO accesses */ /* Changed to kill noise generated by gcc's -Wcast-align */ @@ -1342,4 +1344,18 @@ extern _X_EXPORT void (*xf86WriteMmioNB32)(int, void *, unsigned long); # define MMIO_MOVE32(base, offset, val) MMIO_OUT32(base, offset, val) # endif /* __alpha__ */ + +/* + * With Intel, the version in os-support/misc/SlowBcopy.s is used. + * This avoids port I/O during the copy (which causes problems with + * some hardware). + */ +# ifdef __alpha__ +# define slowbcopy_tobus(src,dst,count) xf86SlowBCopyToBus(src,dst,count) +# define slowbcopy_frombus(src,dst,count) xf86SlowBCopyFromBus(src,dst,count) +# else /* __alpha__ */ +# define slowbcopy_tobus(src,dst,count) xf86SlowBcopy(src,dst,count) +# define slowbcopy_frombus(src,dst,count) xf86SlowBcopy(src,dst,count) +# endif /* __alpha__ */ + #endif /* _COMPILER_H */ diff --git a/hw/xfree86/os-support/misc/SlowBcopy.c b/hw/xfree86/os-support/misc/SlowBcopy.c index 8a5017e52..182a3e6ec 100644 --- a/hw/xfree86/os-support/misc/SlowBcopy.c +++ b/hw/xfree86/os-support/misc/SlowBcopy.c @@ -1,8 +1,15 @@ +/******************************************************************************* + 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 @@ -47,3 +54,48 @@ xf86SlowBcopy(unsigned char *src, unsigned char *dst, int len) while(len--) *dst++ = *src++; } + +#ifdef __alpha__ + +#ifdef linux + +#define SPARSE (7) + +#else + +#define SPARSE 0 + +#endif + +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<FontInfo1) { hwp->writeSeq(hwp, 0x02, 0x04); /* write to plane 2 */ hwp->writeGr(hwp, 0x04, 0x02); /* read plane 2 */ - xf86SlowBcopy(hwp->FontInfo1, hwp->Base, FONT_AMOUNT); + slowbcopy_tobus(hwp->FontInfo1, hwp->Base, FONT_AMOUNT); } #endif @@ -801,7 +801,7 @@ vgaHWRestoreFonts(ScrnInfoPtr scrninfp, vgaRegPtr restore) if (hwp->FontInfo2) { hwp->writeSeq(hwp, 0x02, 0x08); /* write to plane 3 */ hwp->writeGr(hwp, 0x04, 0x03); /* read plane 3 */ - xf86SlowBcopy(hwp->FontInfo2, hwp->Base, FONT_AMOUNT); + slowbcopy_tobus(hwp->FontInfo2, hwp->Base, FONT_AMOUNT); } #endif @@ -809,10 +809,10 @@ vgaHWRestoreFonts(ScrnInfoPtr scrninfp, vgaRegPtr restore) if (hwp->TextInfo) { hwp->writeSeq(hwp, 0x02, 0x01); /* write to plane 0 */ hwp->writeGr(hwp, 0x04, 0x00); /* read plane 0 */ - xf86SlowBcopy(hwp->TextInfo, hwp->Base, TEXT_AMOUNT); + slowbcopy_tobus(hwp->TextInfo, hwp->Base, TEXT_AMOUNT); hwp->writeSeq(hwp, 0x02, 0x02); /* write to plane 1 */ hwp->writeGr(hwp, 0x04, 0x01); /* read plane 1 */ - xf86SlowBcopy((unsigned char *)hwp->TextInfo + TEXT_AMOUNT, + slowbcopy_tobus((unsigned char *)hwp->TextInfo + TEXT_AMOUNT, hwp->Base, TEXT_AMOUNT); } #endif @@ -971,24 +971,24 @@ vgaHWSaveFonts(ScrnInfoPtr scrninfp, vgaRegPtr save) if (hwp->FontInfo1 || (hwp->FontInfo1 = xalloc(FONT_AMOUNT))) { hwp->writeSeq(hwp, 0x02, 0x04); /* write to plane 2 */ hwp->writeGr(hwp, 0x04, 0x02); /* read plane 2 */ - xf86SlowBcopy(hwp->Base, hwp->FontInfo1, FONT_AMOUNT); + slowbcopy_frombus(hwp->Base, hwp->FontInfo1, FONT_AMOUNT); } #endif /* SAVE_FONT1 */ #if SAVE_FONT2 if (hwp->FontInfo2 || (hwp->FontInfo2 = xalloc(FONT_AMOUNT))) { hwp->writeSeq(hwp, 0x02, 0x08); /* write to plane 3 */ hwp->writeGr(hwp, 0x04, 0x03); /* read plane 3 */ - xf86SlowBcopy(hwp->Base, hwp->FontInfo2, FONT_AMOUNT); + slowbcopy_frombus(hwp->Base, hwp->FontInfo2, FONT_AMOUNT); } #endif /* SAVE_FONT2 */ #if SAVE_TEXT if (hwp->TextInfo || (hwp->TextInfo = xalloc(2 * TEXT_AMOUNT))) { hwp->writeSeq(hwp, 0x02, 0x01); /* write to plane 0 */ hwp->writeGr(hwp, 0x04, 0x00); /* read plane 0 */ - xf86SlowBcopy(hwp->Base, hwp->TextInfo, TEXT_AMOUNT); + slowbcopy_frombus(hwp->Base, hwp->TextInfo, TEXT_AMOUNT); hwp->writeSeq(hwp, 0x02, 0x02); /* write to plane 1 */ hwp->writeGr(hwp, 0x04, 0x01); /* read plane 1 */ - xf86SlowBcopy(hwp->Base, + slowbcopy_frombus(hwp->Base, (unsigned char *)hwp->TextInfo + TEXT_AMOUNT, TEXT_AMOUNT); } #endif /* SAVE_TEXT */ From 9625f6d328d6f516520930227b218979309938bc Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Tue, 6 Oct 2009 20:58:30 -0400 Subject: [PATCH 2/5] 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 --- hw/xfree86/os-support/misc/SlowBcopy.c | 58 ++++++++++++++++---------- 1 file changed, 37 insertions(+), 21 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; + 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<>= ((addr>>SPARSE) & 3) * 8; + *dst++ = (unsigned char) (0xffUL & result); + addr += 1< Date: Wed, 7 Oct 2009 18:33:29 -0400 Subject: [PATCH 3/5] Fix undefined symbols on alpha Signed-off-by: Matt Turner --- hw/xfree86/os-support/linux/lnx_axp.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/hw/xfree86/os-support/linux/lnx_axp.c b/hw/xfree86/os-support/linux/lnx_axp.c index 8571c048b..34129ccbb 100644 --- a/hw/xfree86/os-support/linux/lnx_axp.c +++ b/hw/xfree86/os-support/linux/lnx_axp.c @@ -125,12 +125,12 @@ extern unsigned int _dense_inb(unsigned long); extern unsigned int _dense_inw(unsigned long); extern unsigned int _dense_inl(unsigned long); -void (*_alpha_outb)(char, unsigned long) = _outb; -void (*_alpha_outw)(short, unsigned long) = _outw; -void (*_alpha_outl)(int, unsigned long) = _outl; -unsigned int (*_alpha_inb)(unsigned long) = _inb; -unsigned int (*_alpha_inw)(unsigned long) = _inw; -unsigned int (*_alpha_inl)(unsigned long) = _inl; +_X_EXPORT void (*_alpha_outb)(char, unsigned long) = _outb; +_X_EXPORT void (*_alpha_outw)(short, unsigned long) = _outw; +_X_EXPORT void (*_alpha_outl)(int, unsigned long) = _outl; +_X_EXPORT unsigned int (*_alpha_inb)(unsigned long) = _inb; +_X_EXPORT unsigned int (*_alpha_inw)(unsigned long) = _inw; +_X_EXPORT unsigned int (*_alpha_inl)(unsigned long) = _inl; static long _alpha_iobase_query(unsigned, int, int, int); long (*_iobase)(unsigned, int, int, int) = _alpha_iobase_query; From 46785c04bca16f495af3ed8d685aee939a1a8f39 Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Tue, 13 Oct 2009 20:40:59 -0400 Subject: [PATCH 4/5] [alpha] don't return from void functions Signed-off-by: Matt Turner --- hw/xfree86/os-support/linux/lnx_ev56.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/hw/xfree86/os-support/linux/lnx_ev56.c b/hw/xfree86/os-support/linux/lnx_ev56.c index e751da2d0..c65e1cca4 100644 --- a/hw/xfree86/os-support/linux/lnx_ev56.c +++ b/hw/xfree86/os-support/linux/lnx_ev56.c @@ -94,28 +94,34 @@ writeDense32(int Value, pointer Base, register unsigned long Offset) void _dense_outb(char val, unsigned long port) { - if ((port & ~0xffff) == 0) return _outb(val, port); - + if ((port & ~0xffff) == 0) { + _outb(val, port); + } else { write_mem_barrier(); *(volatile CARD8 *)port = val; + } } void _dense_outw(short val, unsigned long port) { - if ((port & ~0xffff) == 0) return _outw(val, port); - + if ((port & ~0xffff) == 0) { + _outw(val, port); + } else { write_mem_barrier(); *(volatile CARD16 *)port = val; + } } void _dense_outl(int val, unsigned long port) { - if ((port & ~0xffff) == 0) return _outl(val, port); - + if ((port & ~0xffff) == 0) { + _outl(val, port); + } else { write_mem_barrier(); *(volatile CARD32 *)port = val; + } } unsigned int From 5e762f0e2f203b5121a3de3b9af3c8981b31a77f Mon Sep 17 00:00:00 2001 From: Matt Turner Date: Tue, 13 Oct 2009 20:42:14 -0400 Subject: [PATCH 5/5] [alpha] assume we have __NR_pciconfig_iobase The code path if we didn't have support has been broken since before we switched to git. The pciconfig_iobase syscall has been supported since 2000. Signed-off-by: Matt Turner --- hw/xfree86/os-support/linux/lnx_axp.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/hw/xfree86/os-support/linux/lnx_axp.c b/hw/xfree86/os-support/linux/lnx_axp.c index 34129ccbb..10b97b0d6 100644 --- a/hw/xfree86/os-support/linux/lnx_axp.c +++ b/hw/xfree86/os-support/linux/lnx_axp.c @@ -138,16 +138,12 @@ long (*_iobase)(unsigned, int, int, int) = _alpha_iobase_query; static long _alpha_iobase(unsigned flags, int hose, int bus, int devfn) { -#ifdef __NR_pciconfig_iobase if (bus < 0) { bus = hose; flags |= IOBASE_FROM_HOSE; } return syscall(__NR_pciconfig_iobase, flags, bus, devfn); -#else - return -ENOSYS -#endif } static long