[MPlayer-dev-eng] [PATCH] svgalib_helper support for libdha (fixed again)

Matan Ziv-Av matan at svgalib.org
Wed Dec 18 15:36:31 CET 2002


I'm really sorry, here's the right patch.
No more sending mail past 22:00 for me :-(.


---------- Forwarded message ----------
Date: Wed, 18 Dec 2002 00:00:04 +0200 (IST)
From: Matan Ziv-Av <matan at svgalib.org>
To: mplayer-dev-eng at mplayerhq.hu
Subject: [PATCH] svgalib_helper support for libdha


Hello,

The attached patch adds to dha the option to use svgalib kernel helper
instead of dha helper. The helper is used in order to access the
hardware without root privileges.

The problem with the current patch is that there is no
autoconfiguration, so libdha/Makefile nneds to be editted to use this.
There is also no runtime detection, so vidix will not work if compiled
for svgalib helper but the module is not loaded. 

-- 
Matan Ziv-Av.                         matan at svgalib.org

-------------- next part --------------
diff -Nur ../orig/MPlayer-20021206/libdha/Makefile libdha/Makefile
--- ../orig/MPlayer-20021206/libdha/Makefile	Mon Oct 21 16:23:19 2002
+++ libdha/Makefile	Wed Dec 18 00:07:36 2002
@@ -28,6 +28,12 @@
 endif
 endif
 
+
+# If you want libdha to use svgalib_helper module for hardware access, 
+# uncomment this statement, and change the -I to the correct directory 
+# that includes svgalib_helper.o:
+#CFLAGS += -DDEV_SVGA=\"/dev/svga\" -DCONFIG_SVGAHELPER -I/svgalib/kernel/svgalib_helper
+
 .SUFFIXES: .c .o
 
 # .PHONY: all clean
diff -Nur ../orig/MPlayer-20021206/libdha/config.h libdha/config.h
--- ../orig/MPlayer-20021206/libdha/config.h	Tue Oct 22 17:09:36 2002
+++ libdha/config.h	Tue Dec 17 13:40:50 2002
@@ -9,4 +9,8 @@
 #endif
 #endif
 
+#ifdef CONFIG_SVGAHELPER
+#undef CONFIG_DHAHELPER
+#endif
+
 #endif /* LIBDHA_CONFIG_H */
diff -Nur ../orig/MPlayer-20021206/libdha/libdha.c libdha/libdha.c
--- ../orig/MPlayer-20021206/libdha/libdha.c	Fri Apr 19 19:33:54 2002
+++ libdha/libdha.c	Tue Dec 17 22:47:24 2002
@@ -108,8 +108,13 @@
 /* TODO: move it into sysdep */
   base += bus_base();
 #endif
-  if ( (mem = open(DEV_MEM,O_RDWR)) == -1) {
-    perror("libdha: open(/dev/mem) failed") ; exit(1) ;
+  if(mem==-1) {
+#ifdef CONFIG_SVGAHELPER
+  	if ( (mem = open(DEV_SVGA,O_RDWR)) == -1) 
+#endif
+  	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) ;
 }
@@ -120,6 +125,7 @@
   int res=munmap(ptr,size) ;
   if (res == -1) { perror("libdha: munmap() failed") ; exit(1) ; }
   close(mem);
+  mem=-1;
 }
 #endif
 
diff -Nur ../orig/MPlayer-20021206/libdha/pci.c libdha/pci.c
--- ../orig/MPlayer-20021206/libdha/pci.c	Fri Apr 19 19:33:54 2002
+++ libdha/pci.c	Tue Dec 17 14:43:29 2002
@@ -478,6 +478,7 @@
 #endif
 
 /* cpu depended stuff */
+#ifndef CONFIG_SVGAHELPER
 #if defined(__alpha__)
 #include "sysdep/pci_alpha.c"
 #elif defined(__ia64__)
@@ -490,6 +491,7 @@
 #include "sysdep/pci_powerpc.c"
 #else
 #include "sysdep/pci_x86.c"
+#endif
 #endif
 
  
diff -Nur ../orig/MPlayer-20021206/libdha/sysdep/AsmMacros_x86.h libdha/sysdep/AsmMacros_x86.h
--- ../orig/MPlayer-20021206/libdha/sysdep/AsmMacros_x86.h	Sat Feb  2 09:05:52 2002
+++ libdha/sysdep/AsmMacros_x86.h	Wed Dec 18 00:06:28 2002
@@ -13,6 +13,71 @@
 
 #include "config.h"
 
