changeset 8503:9dbb9c710480

svgalib kernelhelper support (based on patch by Matan Ziv-Av <matan@svgalib.org>) and some reordering/cleanup (part #1 ;)
author alex
date Fri, 20 Dec 2002 21:07:27 +0000
parents 3158c0e8e7e1
children 321763255480
files libdha/Makefile libdha/config.h libdha/libdha.c libdha/pci.c libdha/sysdep/AsmMacros_x86.h libdha/sysdep/pci_linux.c libdha/sysdep/pci_powerpc.c
diffstat 7 files changed, 314 insertions(+), 98 deletions(-) [+]
line wrap: on
line diff
--- a/libdha/Makefile	Fri Dec 20 20:39:11 2002 +0000
+++ b/libdha/Makefile	Fri Dec 20 21:07:27 2002 +0000
@@ -28,6 +28,11 @@
 endif
 endif
 
+# If you want libdha to use svgalib_helper 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 -Isvgalib_helper/
+
 .SUFFIXES: .c .o
 
 # .PHONY: all clean
--- a/libdha/config.h	Fri Dec 20 20:39:11 2002 +0000
+++ b/libdha/config.h	Fri Dec 20 21:07:27 2002 +0000
@@ -9,4 +9,8 @@
 #endif
 #endif
 
+#if defined(__powerpc__) && defined(CONFIG_SVGAHELPER)
+#undef CONFIG_SVGAHELPER
+#endif
+
 #endif /* LIBDHA_CONFIG_H */
--- a/libdha/libdha.c	Fri Dec 20 20:39:11 2002 +0000
+++ b/libdha/libdha.c	Fri Dec 20 21:07:27 2002 +0000
@@ -66,21 +66,40 @@
 #endif
 
 #ifdef CONFIG_DHAHELPER
+#include "kernelhelper/dhahelper.h"
+#endif
 
-#include "kernelhelper/dhahelper.h"
+#ifdef CONFIG_SVGAHELPER
+#include <svgalib_helper.h>
+#endif
 
 static int mem=-1;
 void *map_phys_mem(unsigned long base, unsigned long size)
-{
+{    
 #ifdef ARCH_ALPHA
 /* TODO: move it into sysdep */
   base += bus_base();
 #endif
+
+#ifdef CONFIG_SVGAHELPER
+  if ( (mem = open(DEV_SVGA,O_RDWR)) == -1) {
+      perror("libdha: SVGAlib kernelhelper failed");
+#ifdef CONFIG_DHAHELPER
+      goto dha_helper_way;
+#else
+      goto dev_mem_way;
+#endif
+  }
+  else
+      goto mmap;
+#endif
+
+#ifdef CONFIG_DHAHELPER
+dha_helper_way:
   if ( (mem = open("/dev/dhahelper",O_RDWR)) < 0)
   {
-    if ( (mem = open(DEV_MEM,O_RDWR)) == -1) {
-	perror("libdha: open(/dev/mem) failed") ; exit(1) ;
-    }
+      perror("libdha: DHA kernelhelper failed");
+      goto dev_mem_way;
   }
   else
   {
@@ -93,37 +112,41 @@
     
     if (ioctl(mem, DHAHELPER_MEMORY, &mem_req) < 0)
     {
-	perror("libdha: failed mapping throught kernel helper");
-	return NULL;
+	perror("libdha: DHA kernelhelper failed");
+	close(mem);
+	goto dev_mem_way;
     }
+    else
+	goto mmap;
   }
-  return mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,mem,base) ;
-}
-#else
+#endif
 
-static int mem=-1;
-void *map_phys_mem(unsigned long base, unsigned long size)
-{    
-#ifdef ARCH_ALPHA
-/* 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) ;
+dev_mem_way:
+  if ( (mem = open(DEV_MEM,O_RDWR)) == -1)
+  {
+    perror("libdha: opening /dev/mem failed");
+    exit(1);
   }
-  return mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,mem,base) ;
+
+mmap:
+  return mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,mem,base);
 }
 #endif /* CONFIG_DHAHELPER */
 
 void unmap_phys_mem(void *ptr, unsigned long size)
 {
-  int res=munmap(ptr,size) ;
-  if (res == -1) { perror("libdha: munmap() failed") ; exit(1) ; }
+  int res = munmap(ptr,size);
+
+  if (res == -1)
+  {
+      perror("libdha: unmapping memory failed");
+      exit(1);
+  }
   close(mem);
+  mem = -1;
 }
-#endif
 
-unsigned char  INPORT8(unsigned idx)
+unsigned char INPORT8(unsigned idx)
 {
   return inb(idx);
 }
@@ -133,23 +156,22 @@
   return inw(idx);
 }
 
-unsigned       INPORT32(unsigned idx)
+unsigned INPORT32(unsigned idx)
 {
   return inl(idx);
 }
 
-void          OUTPORT8(unsigned idx,unsigned char val)
+void OUTPORT8(unsigned idx,unsigned char val)
 {
   outb(idx,val);
 }
 
-void          OUTPORT16(unsigned idx,unsigned short val)
+void OUTPORT16(unsigned idx,unsigned short val)
 {
   outw(idx,val);
 }
 
-void          OUTPORT32(unsigned idx,unsigned val)
+void OUTPORT32(unsigned idx,unsigned val)
 {
   outl(idx,val);
 }
-
--- a/libdha/pci.c	Fri Dec 20 20:39:11 2002 +0000
+++ b/libdha/pci.c	Fri Dec 20 21:07:27 2002 +0000
@@ -478,6 +478,7 @@
 #endif
 
 /* cpu depended stuff */
+#ifndef CONFIG_SVGAHELPER
 #if defined(__alpha__)
 #include "sysdep/pci_alpha.c"
 #elif defined(__ia64__)
@@ -491,7 +492,7 @@
 #else
 #include "sysdep/pci_x86.c"
 #endif
-
+#endif
  
 static int pcicards=0 ;
 static pciinfo_t *pci_lst;
--- a/libdha/sysdep/AsmMacros_x86.h	Fri Dec 20 20:39:11 2002 +0000
+++ b/libdha/sysdep/AsmMacros_x86.h	Fri Dec 20 21:07:27 2002 +0000
@@ -21,8 +21,81 @@
 extern int dhahelper_initialized;
 #endif
 
+#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, 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)
     {
@@ -43,6 +116,14 @@
 
 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)
     {
@@ -63,6 +144,14 @@
 
 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)
     {
@@ -83,7 +172,15 @@
 
 static __inline__ unsigned int inb(short port)
 {
-   unsigned char ret;
+   unsigned char ret = 0;
+
+#ifdef CONFIG_SVGAHELPER
+    if (svgahelper_initialized == 1)
+    {
+	return svga_inb(port);
+    }
+#endif
+
 #ifdef CONFIG_DHAHELPER
     if (dhahelper_initialized == 1)
     {
@@ -105,7 +202,15 @@
 
 static __inline__ unsigned int inw(short port)
 {
-   unsigned short ret;
+   unsigned short ret = 0;
+
+#ifdef CONFIG_SVGAHELPER
+    if (svgahelper_initialized == 1)
+    {
+	return svga_inw(port);
+    }
+#endif
+
 #ifdef CONFIG_DHAHELPER
     if (dhahelper_initialized == 1)
     {
@@ -127,7 +232,15 @@
 
 static __inline__ unsigned int inl(short port)
 {
-   unsigned int ret;
+   unsigned int ret = 0;
+
+#ifdef CONFIG_SVGAHELPER
+    if (svgahelper_initialized == 1)
+    {
+	return svga_inl(port);
+    }
+#endif
+
 #ifdef CONFIG_DHAHELPER
     if (dhahelper_initialized == 1)
     {
@@ -149,11 +262,19 @@
 
 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");
 }
 
--- a/libdha/sysdep/pci_linux.c	Fri Dec 20 20:39:11 2002 +0000
+++ b/libdha/sysdep/pci_linux.c	Fri Dec 20 21:07:27 2002 +0000
@@ -20,8 +20,59 @@
 int dhahelper_fd = 0;
 #endif
 
+#ifdef CONFIG_SVGAHELPER
+#include <svgalib_helper.h>
+#ifdef __linux__
+#include <linux/ioctl.h>
+#endif
+#include <fcntl.h>
+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)
@@ -43,6 +94,11 @@
 
 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);
@@ -56,3 +112,74 @@
 #endif    
     return(0);
 }
+
+#if (defined(__powerpc__) || defined(__sparc__) || defined(__sparc64__)) \
+    && 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 "../../bswap.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
--- a/libdha/sysdep/pci_powerpc.c	Fri Dec 20 20:39:11 2002 +0000
+++ b/libdha/sysdep/pci_powerpc.c	Fri Dec 20 21:07:27 2002 +0000
@@ -4,73 +4,9 @@
    Modified for readability by Nick Kurshev
 */
 
+#if defined(Lynx) || defined(__OpenBSD__)
 static int pci_config_type( void ) { return 1; }
 
-#if defined(__powerpc__) && defined(__linux__)
-/* 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 "../../bswap.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 = bswap_16(vendor);
-	    device = bswap_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 = bswap_32(retval);
-    } else {
-	    retval = 0;
-    }   
-    if (fd > 0) {
-	    close(fd);
-    }
-    return retval;
-}
-
-#else /*Lynx/OpenBSD*/
-
 static int pci_get_vendor(
           unsigned char bus,
           unsigned char dev,