diff -ur /usr/ports/x11/XFree86/work/xc/programs/Xserver/hw/xfree86/os-support/bsd/bsd_video.c programs/Xserver/hw/xfree86/os-support/bsd/bsd_video.c --- /usr/ports/x11/XFree86/work/xc/programs/Xserver/hw/xfree86/os-support/bsd/bsd_video.c Mon Feb 16 00:42:01 1998 +++ programs/Xserver/hw/xfree86/os-support/bsd/bsd_video.c Tue Dec 8 10:05:56 1998 @@ -40,6 +40,13 @@ #define MAP_FLAGS (MAP_FILE | MAP_SHARED) #endif +#ifdef __alpha__ +extern u_int64_t dense_base(); +#define BUS_BASE dense_base() +#else +#define BUS_BASE 0L +#endif + /***************************************************************************/ /* Video Memory Mapping section */ /***************************************************************************/ @@ -77,7 +84,7 @@ { /* Try to map a page at the VGA address */ base = (pointer)mmap((caddr_t)0, 4096, PROT_READ|PROT_WRITE, - MAP_FLAGS, fd, (off_t)0xA0000); + MAP_FLAGS, fd, (off_t)0xA0000 + BUS_BASE); if (base != (pointer)-1) { @@ -147,7 +154,6 @@ #endif } - pointer xf86MapVidMem(ScreenNum, Region, Base, Size) int ScreenNum; @@ -160,6 +166,10 @@ if (!devMemChecked) checkDevMem(FALSE); +#ifdef __alpha__ + Base = (pointer)((unsigned long)Base & ((1L<<32) - 1)); +#endif + if (useDevMem) { if (devMemFd < 0) @@ -169,7 +179,7 @@ } base = (pointer)mmap((caddr_t)0, Size, PROT_READ|PROT_WRITE, MAP_FLAGS, devMemFd, - (off_t)(unsigned long) Base); + (off_t)(unsigned long) Base + BUS_BASE); if (base == (pointer)-1) { FatalError("%s: could not mmap %s [s=%x,a=%x] (%s)\n", @@ -195,11 +205,14 @@ } base = (pointer)mmap(0, Size, PROT_READ|PROT_WRITE, MAP_FLAGS, xf86Info.screenFd, -#ifdef __mips__ - (unsigned long)Base); +#if defined(__alpha__) + (unsigned long)Base + BUS_BASE +#elif defined(__mips__) + (unsigned long)Base #else - (unsigned long)Base - 0xA0000); + (unsigned long)Base - 0xA0000 #endif + ); if (base == (pointer)-1) { FatalError("xf86MapVidMem: Could not mmap /dev/vga (%s)\n", @@ -397,7 +410,73 @@ ErrorF("EnableIOPorts: failed to open %s (%s)\n", "/dev/ttyC0", strerror(errno)); } - + + ExtendedEnabled = TRUE; + + return; +} + +void +xf86DisableIOPorts(ScreenNum) +int ScreenNum; +{ + int i; + + ScreenEnabled[ScreenNum] = FALSE; + + return; +} + +void xf86DisableIOPrivs() +{ +} + +#endif /* USE_ARC_MMAP */ + +#ifdef USE_ALPHA_PORTS + +static Bool ScreenEnabled[MAXSCREENS]; +static Bool ExtendedEnabled = FALSE; +static Bool InitDone = FALSE; + +void +xf86ClearIOPortList(ScreenNum) +int ScreenNum; +{ + if (!InitDone) + { + int i; + for (i = 0; i < MAXSCREENS; i++) + ScreenEnabled[i] = FALSE; + InitDone = TRUE; + } + return; +} + +void +xf86AddIOPorts(ScreenNum, NumPorts, Ports) +int ScreenNum; +int NumPorts; +unsigned *Ports; +{ + return; +} + +void +xf86EnableIOPorts(ScreenNum) +int ScreenNum; +{ + int i; + int fd; + pointer base; + + ScreenEnabled[ScreenNum] = TRUE; + + if (ExtendedEnabled) + return; + + ioperm(0, 65536, TRUE); + ExtendedEnabled = TRUE; return; @@ -411,6 +490,8 @@ ScreenEnabled[ScreenNum] = FALSE; + ioperm(0, 65536, FALSE); + return; } @@ -428,7 +509,7 @@ xf86DisableInterrupts() { -#if !defined(__mips__) +#if !defined(__mips__) && !defined(__alpha__) #ifdef __GNUC__ __asm__ __volatile__("cli"); #else @@ -443,7 +524,7 @@ xf86EnableInterrupts() { -#if !defined(__mips__) +#if !defined(__mips__) && !defined(__alpha__) #ifdef __GNUC__ __asm__ __volatile__("sti"); #else @@ -453,3 +534,223 @@ return; } + +#if defined(__alpha__) + +#if 0 + +#include + +#define SPARSE_SHIFT 5 + +static pointer sparseMappedVirt; +static unsigned long sparseMappedPhys; + +pointer xf86MapVidMemSparse(ScreenNum, Region, Base, Size) +int ScreenNum; +int Region; +pointer Base; +unsigned long Size; +{ + pointer base; + int fd; + + sparseMappedPhys = (unsigned long) Base; + + Size <<= SPARSE_SHIFT; + Base = (pointer)((sparseMappedPhys & ~_bus_hae_mask()) << SPARSE_SHIFT); + + if ((fd = open("/dev/mem", O_RDWR)) < 0) + { + FatalError("xf86MapVidMem: failed to open /dev/mem (%s)\n", + strerror(errno)); + } + /* This requirers linux-0.99.pl10 or above */ + base = (pointer)mmap((caddr_t)0, Size, + PROT_READ | PROT_WRITE, + MAP_SHARED, fd, + (off_t)Base + _bus_base_sparse()); + close(fd); + if ((long)base == -1) + { + FatalError("xf86MapVidMem: Could not mmap framebuffer (%s)\n", + strerror(errno)); + } + + /* + * This enables user HAE settings for this process. + */ + alpha_sethae(0); + + sparseMappedVirt = base; + + return base; +} + +void xf86UnMapVidMemSparse(ScreenNum, Region, Base, Size) +int ScreenNum; +int Region; +pointer Base; +unsigned long Size; +{ + Size <<= SPARSE_SHIFT; + + munmap((caddr_t)Base, Size); +} + +#define vuip volatile unsigned int * + +static void +setupAddress(Offset) +unsigned long Offset; +{ + unsigned long phys = sparseMappedPhys + Offset; + alpha_sethae(phys & _bus_hae_mask()); +} + +int xf86ReadSparse8(Base, Offset) +pointer Base; +unsigned long Offset; +{ + unsigned long result, shift; + + shift = (Offset & 0x3) * 8; + setupAddress(Offset); + result = *(vuip) ((unsigned long)Base + (Offset << SPARSE_SHIFT)); + result >>= shift; + return 0xffUL & result; +} + +int xf86ReadSparse16(Base, Offset) +pointer Base; +unsigned long Offset; +{ + unsigned long result, shift; + + shift = (Offset & 0x2) * 8; + setupAddress(Offset); + result = *(vuip)((unsigned long)Base+(Offset<>= shift; + return 0xffffUL & result; +} + +int xf86ReadSparse32(Base, Offset) +pointer Base; +unsigned long Offset; +{ + unsigned long result; + + setupAddress(Offset); + result = *(vuip)((unsigned long)Base+(Offset<