changeset 4474:05ac3586db02

added support for dhahelper
author alex
date Sat, 02 Feb 2002 07:05:52 +0000
parents 620c6ade8188
children fc81767343ea
files libdha/libdha.c libdha/sysdep/AsmMacros_x86.h libdha/sysdep/pci_linux.c
diffstat 3 files changed, 150 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/libdha/libdha.c	Sat Feb 02 07:04:43 2002 +0000
+++ b/libdha/libdha.c	Sat Feb 02 07:05:52 2002 +0000
@@ -7,7 +7,7 @@
     		  Modified for GATOS/win/gfxdump.
 		  
     2002	- library implementation by Nick Kurshev
-		- some changes by Alex Beregszaszi
+		- dhahelper and some changes by Alex Beregszaszi
     
     supported O/S's:	SVR4, UnixWare, SCO, Solaris,
 			FreeBSD, NetBSD, 386BSD, BSDI BSD/386,
@@ -17,6 +17,8 @@
     Original location: www.linuxvideo.org/gatos
 */
 
+#include "config.h"
+
 #include "libdha.h"
 #include "AsmMacros.h"
 #include <stdio.h>
@@ -60,14 +62,44 @@
 #define DEV_MEM "/dev/mem"
 #endif
 
+#ifdef CONFIG_DHAHELPER
 static int mem=-1;
 void *map_phys_mem(unsigned base, unsigned size)
 {
+  if ( (mem = open("/dev/dhahelper",O_RDWR)) < 0)
+  {
+    if ( (mem = open(DEV_MEM,O_RDWR)) == -1) {
+	perror("libdha: open(/dev/mem) failed") ; exit(1) ;
+    }
+  }
+  else
+  {
+    dhahelper_memory_t mem_req;
+    
+    mem_req.operation = MEMORY_OP_MAP;
+    mem_req.start = base;
+    mem_req.offset = 0;
+    mem_req.size = size;
+    
+    if (ioctl(mem, DHAHELPER_MEMORY, &mem_req) < 0)
+    {
+	perror("libdha: failed mapping throught kernel helper");
+	return NULL;
+    }
+  }
+  return mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,mem,base) ;
+}
+#else
+
+static int mem=-1;
+void *map_phys_mem(unsigned base, unsigned size)
+{    
   if ( (mem = open(DEV_MEM,O_RDWR)) == -1) {
     perror("libdha: open(/dev/mem) failed") ; exit(1) ;
   }
   return mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,mem,base) ;
 }
+#endif /* CONFIG_DHAHELPER */
 
 void unmap_phys_mem(void *ptr, unsigned size)
 {
--- a/libdha/sysdep/AsmMacros_x86.h	Sat Feb 02 07:04:43 2002 +0000
+++ b/libdha/sysdep/AsmMacros_x86.h	Sat Feb 02 07:05:52 2002 +0000
@@ -11,24 +11,92 @@
 #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
+
 static __inline__ void outb(short port,char val)
 {
+#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_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_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;
+#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));
@@ -38,6 +106,19 @@
 static __inline__ unsigned int inw(short port)
 {
    unsigned short ret;
+#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));
@@ -47,6 +128,19 @@
 static __inline__ unsigned int inl(short port)
 {
    unsigned int ret;
+#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));
--- a/libdha/sysdep/pci_linux.c	Sat Feb 02 07:04:43 2002 +0000
+++ b/libdha/sysdep/pci_linux.c	Sat Feb 02 07:05:52 2002 +0000
@@ -10,8 +10,26 @@
 #include <sys/io.h>
 #endif
 
+#include "config.h"
+
+#ifdef CONFIG_DHAHELPER
+#include <fcntl.h>
+int dhahelper_initialized = 0;
+int dhahelper_fd = 0;
+#endif
+
 static __inline__ int enable_os_io(void)
 {
+#ifdef CONFIG_DHAHELPER
+    dhahelper_fd = open("/dev/dhahelper", O_RDWR);
+    if (dhahelper_fd > 0)
+    {
+	dhahelper_initialized = 1;
+	return(0);
+    }
+    dhahelper_initialized = -1;
+#endif
+
     if (iopl(3) != 0)
 	return(errno);
     return(0);
@@ -19,6 +37,11 @@
 
 static __inline__ int disable_os_io(void)
 {
+#ifdef CONFIG_DHAHELPER
+    if (dhahelper_initialized == 1)
+	close(dhahelper_fd);
+    else
+#endif
     if (iopl(0) != 0)
 	return(errno);
     return(0);