From 6429f7e4fd55a230f471a4f1c12387db793a71dd Mon Sep 17 00:00:00 2001 From: alex Date: Fri, 20 Dec 2002 21:07:27 +0000 Subject: svgalib kernelhelper support (based on patch by Matan Ziv-Av ) and some reordering/cleanup (part #1 ;) git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@8504 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libdha/sysdep/AsmMacros_x86.h | 127 +++++++++++++++++++++++++++++++++++++++++- libdha/sysdep/pci_linux.c | 127 ++++++++++++++++++++++++++++++++++++++++++ libdha/sysdep/pci_powerpc.c | 66 +--------------------- 3 files changed, 252 insertions(+), 68 deletions(-) (limited to 'libdha/sysdep') diff --git a/libdha/sysdep/AsmMacros_x86.h b/libdha/sysdep/AsmMacros_x86.h index c10f24f2dd..fd6591152c 100644 --- a/libdha/sysdep/AsmMacros_x86.h +++ b/libdha/sysdep/AsmMacros_x86.h @@ -21,8 +21,81 @@ extern int dhahelper_fd; extern int dhahelper_initialized; #endif +#ifdef CONFIG_SVGAHELPER +#include +#include + +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 outb(short port,char val) 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 outw(short port,short val) 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__ void outl(short port,unsigned int val) 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 inb(short port) 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 inw(short port) 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__ unsigned int inl(short port) 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 --git a/libdha/sysdep/pci_linux.c b/libdha/sysdep/pci_linux.c index e53ae20721..ad9715b2d8 100644 --- a/libdha/sysdep/pci_linux.c +++ b/libdha/sysdep/pci_linux.c @@ -20,8 +20,59 @@ int dhahelper_initialized = 0; int dhahelper_fd = 0; #endif +#ifdef CONFIG_SVGAHELPER +#include +#ifdef __linux__ +#include +#endif +#include +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 enable_os_io(void) 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 @@ static __inline__ int disable_os_io(void) #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 +//#include +#include +#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 diff --git a/libdha/sysdep/pci_powerpc.c b/libdha/sysdep/pci_powerpc.c index 82f40b4d05..94529037b6 100644 --- a/libdha/sysdep/pci_powerpc.c +++ b/libdha/sysdep/pci_powerpc.c @@ -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 -//#include -#include -#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, -- cgit v1.2.3