summaryrefslogtreecommitdiff
path: root/hw/xfree86/os-support
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2009-10-13 18:40:42 -0700
committerKeith Packard <keithp@keithp.com>2009-10-13 18:40:42 -0700
commit6e158003e80534ce007290f75c89d698aec1d00b (patch)
tree21865cf3816b155b100ffbdda6d99ff98d688ae1 /hw/xfree86/os-support
parent2b14e142039193ea854a02706662204f4f5f6db8 (diff)
parent5e762f0e2f203b5121a3de3b9af3c8981b31a77f (diff)
Merge remote branch 'mattst88/master'
* mattst88/master: [alpha] assume we have __NR_pciconfig_iobase [alpha] don't return from void functions Fix undefined symbols on alpha Fix breakage on alpha caused by c7680befe5ae Revert "alpha: kill xf86SlowBCopyToBus and xf86SlowBCopyFromBus"
Diffstat (limited to 'hw/xfree86/os-support')
-rw-r--r--hw/xfree86/os-support/linux/lnx_axp.c16
-rw-r--r--hw/xfree86/os-support/linux/lnx_ev56.c18
-rw-r--r--hw/xfree86/os-support/misc/SlowBcopy.c68
-rw-r--r--hw/xfree86/os-support/shared/bios_mmap.c2
4 files changed, 87 insertions, 17 deletions
diff --git a/hw/xfree86/os-support/linux/lnx_axp.c b/hw/xfree86/os-support/linux/lnx_axp.c
index 8571c048b..10b97b0d6 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;
@@ -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
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
diff --git a/hw/xfree86/os-support/misc/SlowBcopy.c b/hw/xfree86/os-support/misc/SlowBcopy.c
index 8a5017e52..0021b5544 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,64 @@ xf86SlowBcopy(unsigned char *src, unsigned char *dst, int len)
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
diff --git a/hw/xfree86/os-support/shared/bios_mmap.c b/hw/xfree86/os-support/shared/bios_mmap.c
index a615a1d45..40afd5b8e 100644
--- a/hw/xfree86/os-support/shared/bios_mmap.c
+++ b/hw/xfree86/os-support/shared/bios_mmap.c
@@ -131,7 +131,7 @@ xf86ReadBIOS(unsigned long Base, unsigned long Offset, unsigned char *Buf,
return(-1);
}
- xf86SlowBcopy((unsigned char *)(base+Offset), Buf, Len);
+ xf86SlowBCopyFromBus((unsigned char *)(base+Offset), Buf, Len);
munmap((caddr_t)base, mlen);
close(fd);