diff options
Diffstat (limited to 'nx-X11/programs/Xserver/hw/xfree86/os-support/pmax/pmax_map.c')
-rw-r--r-- | nx-X11/programs/Xserver/hw/xfree86/os-support/pmax/pmax_map.c | 239 |
1 files changed, 239 insertions, 0 deletions
diff --git a/nx-X11/programs/Xserver/hw/xfree86/os-support/pmax/pmax_map.c b/nx-X11/programs/Xserver/hw/xfree86/os-support/pmax/pmax_map.c new file mode 100644 index 000000000..36d3366a2 --- /dev/null +++ b/nx-X11/programs/Xserver/hw/xfree86/os-support/pmax/pmax_map.c @@ -0,0 +1,239 @@ +/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/pmax/pmax_map.c,v 1.7 2000/06/27 14:27:31 tsi Exp $ */ +/* + * Copyright 1998 by Concurrent Computer Corporation + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Concurrent Computer + * Corporation not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Concurrent Computer Corporation makes no representations + * about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * CONCURRENT COMPUTER CORPORATION DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL CONCURRENT COMPUTER CORPORATION BE + * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY + * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * Copyright 1998 by Metro Link Incorporated + * + * Permission to use, copy, modify, distribute, and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and that + * both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Metro Link + * Incorporated not be used in advertising or publicity pertaining to + * distribution of the software without specific, written prior + * permission. Metro Link Incorporated makes no representations + * about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * METRO LINK INCORPORATED DISCLAIMS ALL WARRANTIES WITH REGARD + * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS, IN NO EVENT SHALL METRO LINK INCORPORATED BE + * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY + * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + * + * This file was derived in part from the original XFree86 sysv OS + * support which contains the following copyright notice: + * + * Copyright 1990,91 by Thomas Roell, Dinkelscherben, Germany + * Copyright 1993 by David Wexelblat <dwex@goblin.org> + * + * Permission to use, copy, modify, distribute, and sell this software and its + * documentation for any purpose is hereby granted without fee, provided that + * the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the names of Thomas Roell and David Wexelblat + * not be used in advertising or publicity pertaining to distribution of + * the software without specific, written prior permission. Thomas Roell and + * David Wexelblat makes no representations about the suitability of this + * software for any purpose. It is provided "as is" without express or + * implied warranty. + * + * THOMAS ROELL AND DAVID WEXELBLAT DISCLAIMS ALL WARRANTIES WITH REGARD TO + * THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS, IN NO EVENT SHALL THOMAS ROELL OR DAVID WEXELBLAT BE LIABLE FOR + * ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ + +#ifdef HAVE_XORG_CONFIG_H +#include <xorg-config.h> +#endif + +#include <X11/X.h> + +#include "xf86.h" +#include "xf86Priv.h" +#include "xf86_OSlib.h" + +#include "Pci.h" + +/***************************************************************************/ +/* Video Memory Mapping section */ +/***************************************************************************/ + +/* + * Map an I/O region given its address (host POV) + */ +void * +pmax_iomap(unsigned long base, unsigned long len) +{ + int fd; + void *rv; + + if ((fd = open("/dev/iomem", O_RDWR)) < 0) + { + ErrorF("pmax_iomap: failed to open /dev/iomem (%s)\n", + strerror(errno)); + return(MAP_FAILED); + } + + rv = (void *)mmap((caddr_t)0, len, PROT_READ|PROT_WRITE, + MAP_SHARED, fd, (off_t)base); + + close(fd); + return(rv); +} + +Bool +xf86LinearVidMem() +{ + return TRUE; +} + +extern void * pmax_iomap(unsigned long, unsigned long); + +pointer +xf86MapVidMem(int ScreenNum, int Region, pointer Base, unsigned long Size) +{ + ErrorF("%s: Not supported on this OS. Drivers should use xf86MapPciMem() instead\n", + "xf86MapVidMem"); + FatalError("%s: Cannot map [s=%x,a=%x]\n", "xf86MapVidMem", Size, Base); +} + + +pointer +xf86MapPciMem(int ScreenNum, int Flags, PCITAG Tag, pointer Base, + unsigned long Size) +{ + pointer hostbase = pciBusAddrToHostAddr(Tag, Base); + pointer base; + + base = (pointer) pmax_iomap((unsigned long)hostbase, Size); + if (base == MAP_FAILED) { + xf86Msg(X_WARNING, + "xf86MapPciMem: Could not mmap PCI memory " + "[base=0x%x,hostbase=0x%x,size=%x] (%s)\n", + Base, hostbase, Size, strerror(errno)); + } + return((pointer)base); +} + + +/* ARGSUSED */ +void +xf86UnMapVidMem(int ScreenNum, pointer Base, unsigned long Size) +{ + munmap(Base, Size); +} + +/* + * Read BIOS via mmap()ing /dev/iomem. + */ +/*ARGSUSED*/ +int +xf86ReadBIOS(unsigned long Base, unsigned long Offset, unsigned char *Buf, int Len) +{ + ErrorF("%s: Not supported on this OS. Drivers should use xf86ReadPciBIOS() instead\n", + "xf86ReadBIOS"); + FatalError("%s: Cannot read BIOS [base=0x%x,offset=0x%x,size=%d]\n", "xf86ReadBIOS", Base, Offset, Len); +} + +int +xf86ReadPciBIOS(unsigned long Base, unsigned long Offset, PCITAG Tag, + unsigned char *Buf, int Len) +{ + pointer hostbase = pciBusAddrToHostAddr(Tag, (void *)Base); + char *base; + int psize; + int mlen; + + psize = xf86getpagesize(); + Offset += Base & (psize - 1); + Base &= ~(psize - 1); + mlen = (Offset + Len + psize - 1) & ~(psize - 1); + base = pmax_iomap((unsigned long)hostbase, mlen); + if (base == MAP_FAILED) { + xf86Msg(X_WARNING, "xf86ReadPciBIOS: Could not mmap PCI memory" + " [base=0x%x,hostbase=0x%x,size=%x] (%s)\n", + Base, hostbase, mlen, strerror(errno)); + return(0); + } + + (void)memcpy(Buf, base + Offset, Len); + (void)munmap(base, mlen); + return(Len); +} + +/***************************************************************************/ +/* Interrupt Handling section */ +/***************************************************************************/ + +#include <sys/ipl.h> + +#ifndef PL_HI +#define PL_HI PL8 +#endif + +#ifndef PL_0 +#define PL_0 PL0 +#endif + +static void *spl_map_addr = NULL; + +void +pmax_init_splmap(void) +{ + spl_map_addr = spl_map(0); + if (!spl_map_addr) { + xf86Msg(X_WARNING, + "pmax_init_splmap: spl_map() failed. " + "Cannot bind to IPL register\n"); + xf86ErrorF("\tInterrupts cannot be disabled/enabled !!!\n"); + } +} + + +Bool +xf86DisableInterrupts() +{ + if (spl_map_addr) { + (void)spl_request(PL_HI,spl_map_addr); + return(TRUE); + } + + return(FALSE); +} + +void xf86EnableInterrupts() +{ + if (spl_map_addr) { + (void)spl_request(PL_0, spl_map_addr); + } +} + |