aboutsummaryrefslogtreecommitdiffhomepage
path: root/vidix/sysdep
diff options
context:
space:
mode:
authorGravatar ben <ben@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-04-06 15:20:49 +0000
committerGravatar ben <ben@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-04-06 15:20:49 +0000
commit51ba40dcd64518c8d5f9ce586171c8fb347a42c0 (patch)
tree590b1ce6d17f2126b67d1a5cb1576cdd7e8dea5c /vidix/sysdep
parent3099d0da16505cbc0aaab34f9299404e9ec19241 (diff)
merged libdha and libvidix, moved all files from libdha to vidix directory
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@22918 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'vidix/sysdep')
-rw-r--r--vidix/sysdep/AsmMacros_alpha.h26
-rw-r--r--vidix/sysdep/AsmMacros_arm32.h50
-rw-r--r--vidix/sysdep/AsmMacros_ia64.h16
-rw-r--r--vidix/sysdep/AsmMacros_powerpc.h60
-rw-r--r--vidix/sysdep/AsmMacros_sparc.h53
-rw-r--r--vidix/sysdep/AsmMacros_x86.h293
-rw-r--r--vidix/sysdep/libdha_os2.c161
-rw-r--r--vidix/sysdep/libdha_win32.c102
-rw-r--r--vidix/sysdep/pci_386bsd.c38
-rw-r--r--vidix/sysdep/pci_alpha.c29
-rw-r--r--vidix/sysdep/pci_arm32.c60
-rw-r--r--vidix/sysdep/pci_bsdi.c39
-rw-r--r--vidix/sysdep/pci_freebsd.c38
-rw-r--r--vidix/sysdep/pci_ia64.c60
-rw-r--r--vidix/sysdep/pci_isc.c32
-rw-r--r--vidix/sysdep/pci_linux.c191
-rw-r--r--vidix/sysdep/pci_lynx.c93
-rw-r--r--vidix/sysdep/pci_mach386.c25
-rw-r--r--vidix/sysdep/pci_netbsd.c44
-rw-r--r--vidix/sysdep/pci_openbsd.c27
-rw-r--r--vidix/sysdep/pci_os2.c55
-rw-r--r--vidix/sysdep/pci_powerpc.c30
-rw-r--r--vidix/sysdep/pci_sco.c33
-rw-r--r--vidix/sysdep/pci_sparc.c60
-rw-r--r--vidix/sysdep/pci_svr4.c42
-rw-r--r--vidix/sysdep/pci_win32.c38
-rw-r--r--vidix/sysdep/pci_x86.c60
27 files changed, 1755 insertions, 0 deletions
diff --git a/vidix/sysdep/AsmMacros_alpha.h b/vidix/sysdep/AsmMacros_alpha.h
new file mode 100644
index 0000000000..482b59000e
--- /dev/null
+++ b/vidix/sysdep/AsmMacros_alpha.h
@@ -0,0 +1,26 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/AsmMacros.h,v 1.1 2001/11/16 21:13:34 tsi Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+#ifndef __ASM_MACROS_ALPHA_H
+#define __ASM_MACROS_ALPHA_H
+#if defined (linux)
+#include <sys/io.h>
+#elif defined (__FreeBSD__)
+#include <sys/types.h>
+extern void outb(u_int32_t port, u_int8_t val);
+extern void outw(u_int32_t port, u_int16_t val);
+extern void outl(u_int32_t port, u_int32_t val);
+extern u_int8_t inb(u_int32_t port);
+extern u_int16_t inw(u_int32_t port);
+extern u_int32_t inl(u_int32_t port);
+#else
+#error This stuff is not ported on your system
+#endif
+
+#define intr_disable()
+#define intr_enable()
+
+#endif
diff --git a/vidix/sysdep/AsmMacros_arm32.h b/vidix/sysdep/AsmMacros_arm32.h
new file mode 100644
index 0000000000..e618d32ee0
--- /dev/null
+++ b/vidix/sysdep/AsmMacros_arm32.h
@@ -0,0 +1,50 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/AsmMacros.h,v 1.1 2001/11/16 21:13:34 tsi Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+#ifndef __ASM_MACROS_ARM32_H
+#define __ASM_MACROS_ARM32_H
+unsigned int IOPortBase; /* Memory mapped I/O port area */
+
+static __inline__ void outb(short port,char val)
+{
+ if ((unsigned short)port >= 0x400) return;
+ *(volatile unsigned char*)(((unsigned short)(port))+IOPortBase) = val;
+}
+
+static __inline__ void outw(short port,short val)
+{
+ if ((unsigned short)port >= 0x400) return;
+ *(volatile unsigned short*)(((unsigned short)(port))+IOPortBase) = val;
+}
+
+static __inline__ void outl(short port,int val)
+{
+ if ((unsigned short)port >= 0x400) return;
+ *(volatile unsigned long*)(((unsigned short)(port))+IOPortBase) = val;
+}
+
+static __inline__ unsigned int inb(short port)
+{
+ if ((unsigned short)port >= 0x400) return((unsigned int)-1);
+ return(*(volatile unsigned char*)(((unsigned short)(port))+IOPortBase));
+}
+
+static __inline__ unsigned int inw(short port)
+{
+ if ((unsigned short)port >= 0x400) return((unsigned int)-1);
+ return(*(volatile unsigned short*)(((unsigned short)(port))+IOPortBase));
+}
+
+static __inline__ unsigned int inl(short port)
+{
+ if ((unsigned short)port >= 0x400) return((unsigned int)-1);
+ return(*(volatile unsigned long*)(((unsigned short)(port))+IOPortBase));
+}
+
+#define intr_disable()
+#define intr_enable()
+
+#endif
diff --git a/vidix/sysdep/AsmMacros_ia64.h b/vidix/sysdep/AsmMacros_ia64.h
new file mode 100644
index 0000000000..e59732fda5
--- /dev/null
+++ b/vidix/sysdep/AsmMacros_ia64.h
@@ -0,0 +1,16 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/AsmMacros.h,v 1.1 2001/11/16 21:13:34 tsi Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+#ifndef __ASM_MACROS_IA64_H
+#define __ASM_MACROS_IA64_H
+
+#if defined(linux)
+#include <sys/io.h>
+#else
+#error This stuff is not ported on your system
+#endif
+
+#endif
diff --git a/vidix/sysdep/AsmMacros_powerpc.h b/vidix/sysdep/AsmMacros_powerpc.h
new file mode 100644
index 0000000000..2e1edee2ae
--- /dev/null
+++ b/vidix/sysdep/AsmMacros_powerpc.h
@@ -0,0 +1,60 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/AsmMacros.h,v 1.1 2001/11/16 21:13:34 tsi Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+#ifndef __ASM_MACROS_POWERPC_H
+#define __ASM_MACROS_POWERPC_H
+
+#if defined(Lynx) || defined(__OpenBSD__)
+
+extern unsigned char *ioBase;
+
+static __inline__ volatile void eieio()
+{
+ __asm__ __volatile__ ("eieio");
+}
+
+static __inline__ void outb(short port, unsigned char value)
+{
+ *(unsigned char *)(ioBase + port) = value; eieio();
+}
+
+static __inline__ void outw(short port, unsigned short value)
+{
+ *(unsigned short *)(ioBase + port) = value; eieio();
+}
+
+static __inline__ void outl(short port, unsigned short value)
+{
+ *(unsigned long *)(ioBase + port) = value; eieio();
+}
+
+static __inline__ unsigned char inb(short port)
+{
+ unsigned char val;
+ val = *((unsigned char *)(ioBase + port)); eieio();
+ return(val);
+}
+
+static __inline__ unsigned short inw(short port)
+{
+ unsigned short val;
+ val = *((unsigned short *)(ioBase + port)); eieio();
+ return(val);
+}
+
+static __inline__ unsigned long inl(short port)
+{
+ unsigned long val;
+ val = *((unsigned long *)(ioBase + port)); eieio();
+ return(val);
+}
+
+#define intr_disable()
+#define intr_enable()
+
+#endif
+
+#endif
diff --git a/vidix/sysdep/AsmMacros_sparc.h b/vidix/sysdep/AsmMacros_sparc.h
new file mode 100644
index 0000000000..f6717b4bb7
--- /dev/null
+++ b/vidix/sysdep/AsmMacros_sparc.h
@@ -0,0 +1,53 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/AsmMacros.h,v 1.1 2001/11/16 21:13:34 tsi Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+#ifndef __ASM_MACROS_SPARC_H
+#define __ASM_MACROS_SPARC_H
+
+#ifndef ASI_PL
+#define ASI_PL 0x88
+#endif
+
+static __inline__ void outb(unsigned long port, char val)
+{
+ __asm__ __volatile__("stba %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL));
+}
+
+static __inline__ void outw(unsigned long port, char val)
+{
+ __asm__ __volatile__("stha %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL));
+}
+
+static __inline__ void outl(unsigned long port, char val)
+{
+ __asm__ __volatile__("sta %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL));
+}
+
+static __inline__ unsigned int inb(unsigned long port)
+{
+ unsigned char ret;
+ __asm__ __volatile__("lduba [%1] %2, %0" : "=r" (ret) : "r" (port), "i" (ASI_PL));
+ return ret;
+}
+
+static __inline__ unsigned int inw(unsigned long port)
+{
+ unsigned char ret;
+ __asm__ __volatile__("lduha [%1] %2, %0" : "=r" (ret) : "r" (port), "i" (ASI_PL));
+ return ret;
+}
+
+static __inline__ unsigned int inl(unsigned long port)
+{
+ unsigned char ret;
+ __asm__ __volatile__("lda [%1] %2, %0" : "=r" (ret) : "r" (port), "i" (ASI_PL));
+ return ret;
+}
+
+#define intr_disable()
+#define intr_enable()
+
+#endif
diff --git a/vidix/sysdep/AsmMacros_x86.h b/vidix/sysdep/AsmMacros_x86.h
new file mode 100644
index 0000000000..c2ab1dc217
--- /dev/null
+++ b/vidix/sysdep/AsmMacros_x86.h
@@ -0,0 +1,293 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/AsmMacros.h,v 1.1 2001/11/16 21:13:34 tsi Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+#ifndef __ASM_MACROS_X86_H
+#define __ASM_MACROS_X86_H
+
+//#if defined (WINNT)
+//#error This stuff is not ported on your system
+//#else
+
+#include "config.h"
+
+#ifdef CONFIG_DHAHELPER
+#include <sys/ioctl.h>
+#include "../kernelhelper/dhahelper.h"
+
+extern int dhahelper_fd;
+extern int dhahelper_initialized;
+#endif
+
+#ifdef CONFIG_SVGAHELPER
+#include <sys/ioctl.h>
+#include <svgalib_helper.h>
+
+#ifndef SVGALIB_HELPER_IOC_MAGIC
+/* svgalib 1.9.18+ compatibility ::atmos */
+#define SVGALIB_HELPER_IOCSOUTB SVGAHELPER_OUTB
+#define SVGALIB_HELPER_IOCSOUTW SVGAHELPER_OUTW
+#define SVGALIB_HELPER_IOCSOUTL SVGAHELPER_OUTL
+#define SVGALIB_HELPER_IOCGINB SVGAHELPER_INB
+#define SVGALIB_HELPER_IOCGINW SVGAHELPER_INW
+#define SVGALIB_HELPER_IOCGINL SVGAHELPER_INL
+#endif
+
+extern int svgahelper_fd;
+extern int svgahelper_initialized;
+
+static __inline__ void svga_outb(short port, char value)
+{
+ io_t iov;
+
+ iov.val = value;
+ iov.port = port;
+ ioctl(svgahelper_fd, SVGALIB_HELPER_IOCSOUTB, &iov);
+}
+
+static __inline__ void svga_outw(short port, char value)
+{
+ io_t iov;
+
+ iov.val = value;
+ iov.port = port;
+ ioctl(svgahelper_fd, SVGALIB_HELPER_IOCSOUTW, &iov);
+}
+
+static __inline__ void svga_outl(short port, unsigned int value)
+{
+ io_t iov;
+
+ iov.val = value;
+ iov.port = port;
+ ioctl(svgahelper_fd, SVGALIB_HELPER_IOCSOUTL, &iov);
+}
+
+static __inline__ unsigned int svga_inb(short port)
+{
+ io_t iov;
+
+ iov.port = port;
+ ioctl(svgahelper_fd, SVGALIB_HELPER_IOCGINB, &iov);
+
+ return iov.val;
+}
+
+static __inline__ unsigned int svga_inw(short port)
+{
+ io_t iov;
+
+ iov.port = port;
+ ioctl(svgahelper_fd, SVGALIB_HELPER_IOCGINW, &iov);
+
+ return iov.val;
+}
+
+static __inline__ unsigned int svga_inl(short port)
+{
+ io_t iov;
+
+ iov.port = port;
+ ioctl(svgahelper_fd, SVGALIB_HELPER_IOCGINL, &iov);
+
+ return iov.val;
+}
+#endif /* CONIFG_SVGAHELPER */
+
+static __inline__ void outb(short port,char val)
+{
+#ifdef CONFIG_SVGAHELPER
+ if (svgahelper_initialized == 1)
+ {
+ svga_outb(port, val);
+ return;
+ }
+#endif
+
+#ifdef CONFIG_DHAHELPER
+ if (dhahelper_initialized == 1)
+ {
+ dhahelper_port_t _port;
+
+ _port.operation = PORT_OP_WRITE;
+ _port.addr = port;
+ _port.size = 1;
+ _port.value = val;
+ if (ioctl(dhahelper_fd, DHAHELPER_PORT, &_port) == 0)
+ return;
+ }
+ else
+#endif
+ __asm__ __volatile__("outb %0,%1" : :"a" (val), "d" (port));
+ return;
+}
+
+static __inline__ void outw(short port,short val)
+{
+#ifdef CONFIG_SVGAHELPER
+ if (svgahelper_initialized == 1)
+ {
+ svga_outw(port, val);
+ return;
+ }
+#endif
+
+#ifdef CONFIG_DHAHELPER
+ if (dhahelper_initialized == 1)
+ {
+ dhahelper_port_t _port;
+
+ _port.operation = PORT_OP_WRITE;
+ _port.addr = port;
+ _port.size = 2;
+ _port.value = val;
+ if (ioctl(dhahelper_fd, DHAHELPER_PORT, &_port) == 0)
+ return;
+ }
+ else
+#endif
+ __asm__ __volatile__("outw %0,%1" : :"a" (val), "d" (port));
+ return;
+}
+
+static __inline__ void outl(short port,unsigned int val)
+{
+#ifdef CONFIG_SVGAHELPER
+ if (svgahelper_initialized == 1)
+ {
+ svga_outl(port, val);
+ return;
+ }
+#endif
+
+#ifdef CONFIG_DHAHELPER
+ if (dhahelper_initialized == 1)
+ {
+ dhahelper_port_t _port;
+
+ _port.operation = PORT_OP_WRITE;
+ _port.addr = port;
+ _port.size = 4;
+ _port.value = val;
+ if (ioctl(dhahelper_fd, DHAHELPER_PORT, &_port) == 0)
+ return;
+ }
+ else
+#endif
+ __asm__ __volatile__("outl %0,%1" : :"a" (val), "d" (port));
+ return;
+}
+
+static __inline__ unsigned int inb(short port)
+{
+ unsigned char ret = 0;
+
+#ifdef CONFIG_SVGAHELPER
+ if (svgahelper_initialized == 1)
+ {
+ return svga_inb(port);
+ }
+#endif
+
+#ifdef CONFIG_DHAHELPER
+ if (dhahelper_initialized == 1)
+ {
+ dhahelper_port_t _port;
+
+ _port.operation = PORT_OP_READ;
+ _port.addr = port;
+ _port.size = 1;
+ if (ioctl(dhahelper_fd, DHAHELPER_PORT, &_port) == 0)
+ return _port.value;
+ }
+ else
+#endif
+ __asm__ __volatile__("inb %1,%0" :
+ "=a" (ret) :
+ "d" (port));
+ return ret;
+}
+
+static __inline__ unsigned int inw(short port)
+{
+ unsigned short ret = 0;
+
+#ifdef CONFIG_SVGAHELPER
+ if (svgahelper_initialized == 1)
+ {
+ return svga_inw(port);
+ }
+#endif
+
+#ifdef CONFIG_DHAHELPER
+ if (dhahelper_initialized == 1)
+ {
+ dhahelper_port_t _port;
+
+ _port.operation = PORT_OP_READ;
+ _port.addr = port;
+ _port.size = 2;
+ if (ioctl(dhahelper_fd, DHAHELPER_PORT, &_port) == 0)
+ return _port.value;
+ }
+ else
+#endif
+ __asm__ __volatile__("inw %1,%0" :
+ "=a" (ret) :
+ "d" (port));
+ return ret;
+}
+
+static __inline__ unsigned int inl(short port)
+{
+ unsigned int ret = 0;
+
+#ifdef CONFIG_SVGAHELPER
+ if (svgahelper_initialized == 1)
+ {
+ return svga_inl(port);
+ }
+#endif
+
+#ifdef CONFIG_DHAHELPER
+ if (dhahelper_initialized == 1)
+ {
+ dhahelper_port_t _port;
+
+ _port.operation = PORT_OP_READ;
+ _port.addr = port;
+ _port.size = 4;
+ if (ioctl(dhahelper_fd, DHAHELPER_PORT, &_port) == 0)
+ return _port.value;
+ }
+ else
+#endif
+ __asm__ __volatile__("inl %1,%0" :
+ "=a" (ret) :
+ "d" (port));
+ return ret;
+}
+
+static __inline__ void intr_disable()
+{
+#ifdef CONFIG_SVGAHELPER
+ if (svgahelper_initialized == 1)
+ return;
+#endif
+ __asm__ __volatile__("cli");
+}
+
+static __inline__ void intr_enable()
+{
+#ifdef CONFIG_SVGAHELPER
+ if (svgahelper_initialized == 1)
+ return;
+#endif
+ __asm__ __volatile__("sti");
+}
+
+#endif
+
+//#endif
diff --git a/vidix/sysdep/libdha_os2.c b/vidix/sysdep/libdha_os2.c
new file mode 100644
index 0000000000..041f6be71c
--- /dev/null
+++ b/vidix/sysdep/libdha_os2.c
@@ -0,0 +1,161 @@
+/* $XFree86: xc/programs/Xserver/hw/xfree86/os-support/os2/os2_video.c,v 3.14 2000/10/28 01:42:28 mvojkovi Exp $ */
+/* Modified for libdha by Nick Kurshev. */
+/*
+ * (c) Copyright 1994,1999 by Holger Veit
+ * <Holger.Veit@gmd.de>
+ * Modified 1996 by Sebastien Marineau <marineau@genie.uottawa.ca>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * HOLGER VEIT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Except as contained in this notice, the name of Holger Veit shall not be
+ * used in advertising or otherwise to promote the sale, use or other dealings
+ * in this Software without prior written authorization from Holger Veit.
+ *
+ */
+/* $XConsortium: os2_video.c /main/8 1996/10/27 11:49:02 kaleb $ */
+
+#define INCL_DOSFILEMGR
+#include "os2.h"
+
+/***************************************************************************/
+/* Video Memory Mapping helper functions */
+/***************************************************************************/
+
+/* This section uses the xf86sup.sys driver developed for xfree86.
+ * The driver allows mapping of physical memory
+ * You must install it with a line DEVICE=path\xf86sup.sys in config.sys.
+ */
+
+static HFILE mapdev = -1;
+static ULONG stored_virt_addr;
+static char* mappath = "\\DEV\\PMAP$";
+static HFILE open_mmap()
+{
+ APIRET rc;
+ ULONG action;
+
+ if (mapdev != -1)
+ return mapdev;
+
+ rc = DosOpen((PSZ)mappath, (PHFILE)&mapdev, (PULONG)&action,
+ (ULONG)0, FILE_SYSTEM, FILE_OPEN,
+ OPEN_SHARE_DENYNONE|OPEN_FLAGS_NOINHERIT|OPEN_ACCESS_READONLY,
+ (ULONG)0);
+ if (rc!=0)
+ mapdev = -1;
+ return mapdev;
+}
+
+static void close_mmap()
+{
+ if (mapdev != -1)
+ DosClose(mapdev);
+ mapdev = -1;
+}
+
+/* this structure is used as a parameter packet for the direct access
+ * ioctl of pmap$
+ */
+
+/* Changed here for structure of driver PMAP$ */
+
+typedef struct{
+ ULONG addr;
+ ULONG size;
+} DIOParPkt;
+
+/* This is the data packet for the mapping function */
+
+typedef struct {
+ ULONG addr;
+ USHORT sel;
+} DIODtaPkt;
+
+/***************************************************************************/
+/* Video Memory Mapping section */
+/***************************************************************************/
+
+static long callcount = 0L;
+
+/* ARGSUSED */
+void * map_phys_mem(unsigned long base, unsigned long size)
+{
+ DIOParPkt par;
+ ULONG plen;
+ DIODtaPkt dta;
+ ULONG dlen;
+ static BOOL ErrRedir = FALSE;
+ APIRET rc;
+
+ par.addr = (ULONG)base;
+ par.size = (ULONG)size;
+ plen = sizeof(par);
+ dlen = sizeof(dta);
+
+ open_mmap();
+ if (mapdev == -1)
+ {
+ perror("libdha: device xf86sup.sys is not installed");
+ exit(1);
+ }
+ if ((rc=DosDevIOCtl(mapdev, (ULONG)0x76, (ULONG)0x44,
+ (PVOID)&par, (ULONG)plen, (PULONG)&plen,
+ (PVOID)&dta, (ULONG)dlen, (PULONG)&dlen)) == 0) {
+ if (dlen==sizeof(dta)) {
+ callcount++;
+ return (void *)dta.addr;
+ }
+ /*else fail*/
+ }
+ return (void *)-1;
+}
+
+/* ARGSUSED */
+void unmap_phys_mem(void * base, unsigned long size)
+{
+ DIOParPkt par;
+ ULONG plen,vmaddr;
+
+/* We need here the VIRTADDR for unmapping, not the physical address */
+/* This should be taken care of either here by keeping track of allocated */
+/* pointers, but this is also already done in the driver... Thus it would */
+/* be a waste to do this tracking twice. Can this be changed when the fn. */
+/* is called? This would require tracking this function in all servers, */
+/* and changing it appropriately to call this with the virtual adress */
+/* If the above mapping function is only called once, then we can store */
+/* the virtual adress and use it here.... */
+
+ par.addr = (ULONG)base;
+ par.size = 0xffffffff; /* This is the virtual address parameter. Set this to ignore */
+ plen = sizeof(par);
+
+ if (mapdev != -1)
+ {
+ DosDevIOCtl(mapdev, (ULONG)0x76, (ULONG)0x46,
+ (PVOID)&par, (ULONG)plen, (PULONG)&plen,
+ &vmaddr, sizeof(ULONG), &plen);
+ callcount--;
+ }
+/* Now if more than one region has been allocated and we close the driver,
+ * the other pointers will immediately become invalid. We avoid closing
+ * driver for now, but this should be fixed for server exit
+ */
+
+ if(!callcount) close_mmap();
+}
diff --git a/vidix/sysdep/libdha_win32.c b/vidix/sysdep/libdha_win32.c
new file mode 100644
index 0000000000..0a151b0637
--- /dev/null
+++ b/vidix/sysdep/libdha_win32.c
@@ -0,0 +1,102 @@
+/*
+ MAPDEV.h - include file for VxD MAPDEV
+ Copyright (c) 1996 Vireo Software, Inc.
+ Modified for libdha by Nick Kurshev.
+*/
+
+#include <windows.h>
+#include <ddk/ntddk.h>
+#include "../dhahelperwin/dhahelper.h"
+
+/*
+ This is the request structure that applications use
+ to request services from the MAPDEV VxD.
+*/
+
+typedef struct _MapDevRequest
+{
+ DWORD mdr_ServiceID; /* supplied by caller */
+ LPVOID mdr_PhysicalAddress; /* supplied by caller */
+ DWORD mdr_SizeInBytes; /* supplied by caller */
+ LPVOID mdr_LinearAddress; /* returned by VxD */
+ WORD mdr_Selector; /* returned if 16-bit caller */
+ WORD mdr_Status; /* MDR_xxxx code below */
+} MAPDEVREQUEST, *PMAPDEVREQUEST;
+
+#define MDR_SERVICE_MAP CTL_CODE(FILE_DEVICE_UNKNOWN, 1, METHOD_NEITHER, FILE_ANY_ACCESS)
+#define MDR_SERVICE_UNMAP CTL_CODE(FILE_DEVICE_UNKNOWN, 2, METHOD_NEITHER, FILE_ANY_ACCESS)
+
+#define MDR_STATUS_SUCCESS 1
+#define MDR_STATUS_ERROR 0
+/*#include "winioctl.h"*/
+#define FILE_DEVICE_UNKNOWN 0x00000022
+#define METHOD_NEITHER 3
+#define FILE_ANY_ACCESS 0
+#define CTL_CODE( DeviceType, Function, Method, Access ) ( \
+ ((DeviceType)<<16) | ((Access)<<14) | ((Function)<<2) | (Method) )
+
+
+int IsWinNT(){
+ OSVERSIONINFO OSVersionInfo;
+ OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+ GetVersionEx(&OSVersionInfo);
+ return OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT;
+}
+
+static HANDLE hDriver = INVALID_HANDLE_VALUE;
+
+
+/* Memory Map a piece of Real Memory */
+void *map_phys_mem(unsigned long base, unsigned long size) {
+ if(!IsWinNT()){
+ HANDLE hDevice ;
+ PVOID inBuf[1] ; /* buffer for struct pointer to VxD */
+ DWORD RetInfo[2] ; /* buffer to receive data from VxD */
+ DWORD cbBytesReturned ; /* count of bytes returned from VxD */
+ MAPDEVREQUEST req ; /* map device request structure */
+ DWORD *pNicstar, Status, Time ; int i ; char *endptr ;
+ const PCHAR VxDName = "\\\\.\\MAPDEV.VXD" ;
+ const PCHAR VxDNameAlreadyLoaded = "\\\\.\\MAPDEV" ;
+
+ hDevice = CreateFile(VxDName, 0,0,0,
+ CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0) ;
+ if (hDevice == INVALID_HANDLE_VALUE)
+ hDevice = CreateFile(VxDNameAlreadyLoaded, 0,0,0,
+ CREATE_NEW, FILE_FLAG_DELETE_ON_CLOSE, 0) ;
+ if (hDevice == INVALID_HANDLE_VALUE) {
+ fprintf(stderr, "Cannot open driver, error=%08lx\n", GetLastError()) ;
+ exit(1) ; }
+
+ req.mdr_ServiceID = MDR_SERVICE_MAP ;
+ req.mdr_PhysicalAddress = (PVOID)base ;
+ req.mdr_SizeInBytes = size ;
+ inBuf[0] = &req ;
+
+ if ( ! DeviceIoControl(hDevice, MDR_SERVICE_MAP, inBuf, sizeof(PVOID),
+ NULL, 0, &cbBytesReturned, NULL) ) {
+ fprintf(stderr, "Failed to map device\n") ; exit(1) ; }
+
+ return (void*)req.mdr_LinearAddress ;
+ }
+ else{
+ dhahelper_t dhahelper_priv;
+ DWORD dwBytesReturned;
+ dhahelper_priv.size = size;
+ dhahelper_priv.base = base;
+ if(hDriver==INVALID_HANDLE_VALUE)hDriver = CreateFile("\\\\.\\DHAHELPER",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+ if (!DeviceIoControl(hDriver, IOCTL_DHAHELPER_MAPPHYSTOLIN, &dhahelper_priv,sizeof(dhahelper_t), &dhahelper_priv, sizeof(dhahelper_t),&dwBytesReturned, NULL)){
+ fprintf(stderr,"Unable to map the requested memory region.\n");
+ return NULL;
+ }
+ else return dhahelper_priv.ptr;
+ }
+}
+
+void unmap_phys_mem(void *ptr, unsigned long size) {
+ if(IsWinNT()){
+ dhahelper_t dhahelper_priv;
+ DWORD dwBytesReturned;
+ dhahelper_priv.ptr = ptr;
+ DeviceIoControl(hDriver, IOCTL_DHAHELPER_UNMAPPHYSADDR, &dhahelper_priv,sizeof(dhahelper_t), NULL, 0, &dwBytesReturned, NULL);
+ }
+}
diff --git a/vidix/sysdep/pci_386bsd.c b/vidix/sysdep/pci_386bsd.c
new file mode 100644
index 0000000000..d00ecb0785
--- /dev/null
+++ b/vidix/sysdep/pci_386bsd.c
@@ -0,0 +1,38 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+#include <errno.h>
+#include <sys/file.h>
+#include <machine/console.h>
+#ifndef GCCUSESGAS
+#define GCCUSESGAS
+#endif
+
+static int io_fd;
+
+static __inline__ int enable_os_io(void)
+{
+ io_fd = -1 ;
+ if ((io_fd = open("/dev/console", O_RDWR, 0)) < 0) {
+ perror("/dev/console");
+ return(errno);
+ }
+ if (ioctl(io_fd, KDENABIO, 0) < 0) {
+ perror("ioctl(KDENABIO)");
+ return(errno);
+ }
+ return(0);
+}
+
+static __inline__ int disable_os_io(void)
+{
+ if (ioctl(io_fd, KDDISABIO, 0) < 0) {
+ perror("ioctl(KDDISABIO)");
+ close(io_fd);
+ return(errno);
+ }
+ close(io_fd);
+ return(0);
+}
diff --git a/vidix/sysdep/pci_alpha.c b/vidix/sysdep/pci_alpha.c
new file mode 100644
index 0000000000..e968b3e121
--- /dev/null
+++ b/vidix/sysdep/pci_alpha.c
@@ -0,0 +1,29 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+static int pci_config_type( void ) { return 1; }
+
+static int pci_get_vendor(
+ unsigned char bus,
+ unsigned char dev,
+ int func)
+{
+ unsigned long retval;
+ pciconfig_read(bus, dev<<3, PCI_ID_REG, 4, &retval);
+ return retval;
+}
+
+static long pci_config_read_long(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd)
+{
+ unsigned long retval;
+ pciconfig_read(bus, dev<<3, cmd, 4, &retval);
+ return retval;
+}
+
diff --git a/vidix/sysdep/pci_arm32.c b/vidix/sysdep/pci_arm32.c
new file mode 100644
index 0000000000..a631887da3
--- /dev/null
+++ b/vidix/sysdep/pci_arm32.c
@@ -0,0 +1,60 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+static int pci_config_type( void )
+{
+ unsigned long tmplong1, tmplong2;
+ unsigned char tmp1, tmp2;
+ int retval;
+ retval = 0;
+
+ outb(PCI_MODE2_ENABLE_REG, 0x00);
+ outb(PCI_MODE2_FORWARD_REG, 0x00);
+ tmp1 = inb(PCI_MODE2_ENABLE_REG);
+ tmp2 = inb(PCI_MODE2_FORWARD_REG);
+ if ((tmp1 == 0x00) && (tmp2 == 0x00)) {
+ retval = 2;
+ /*printf("PCI says configuration type 2\n");*/
+ } else {
+ tmplong1 = inl(PCI_MODE1_ADDRESS_REG);
+ outl(PCI_MODE1_ADDRESS_REG, PCI_EN);
+ tmplong2 = inl(PCI_MODE1_ADDRESS_REG);
+ outl(PCI_MODE1_ADDRESS_REG, tmplong1);
+ if (tmplong2 == PCI_EN) {
+ retval = 1;
+ /*printf("PCI says configuration type 1\n");*/
+ } else {
+ /*printf("No PCI !\n");*/
+ disable_os_io();
+ /*exit(1);*/
+ retval = 0xFFFF;
+ }
+ }
+ return retval;
+}
+
+static int pci_get_vendor(
+ unsigned char bus,
+ unsigned char dev,
+ int func)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ outl(PCI_MODE1_ADDRESS_REG, config_cmd);
+ return inl(PCI_MODE1_DATA_REG);
+}
+
+static long pci_config_read_long(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ outl(PCI_MODE1_ADDRESS_REG, config_cmd | cmd);
+ return inl(PCI_MODE1_DATA_REG);
+}
diff --git a/vidix/sysdep/pci_bsdi.c b/vidix/sysdep/pci_bsdi.c
new file mode 100644
index 0000000000..b6b142054d
--- /dev/null
+++ b/vidix/sysdep/pci_bsdi.c
@@ -0,0 +1,39 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+#include <errno.h>
+#include <sys/file.h>
+#include <sys/ioctl.h>
+#include <i386/isa/pcconsioctl.h>
+#ifndef GCCUSESGAS
+#define GCCUSESGAS
+#endif
+
+static int io_fd;
+
+static __inline__ int enable_os_io(void)
+{
+ io_fd = -1 ;
+ if ((io_fd = open("/dev/console", O_RDWR, 0)) < 0) {
+ perror("/dev/console");
+ return(errno);
+ }
+ if (ioctl(io_fd, PCCONENABIOPL, 0) < 0) {
+ perror("ioctl(PCCONENABIOPL)");
+ return(errno);
+ }
+ return(0);
+}
+
+static __inline__ int disable_os_io(void)
+{
+ if (ioctl(io_fd, PCCONDISABIOPL, 0) < 0) {
+ perror("ioctl(PCCONDISABIOPL)");
+ close(io_fd);
+ return(errno);
+ }
+ close(io_fd);
+ return(0);
+}
diff --git a/vidix/sysdep/pci_freebsd.c b/vidix/sysdep/pci_freebsd.c
new file mode 100644
index 0000000000..dd0c68ef75
--- /dev/null
+++ b/vidix/sysdep/pci_freebsd.c
@@ -0,0 +1,38 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+#include <errno.h>
+#include <sys/file.h>
+#include <sys/kbio.h>
+#ifndef GCCUSESGAS
+#define GCCUSESGAS
+#endif
+
+static int io_fd;
+
+static __inline__ int enable_os_io(void)
+{
+ io_fd = -1 ;
+ if ((io_fd = open("/dev/console", O_RDWR, 0)) < 0) {
+ perror("/dev/console");
+ return(errno);
+ }
+ if (ioctl(io_fd, KDENABIO, 0) < 0) {
+ perror("ioctl(KDENABIO)");
+ return(errno);
+ }
+ return(0);
+}
+
+static __inline__ int disable_os_io(void)
+{
+ if (ioctl(io_fd, KDDISABIO, 0) < 0) {
+ perror("ioctl(KDDISABIO)");
+ close(io_fd);
+ return(errno);
+ }
+ close(io_fd);
+ return(0);
+}
diff --git a/vidix/sysdep/pci_ia64.c b/vidix/sysdep/pci_ia64.c
new file mode 100644
index 0000000000..a631887da3
--- /dev/null
+++ b/vidix/sysdep/pci_ia64.c
@@ -0,0 +1,60 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+static int pci_config_type( void )
+{
+ unsigned long tmplong1, tmplong2;
+ unsigned char tmp1, tmp2;
+ int retval;
+ retval = 0;
+
+ outb(PCI_MODE2_ENABLE_REG, 0x00);
+ outb(PCI_MODE2_FORWARD_REG, 0x00);
+ tmp1 = inb(PCI_MODE2_ENABLE_REG);
+ tmp2 = inb(PCI_MODE2_FORWARD_REG);
+ if ((tmp1 == 0x00) && (tmp2 == 0x00)) {
+ retval = 2;
+ /*printf("PCI says configuration type 2\n");*/
+ } else {
+ tmplong1 = inl(PCI_MODE1_ADDRESS_REG);
+ outl(PCI_MODE1_ADDRESS_REG, PCI_EN);
+ tmplong2 = inl(PCI_MODE1_ADDRESS_REG);
+ outl(PCI_MODE1_ADDRESS_REG, tmplong1);
+ if (tmplong2 == PCI_EN) {
+ retval = 1;
+ /*printf("PCI says configuration type 1\n");*/
+ } else {
+ /*printf("No PCI !\n");*/
+ disable_os_io();
+ /*exit(1);*/
+ retval = 0xFFFF;
+ }
+ }
+ return retval;
+}
+
+static int pci_get_vendor(
+ unsigned char bus,
+ unsigned char dev,
+ int func)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ outl(PCI_MODE1_ADDRESS_REG, config_cmd);
+ return inl(PCI_MODE1_DATA_REG);
+}
+
+static long pci_config_read_long(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ outl(PCI_MODE1_ADDRESS_REG, config_cmd | cmd);
+ return inl(PCI_MODE1_DATA_REG);
+}
diff --git a/vidix/sysdep/pci_isc.c b/vidix/sysdep/pci_isc.c
new file mode 100644
index 0000000000..5b5a591824
--- /dev/null
+++ b/vidix/sysdep/pci_isc.c
@@ -0,0 +1,32 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+#include <sys/param.h>
+#include <sys/immu.h>
+#include <sys/region.h>
+#include <sys/proc.h>
+#include <sys/tss.h>
+#include <sys/sysi86.h>
+#include <sys/v86.h>
+
+static __inline__ int enable_os_io(void)
+{
+#if defined(SI86IOPL)
+ sysi86(SI86IOPL, 3);
+#else
+ sysi86(SI86V86, V86SC_IOPL, PS_IOPL);
+#endif
+ return(0);
+}
+
+static __inline__ int disable_os_io(void)
+{
+#if defined(SI86IOPL)
+ sysi86(SI86IOPL, 0);
+#else
+ sysi86(SI86V86, V86SC_IOPL, 0);
+#endif
+ return(0);
+}
diff --git a/vidix/sysdep/pci_linux.c b/vidix/sysdep/pci_linux.c
new file mode 100644
index 0000000000..ea667f6ee6
--- /dev/null
+++ b/vidix/sysdep/pci_linux.c
@@ -0,0 +1,191 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+#include <errno.h>
+#ifdef __i386__
+//#include <sys/perm.h> doesn't exist on libc5 systems
+int iopl();
+#else
+#if !defined(__sparc__) && !defined(__powerpc__) && !defined(__x86_64__)
+#include <sys/io.h>
+#endif
+#endif
+
+#include "config.h"
+
+#ifdef CONFIG_DHAHELPER
+#include <fcntl.h>
+int dhahelper_initialized = 0;
+int dhahelper_fd = 0;
+#endif
+
+#ifdef CONFIG_SVGAHELPER
+#include <svgalib_helper.h>
+#ifdef __linux__
+#include <linux/ioctl.h>
+#endif
+#include <fcntl.h>
+#ifndef SVGALIB_HELPER_IOC_MAGIC
+/* svgalib 1.9.18+ compatibility ::atmos */
+#define SVGALIB_HELPER_IOCGPCIINL SVGAHELPER_PCIINL
+#endif
+int svgahelper_initialized = 0;
+int svgahelper_fd = 0;
+
+static int pci_config_type(void)
+{
+ return 1;
+}
+
+static long pci_config_read_long(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd)
+{
+ unsigned long config_cmd;
+ pcic_t p;
+
+ p.address = cmd;
+ p.pcipos = (bus << 8) | dev | (func << 5);
+
+ if (ioctl(svgahelper_fd, SVGALIB_HELPER_IOCGPCIINL, &p))
+ return -1;
+
+ return p.val;
+}
+
+static int pci_get_vendor(
+ unsigned char bus,
+ unsigned char dev,
+ int func)
+{
+ return pci_config_read_long(bus, dev, func, 0);
+}
+#endif
+
+static __inline__ int enable_os_io(void)
+{
+#ifdef CONFIG_SVGAHELPER
+ svgahelper_fd = open(DEV_SVGA, O_RDWR);
+ if (svgahelper_fd > 0)
+ {
+ svgahelper_initialized = 1;
+ return(0);
+ }
+ svgahelper_initialized = -1;
+#endif
+
+#ifdef CONFIG_DHAHELPER
+ dhahelper_fd = open("/dev/dhahelper", O_RDWR);
+ if (dhahelper_fd > 0)
+ {
+ dhahelper_initialized = 1;
+ return(0);
+ }
+ dhahelper_initialized = -1;
+#endif
+
+#if defined(__powerpc__) && defined(__linux__)
+/* should be fixed? */
+#else
+ if (iopl(3) != 0)
+ return(errno);
+#endif
+ return(0);
+}
+
+static __inline__ int disable_os_io(void)
+{
+#ifdef CONFIG_SVGAHELPER
+ if (svgahelper_initialized == 1)
+ close(svgahelper_fd);
+ else
+#endif
+#ifdef CONFIG_DHAHELPER
+ if (dhahelper_initialized == 1)
+ close(dhahelper_fd);
+ else
+#endif
+#if defined(__powerpc__) && defined(__linux__)
+/* should be fixed? */
+#else
+ if (iopl(0) != 0)
+ return(errno);
+#endif
+ return(0);
+}
+
+#if (defined(__powerpc__) || defined(__sparc__) || defined(__sparc64__) \
+ || defined(__x86_64__)) && defined(__linux__) && !defined(CONFIG_SVGAHELPER)
+#define CONFIG_PCI_LINUX_PROC
+#endif
+
+#if defined(CONFIG_PCI_LINUX_PROC)
+static int pci_config_type( void ) { return 1; }
+
+/* pci operations for (powerpc) Linux
+ questions, suggestions etc:
+ mplayer-dev-eng@mplayerhq.hu, colin@colino.net*/
+#include <fcntl.h>
+//#include <sys/io.h>
+#include <linux/pci.h>
+#include "libavutil/common.h"
+#include "mpbswap.h"
+
+static int pci_get_vendor(
+ unsigned char bus,
+ unsigned char dev,
+ int func)
+{
+ int retval;
+ char path[100];
+ int fd;
+ short vendor, device;
+ sprintf(path,"/proc/bus/pci/%02d/%02x.0", bus, dev);
+ fd = open(path,O_RDONLY|O_SYNC);
+ if (fd == -1) {
+ retval=0xFFFF;
+ }
+ else if (pread(fd, &vendor, 2, PCI_VENDOR_ID) == 2 &&
+ pread(fd, &device, 2, PCI_DEVICE_ID) == 2) {
+ vendor = le2me_16(vendor);
+ device = le2me_16(device);
+ retval = vendor + (device<<16); /*no worries about byte order,
+ all ppc are bigendian*/
+ } else {
+ retval = 0xFFFF;
+ }
+ if (fd > 0) {
+ close(fd);
+ }
+ return retval;
+}
+
+static long pci_config_read_long(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd)
+{
+ long retval;
+ char path[100];
+ int fd;
+ sprintf(path,"/proc/bus/pci/%02d/%02x.0", bus, dev);
+ fd = open(path,O_RDONLY|O_SYNC);
+ if (fd == -1) {
+ retval=0;
+ }
+ else if (pread(fd, &retval, 4, cmd) == 4) {
+ retval = le2me_32(retval);
+ } else {
+ retval = 0;
+ }
+ if (fd > 0) {
+ close(fd);
+ }
+ return retval;
+}
+#endif
diff --git a/vidix/sysdep/pci_lynx.c b/vidix/sysdep/pci_lynx.c
new file mode 100644
index 0000000000..b698f63083
--- /dev/null
+++ b/vidix/sysdep/pci_lynx.c
@@ -0,0 +1,93 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+#if defined(Lynx_22)
+#ifndef GCCUSESGAS
+#define GCCUSESGAS
+#endif
+
+/* let's mimick the Linux Alpha stuff for LynxOS so we don't have
+ * to change too much code
+ */
+#include <smem.h>
+
+static unsigned char *pciConfBase;
+
+static __inline__ void enable_os_io(void)
+{
+ pciConfBase = (unsigned char *) smem_create("PCI-CONF",
+ (char *)0x80800000, 64*1024, SM_READ|SM_WRITE);
+ if (pciConfBase == (void *) -1)
+ exit(1);
+}
+
+static __inline__ void disable_os_io(void)
+{
+ smem_create(NULL, (char *) pciConfBase, 0, SM_DETACH);
+ smem_remove("PCI-CONF");
+ pciConfBase = NULL;
+}
+
+#include <smem.h>
+
+static unsigned char *pciConfBase;
+
+static __inline__ unsigned long
+static swapl(unsigned long val)
+{
+ unsigned char *p = (unsigned char *)&val;
+ return ((p[3] << 24) | (p[2] << 16) | (p[1] << 8) | (p[0] << 0));
+}
+
+
+#define BUS(tag) (((tag)>>16)&0xff)
+#define DFN(tag) (((tag)>>8)&0xff)
+
+#define PCIBIOS_DEVICE_NOT_FOUND 0x86
+#define PCIBIOS_SUCCESSFUL 0x00
+
+static int pciconfig_read(
+ unsigned char bus,
+ unsigned char dev,
+ unsigned char offset,
+ int len, /* unused, alway 4 */
+ unsigned long *val)
+{
+ unsigned long _val;
+ unsigned long *ptr;
+
+ dev >>= 3;
+ if (bus || dev >= 16) {
+ *val = 0xFFFFFFFF;
+ return PCIBIOS_DEVICE_NOT_FOUND;
+ } else {
+ ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset));
+ _val = swapl(*ptr);
+ }
+ *val = _val;
+ return PCIBIOS_SUCCESSFUL;
+}
+
+static int pciconfig_write(
+ unsigned char bus,
+ unsigned char dev,
+ unsigned char offset,
+ int len, /* unused, alway 4 */
+ unsigned long val)
+{
+ unsigned long _val;
+ unsigned long *ptr;
+
+ dev >>= 3;
+ _val = swapl(val);
+ if (bus || dev >= 16) {
+ return PCIBIOS_DEVICE_NOT_FOUND;
+ } else {
+ ptr = (unsigned long *)(pciConfBase + ((1<<dev) | offset));
+ *ptr = _val;
+ }
+ return PCIBIOS_SUCCESSFUL;
+}
diff --git a/vidix/sysdep/pci_mach386.c b/vidix/sysdep/pci_mach386.c
new file mode 100644
index 0000000000..31621862b8
--- /dev/null
+++ b/vidix/sysdep/pci_mach386.c
@@ -0,0 +1,25 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+#include <errno.h>
+
+static int io_fd;
+
+static __inline__ int enable_os_io(void)
+{
+ io_fd = -1 ;
+ if ((io_fd = open("/dev/iopl", O_RDWR, 0)) < 0) {
+ perror("/dev/iopl");
+ return(errno);
+ }
+ return(0);
+}
+
+static __inline__ int disable_os_io(void)
+{
+ close(io_fd);
+ return(0);
+}
diff --git a/vidix/sysdep/pci_netbsd.c b/vidix/sysdep/pci_netbsd.c
new file mode 100644
index 0000000000..793944beba
--- /dev/null
+++ b/vidix/sysdep/pci_netbsd.c
@@ -0,0 +1,44 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+#include <errno.h>
+#include <sys/param.h>
+#include <sys/file.h>
+#include <machine/sysarch.h>
+#ifndef GCCUSESGAS
+#define GCCUSESGAS
+#endif
+
+static int io_fd;
+
+static __inline__ int enable_os_io(void)
+{
+ io_fd = -1 ;
+#if !defined(USE_I386_IOPL)
+ if ((io_fd = open("/dev/io", O_RDWR, 0)) < 0) {
+ perror("/dev/io");
+ return(errno);
+ }
+#else
+ if (i386_iopl(1) < 0) {
+ perror("i386_iopl");
+ return(errno);
+ }
+#endif /* USE_I386_IOPL */
+ return(0);
+}
+
+static __inline__ int disable_os_io(void)
+{
+#if !defined(USE_I386_IOPL)
+ close(io_fd);
+#else
+ if (i386_iopl(0) < 0) {
+ perror("i386_iopl");
+ return(errno);
+ }
+#endif /* NetBSD1_1 */
+ return(0);
+}
diff --git a/vidix/sysdep/pci_openbsd.c b/vidix/sysdep/pci_openbsd.c
new file mode 100644
index 0000000000..89c85eab69
--- /dev/null
+++ b/vidix/sysdep/pci_openbsd.c
@@ -0,0 +1,27 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+#ifdef __i386__
+
+#include <errno.h>
+#include <sys/types.h>
+#include <machine/sysarch.h>
+
+static __inline__ int enable_os_io(void)
+{
+ if (i386_iopl(1) < 0) {
+ perror("i386_iopl");
+ return(errno);
+ }
+ return(0);
+}
+
+static __inline__ int disable_os_io(void)
+{
+ /* Nothing to do */
+ return(0);
+}
+#endif
diff --git a/vidix/sysdep/pci_os2.c b/vidix/sysdep/pci_os2.c
new file mode 100644
index 0000000000..ddfc0c0ea6
--- /dev/null
+++ b/vidix/sysdep/pci_os2.c
@@ -0,0 +1,55 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+#define INCL_DOSFILEMGR
+#include <os2.h>
+
+static USHORT callgate[3] = {0,0,0};
+
+static __inline__ int enable_os_io(void)
+{
+ HFILE hfd;
+ ULONG dlen,action;
+ APIRET rc;
+ static char *ioDrvPath = "/dev/fastio$";
+
+ if (DosOpen((PSZ)ioDrvPath, (PHFILE)&hfd, (PULONG)&action,
+ (ULONG)0, FILE_SYSTEM, FILE_OPEN,
+ OPEN_SHARE_DENYNONE|OPEN_FLAGS_NOINHERIT|OPEN_ACCESS_READONLY,
+ (ULONG)0) != 0) {
+ fprintf(stderr,"Error opening fastio$ driver...\n");
+ fprintf(stderr,"Please install xf86sup.sys in config.sys!\n");
+ return(42);
+ }
+ callgate[0] = callgate[1] = 0;
+
+/* Get callgate from driver for fast io to ports and other stuff */
+
+ rc = DosDevIOCtl(hfd, (ULONG)0x76, (ULONG)0x64,
+ NULL, 0, NULL,
+ (ULONG*)&callgate[2], sizeof(USHORT), &dlen);
+ if (rc) {
+ fprintf(stderr,"xf86-OS/2: EnableIOPorts failed, rc=%d, dlen=%d; emergency exit\n",
+ rc,dlen);
+ DosClose(hfd);
+ return(42);
+ }
+
+/* Calling callgate with function 13 sets IOPL for the program */
+
+ asm volatile ("movl $13,%%ebx;.byte 0xff,0x1d;.long _callgate"
+ : /*no outputs */
+ : /*no inputs */
+ : "eax","ebx","ecx","edx","cc");
+
+ DosClose(hfd);
+ return(0);
+}
+
+static __inline__ int disable_os_io(void)
+{
+/* Nothing to do */
+ return(0);
+}
diff --git a/vidix/sysdep/pci_powerpc.c b/vidix/sysdep/pci_powerpc.c
new file mode 100644
index 0000000000..94529037b6
--- /dev/null
+++ b/vidix/sysdep/pci_powerpc.c
@@ -0,0 +1,30 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+#if defined(Lynx) || defined(__OpenBSD__)
+static int pci_config_type( void ) { return 1; }
+
+static int pci_get_vendor(
+ unsigned char bus,
+ unsigned char dev,
+ int func)
+{
+ int retval;
+ pciconfig_read(bus, dev<<3, PCI_ID_REG, 4, &retval);
+ return retval;
+}
+
+static long pci_config_read_long(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd)
+{
+ long retval;
+ pciconfig_read(bus, dev<<3, cmd, 4, &retval);
+ return retval;
+}
+#endif /*Lynx/OpenBSD*/
diff --git a/vidix/sysdep/pci_sco.c b/vidix/sysdep/pci_sco.c
new file mode 100644
index 0000000000..9cb2282ada
--- /dev/null
+++ b/vidix/sysdep/pci_sco.c
@@ -0,0 +1,33 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+#include <sys/console.h>
+#include <sys/param.h>
+#include <sys/immu.h>
+#include <sys/region.h>
+#include <sys/proc.h>
+#include <sys/tss.h>
+#include <sys/sysi86.h>
+#include <sys/v86.h>
+
+static __inline__ int enable_os_io(void)
+{
+#if defined(SI86IOPL)
+ sysi86(SI86IOPL, 3);
+#else
+ sysi86(SI86V86, V86SC_IOPL, PS_IOPL);
+#endif
+ return(0);
+}
+
+static __inline__ int disable_os_io(void)
+{
+#if defined(SI86IOPL)
+ sysi86(SI86IOPL, 0);
+#else
+ sysi86(SI86V86, V86SC_IOPL, 0);
+#endif
+ return(0);
+}
diff --git a/vidix/sysdep/pci_sparc.c b/vidix/sysdep/pci_sparc.c
new file mode 100644
index 0000000000..a631887da3
--- /dev/null
+++ b/vidix/sysdep/pci_sparc.c
@@ -0,0 +1,60 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+static int pci_config_type( void )
+{
+ unsigned long tmplong1, tmplong2;
+ unsigned char tmp1, tmp2;
+ int retval;
+ retval = 0;
+
+ outb(PCI_MODE2_ENABLE_REG, 0x00);
+ outb(PCI_MODE2_FORWARD_REG, 0x00);
+ tmp1 = inb(PCI_MODE2_ENABLE_REG);
+ tmp2 = inb(PCI_MODE2_FORWARD_REG);
+ if ((tmp1 == 0x00) && (tmp2 == 0x00)) {
+ retval = 2;
+ /*printf("PCI says configuration type 2\n");*/
+ } else {
+ tmplong1 = inl(PCI_MODE1_ADDRESS_REG);
+ outl(PCI_MODE1_ADDRESS_REG, PCI_EN);
+ tmplong2 = inl(PCI_MODE1_ADDRESS_REG);
+ outl(PCI_MODE1_ADDRESS_REG, tmplong1);
+ if (tmplong2 == PCI_EN) {
+ retval = 1;
+ /*printf("PCI says configuration type 1\n");*/
+ } else {
+ /*printf("No PCI !\n");*/
+ disable_os_io();
+ /*exit(1);*/
+ retval = 0xFFFF;
+ }
+ }
+ return retval;
+}
+
+static int pci_get_vendor(
+ unsigned char bus,
+ unsigned char dev,
+ int func)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ outl(PCI_MODE1_ADDRESS_REG, config_cmd);
+ return inl(PCI_MODE1_DATA_REG);
+}
+
+static long pci_config_read_long(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ outl(PCI_MODE1_ADDRESS_REG, config_cmd | cmd);
+ return inl(PCI_MODE1_DATA_REG);
+}
diff --git a/vidix/sysdep/pci_svr4.c b/vidix/sysdep/pci_svr4.c
new file mode 100644
index 0000000000..bcce5c901d
--- /dev/null
+++ b/vidix/sysdep/pci_svr4.c
@@ -0,0 +1,42 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+#include <sys/types.h>
+#include <sys/proc.h>
+#include <sys/tss.h>
+#if defined(NCR)
+#define __STDC
+#include <sys/sysi86.h>
+#undef __STDC
+#else
+#include <sys/sysi86.h>
+#endif
+
+#if defined(sun)
+# ifndef __EXTENSIONS__
+# define __EXTENSIONS__
+# endif
+# include <sys/psw.h>
+#endif
+
+static __inline__ int enable_os_io(void)
+{
+#if defined(SI86IOPL)
+ sysi86(SI86IOPL, 3);
+#else
+ sysi86(SI86V86, V86SC_IOPL, PS_IOPL);
+#endif
+ return(0);
+}
+
+static __inline__ int disable_os_io(void)
+{
+#if defined(SI86IOPL)
+ sysi86(SI86IOPL, 0);
+#else
+ sysi86(SI86V86, V86SC_IOPL, 0);
+#endif
+ return(0);
+}
diff --git a/vidix/sysdep/pci_win32.c b/vidix/sysdep/pci_win32.c
new file mode 100644
index 0000000000..5dc1841d24
--- /dev/null
+++ b/vidix/sysdep/pci_win32.c
@@ -0,0 +1,38 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+#include <windows.h>
+#include <ddk/ntddk.h>
+#include "../dhahelperwin/dhahelper.h"
+
+static HANDLE hDriver;
+extern int IsWinNT();
+
+
+
+
+
+static __inline__ int enable_os_io(void)
+{
+ if(IsWinNT()){
+ DWORD dwBytesReturned;
+ hDriver = CreateFile("\\\\.\\DHAHELPER",GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
+ if(!DeviceIoControl(hDriver, IOCTL_DHAHELPER_ENABLEDIRECTIO, NULL,0, NULL, 0, &dwBytesReturned, NULL)){
+ fprintf(stderr,"Unable to enable directio please install dhahelper.sys.\n");
+ return(1);
+ }
+ }
+ return(0);
+}
+
+static __inline__ int disable_os_io(void)
+{
+ if(IsWinNT()){
+ DWORD dwBytesReturned;
+ DeviceIoControl(hDriver, IOCTL_DHAHELPER_DISABLEDIRECTIO, NULL,0, NULL, 0, &dwBytesReturned, NULL);
+ CloseHandle(hDriver);
+ }
+ return(0);
+}
diff --git a/vidix/sysdep/pci_x86.c b/vidix/sysdep/pci_x86.c
new file mode 100644
index 0000000000..a631887da3
--- /dev/null
+++ b/vidix/sysdep/pci_x86.c
@@ -0,0 +1,60 @@
+/*
+ This file is based on:
+ $XFree86: xc/programs/Xserver/hw/xfree86/etc/scanpci.c,v 3.34.2.17 1998/11/10 11:55:40 dawes Exp $
+ Modified for readability by Nick Kurshev
+*/
+
+static int pci_config_type( void )
+{
+ unsigned long tmplong1, tmplong2;
+ unsigned char tmp1, tmp2;
+ int retval;
+ retval = 0;
+
+ outb(PCI_MODE2_ENABLE_REG, 0x00);
+ outb(PCI_MODE2_FORWARD_REG, 0x00);
+ tmp1 = inb(PCI_MODE2_ENABLE_REG);
+ tmp2 = inb(PCI_MODE2_FORWARD_REG);
+ if ((tmp1 == 0x00) && (tmp2 == 0x00)) {
+ retval = 2;
+ /*printf("PCI says configuration type 2\n");*/
+ } else {
+ tmplong1 = inl(PCI_MODE1_ADDRESS_REG);
+ outl(PCI_MODE1_ADDRESS_REG, PCI_EN);
+ tmplong2 = inl(PCI_MODE1_ADDRESS_REG);
+ outl(PCI_MODE1_ADDRESS_REG, tmplong1);
+ if (tmplong2 == PCI_EN) {
+ retval = 1;
+ /*printf("PCI says configuration type 1\n");*/
+ } else {
+ /*printf("No PCI !\n");*/
+ disable_os_io();
+ /*exit(1);*/
+ retval = 0xFFFF;
+ }
+ }
+ return retval;
+}
+
+static int pci_get_vendor(
+ unsigned char bus,
+ unsigned char dev,
+ int func)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ outl(PCI_MODE1_ADDRESS_REG, config_cmd);
+ return inl(PCI_MODE1_DATA_REG);
+}
+
+static long pci_config_read_long(
+ unsigned char bus,
+ unsigned char dev,
+ int func,
+ unsigned cmd)
+{
+ unsigned long config_cmd;
+ config_cmd = PCI_EN | (bus<<16) | (dev<<11) | (func<<8);
+ outl(PCI_MODE1_ADDRESS_REG, config_cmd | cmd);
+ return inl(PCI_MODE1_DATA_REG);
+}