+#ifdef CONFIG_SVGAHELPER
+
+#include <sys/ioctl.h>
+#include <svgalib_helper.h>
+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, short 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 /* SVGAHELPER */
+
 #ifdef CONFIG_DHAHELPER
 #include <sys/ioctl.h>
 #include "../kernelhelper/dhahelper.h"
@@ -37,6 +102,12 @@
     }
     else
 #endif
+#ifdef CONFIG_SVGAHELPER
+	if(svgahelper_initialized==1) {
+		svga_outb(port, val);
+		return ;
+	}
+#endif
    __asm__ __volatile__("outb %0,%1" : :"a" (val), "d" (port));
     return;
 }
@@ -57,6 +128,12 @@
     }
     else
 #endif
+#ifdef CONFIG_SVGAHELPER
+	if(svgahelper_initialized==1) {
+		svga_outw(port, val);
+		return ;
+	}
+#endif
    __asm__ __volatile__("outw %0,%1" : :"a" (val), "d" (port));
     return;
 }
@@ -77,6 +154,12 @@
     }
     else
 #endif
+#ifdef CONFIG_SVGAHELPER
+	if(svgahelper_initialized==1) {
+		svga_outl(port, val);
+		return ;
+	}
+#endif
    __asm__ __volatile__("outl %0,%1" : :"a" (val), "d" (port));
     return;
 }
@@ -97,6 +180,11 @@
     }
     else
 #endif
+#ifdef CONFIG_SVGAHELPER
+	if(svgahelper_initialized==1) {
+		return svga_inb(port);
+	}
+#endif
    __asm__ __volatile__("inb %1,%0" :
        "=a" (ret) :
        "d" (port));
@@ -119,6 +207,11 @@
     }
     else
 #endif
+#ifdef CONFIG_SVGAHELPER
+	if(svgahelper_initialized==1) {
+		return svga_inw(port);
+	}
+#endif
    __asm__ __volatile__("inw %1,%0" :
        "=a" (ret) :
        "d" (port));
@@ -141,6 +234,11 @@
     }
     else
 #endif
+#ifdef CONFIG_SVGAHELPER
+	if(svgahelper_initialized==1) {
+		return svga_inl(port);
+	}
+#endif
    __asm__ __volatile__("inl %1,%0" :
        "=a" (ret) :
        "d" (port));
@@ -149,11 +247,17 @@
 
 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");
 }
 
diff -Nur ../orig/MPlayer-20021206/libdha/sysdep/pci_linux.c libdha/sysdep/pci_linux.c
--- ../orig/MPlayer-20021206/libdha/sysdep/pci_linux.c	Tue Oct 22 14:22:40 2002
+++ libdha/sysdep/pci_linux.c	Wed Dec 18 00:05:52 2002
@@ -14,6 +14,43 @@
 
 #include "config.h"
 
+#ifdef CONFIG_SVGAHELPER
+#include <fcntl.h>
+int svgahelper_fd = 0;
+int svgahelper_initialized = 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 /* SVGAHELPER */
+
 #ifdef CONFIG_DHAHELPER
 #include <fcntl.h>
 int dhahelper_initialized = 0;
@@ -31,7 +68,15 @@
     }
     dhahelper_initialized = -1;
 #endif
-
+#ifdef CONFIG_SVGAHELPER
+	svgahelper_fd = open(DEV_SVGA, O_RDWR);
+	if (svgahelper_fd > 0)
+	{
+		svgahelper_initialized = 1;
+		return(0);
+	}
+	svgahelper_initialized = -1;
+#endif
 #if defined(__powerpc__) && defined(__linux__)
 /* should be fixed? */
 #else    
@@ -46,6 +91,13 @@
 #ifdef CONFIG_DHAHELPER
     if (dhahelper_initialized == 1)
 	close(dhahelper_fd);
+    else
+#endif
+#ifdef CONFIG_SVGAHELPER
+    if (svgahelper_initialized == 1) {
+		close(svgahelper_fd);
+		svgahelper_initialized=0;
+	}
     else
 #endif
 #if defined(__powerpc__) && defined(__linux__)


More information about the MPlayer-dev-eng mailing list