[Mplayer-cvslog] CVS: main/libdha AsmMacros.h,NONE,1.1 Makefile,NONE,1.1 README,NONE,1.1 libdha.c,NONE,1.1 libdha.h,NONE,1.1 pci.c,NONE,1.1 test.c,NONE,1.1

Nick Kurshev nick at mplayer.dev.hu
Fri Jan 4 11:32:28 CET 2002


Update of /cvsroot/mplayer/main/libdha
In directory mplayer:/var/tmp.root/cvs-serv25191

Added Files:
	AsmMacros.h Makefile README libdha.c libdha.h pci.c test.c 
Log Message:
preliminary support of direct hardware access

--- NEW FILE ---
/* $XConsortium: AsmMacros.h /main/13 1996/10/25 11:33:12 kaleb $ */
/*
 * (c) Copyright 1993,1994 by David Wexelblat <dwex at xfree86.org>
 *
 * 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 
 * DAVID WEXELBLAT 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 David Wexelblat shall not be
 * used in advertising or otherwise to promote the sale, use or other dealings
 * in this Software without prior written authorization from David Wexelblat.
 *
 */
/*
 * Copyright 1997
 * Digital Equipment Corporation. All rights reserved.
 * This software is furnished under license and may be used and copied only in 
 * accordance with the following terms and conditions.  Subject to these 
 * conditions, you may download, copy, install, use, modify and distribute 
 * this software in source and/or binary form. No title or ownership is 
 * transferred hereby.
 *
 * 1) Any source code used, modified or distributed must reproduce and retain 
 *    this copyright notice and list of conditions as they appear in the source
 *    file.
 *
 * 2) No right is granted to use any trade name, trademark, or logo of Digital 
 *    Equipment Corporation. Neither the "Digital Equipment Corporation" name 
 *    nor any trademark or logo of Digital Equipment Corporation may be used 
 *    to endorse or promote products derived from this software without the 
 *    prior written permission of Digital Equipment Corporation.
 *
 * 3) This software is provided "AS-IS" and any express or implied warranties, 
 *    including but not limited to, any implied warranties of merchantability, 
 *    fitness for a particular purpose, or non-infringement are disclaimed. In 
 *    no event shall DIGITAL be liable for any damages whatsoever, and in 
 *    particular, DIGITAL shall not be liable for special, indirect, 
 *    consequential, or incidental damages or damages for 
 *    lost profits, loss of revenue or loss of use, whether such damages arise 
 *    in contract, 
 *    negligence, tort, under statute, in equity, at law or otherwise, even if 
 *    advised of the possibility of such damage. 
 *
 */




/* $XFree86: xc/programs/Xserver/hw/xfree86/SuperProbe/AsmMacros.h,v 3.13 1999/03/28 15:32:21 dawes Exp $ */

#if defined(__GNUC__)
#if defined(linux) && defined(__alpha__)
#define inb _inb
#define inw _inw
#define inl _inl
#define outb(p,v) _outb((v),(p))
#define outw(p,v) _outw((v),(p))
#define outl(p,v) _outl((v),(p))
#else
#if defined(__sparc__)
#ifndef ASI_PL
#define ASI_PL 0x88
#endif

static __inline__ void
outb(port, val)
unsigned long port;
char val;
{
  __asm__ __volatile__("stba %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL));
}

static __inline__ void
outw(port, val)
unsigned long port;
char val;
{
  __asm__ __volatile__("stha %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL));
}

static __inline__ void
outl(port, val)
unsigned long port;
char val;
{
  __asm__ __volatile__("sta %0, [%1] %2" : : "r" (val), "r" (port), "i" (ASI_PL));
}

static __inline__ unsigned int
inb(port)
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(port)
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(port)
unsigned long port;
{
   unsigned char ret;
   __asm__ __volatile__("lda [%1] %2, %0" : "=r" (ret) : "r" (port), "i" (ASI_PL));
   return ret;
}
#else
#ifdef __arm32__
unsigned int IOPortBase;  /* Memory mapped I/O port area */

static __inline__ void
outb(port, val)
     short port;
     char val;
{
	 if ((unsigned short)port >= 0x400) return;

	*(volatile unsigned char*)(((unsigned short)(port))+IOPortBase) = val;
}

static __inline__ void
outw(port, val)
     short port;
     short val;
{
	 if ((unsigned short)port >= 0x400) return;

	*(volatile unsigned short*)(((unsigned short)(port))+IOPortBase) = val;
}

static __inline__ void
outl(port, val)
     short port;
     int val;
{
	 if ((unsigned short)port >= 0x400) return;

	*(volatile unsigned long*)(((unsigned short)(port))+IOPortBase) = val;
}

static __inline__ unsigned int
inb(port)
     short port;
{
	 if ((unsigned short)port >= 0x400) return((unsigned int)-1);

	return(*(volatile unsigned char*)(((unsigned short)(port))+IOPortBase));
}

static __inline__ unsigned int
inw(port)
     short port;
{
	 if ((unsigned short)port >= 0x400) return((unsigned int)-1);

	return(*(volatile unsigned short*)(((unsigned short)(port))+IOPortBase));
}

static __inline__ unsigned int
inl(port)
     short port;
{
	 if ((unsigned short)port >= 0x400) return((unsigned int)-1);

	return(*(volatile unsigned long*)(((unsigned short)(port))+IOPortBase));
}
#else /* __arm32__ */
#if defined(Lynx) && defined(__powerpc__)
extern unsigned char *ioBase;

static volatile void
eieio()
{
	__asm__ __volatile__ ("eieio");
}

static void
outb(port, value)
short port;
unsigned char value;
{
	*(uchar *)(ioBase + port) = value; eieio();
}

static void
outw(port, value)
short port;
unsigned short value;
{
	*(unsigned short *)(ioBase + port) = value; eieio();
}

static void
outl(port, value)
short port;
unsigned long value;
{
	*(unsigned long *)(ioBase + port) = value; eieio();
}

static unsigned char
inb(port)
short port;
{
	unsigned char val;

	val = *((unsigned char *)(ioBase + port)); eieio();
	return(val);
}

static unsigned short
inw(port)
short port;
{
	unsigned short val;

	val = *((unsigned short *)(ioBase + port)); eieio();
	return(val);
}

static unsigned long
inl(port)
short port;
{
	unsigned long val;

	val = *((unsigned long *)(ioBase + port)); eieio();
	return(val);
}

#else
#ifdef GCCUSESGAS
static __inline__ void
outb(port, val)
short port;
char val;
{
   __asm__ __volatile__("outb %0,%1" : :"a" (val), "d" (port));
}

static __inline__ void
outw(port, val)
short port;
short val;
{
   __asm__ __volatile__("outw %0,%1" : :"a" (val), "d" (port));
}

static __inline__ void
outl(port, val)
short port;
unsigned int val;
{
   __asm__ __volatile__("outl %0,%1" : :"a" (val), "d" (port));
}

static __inline__ unsigned int
inb(port)
short port;
{
   unsigned char ret;
   __asm__ __volatile__("inb %1,%0" :
       "=a" (ret) :
       "d" (port));
   return ret;
}

static __inline__ unsigned int
inw(port)
short port;
{
   unsigned short ret;
   __asm__ __volatile__("inw %1,%0" :
       "=a" (ret) :
       "d" (port));
   return ret;
}

static __inline__ unsigned int
inl(port)
short port;
{
   unsigned int ret;
   __asm__ __volatile__("inl %1,%0" :
       "=a" (ret) :
       "d" (port));
   return ret;
}

#else /* GCCUSESGAS */

static __inline__ void
outb(port, val)
     short port;
     char val;
{
  __asm__ __volatile__("out%B0 (%1)" : :"a" (val), "d" (port));
}

static __inline__ void
outw(port, val)
     short port;
     short val;
{
  __asm__ __volatile__("out%W0 (%1)" : :"a" (val), "d" (port));
}

static __inline__ void
outl(port, val)
     short port;
     unsigned int val;
{
  __asm__ __volatile__("out%L0 (%1)" : :"a" (val), "d" (port));
}

static __inline__ unsigned int
inb(port)
     short port;
{
  unsigned int ret;
  __asm__ __volatile__("in%B0 (%1)" :
                   "=a" (ret) :
                   "d" (port));
  return ret;
}

static __inline__ unsigned int
inw(port)
     short port;
{
  unsigned int ret;
  __asm__ __volatile__("in%W0 (%1)" :
                   "=a" (ret) :
                   "d" (port));
  return ret;
}

static __inline__ unsigned int
inl(port)
     short port;
{
  unsigned int ret;
  __asm__ __volatile__("in%L0 (%1)" :
                   "=a" (ret) :
                   "d" (port));
  return ret;
}

#endif /* GCCUSESGAS */
#endif /* Lynx && __powerpc__ */
#endif /* arm32 */
#endif /* linux && __sparc__ */
#endif /* linux && __alpha__ */

#if defined(linux) || defined(__arm32__) || (defined(Lynx) && defined(__powerpc__))

#define intr_disable()
#define intr_enable()

#else 

static __inline__ void
intr_disable()
{
  __asm__ __volatile__("cli");
}

static __inline__ void
intr_enable()
{
  __asm__ __volatile__("sti");
}

#endif /* else !linux && !__arm32__ */

#else /* __GNUC__ */

#if defined(_MINIX) && defined(_ACK)

/* inb, outb, inw and outw are defined in the library */
/* ... but I've no idea if the same is true for inl & outl */

u8_t inb(U16_t);
void outb(U16_t, U8_t);
u16_t inw(U16_t);
void outw(U16_t, U16_t);
u32_t inl(U16_t);
void outl(U16_t, U32_t);

#else /* not _MINIX and _ACK */

# if defined(__STDC__) && (__STDC__ == 1)
#  ifndef NCR
#  define asm __asm
#  endif
# endif
# ifdef SVR4
#  include <sys/types.h>
#  ifndef __USLC__
#   define __USLC__
#  endif
# endif
#ifndef SCO325
# include <sys/inline.h>
#else
# include "../common/scoasm.h"
#endif
#define intr_disable() asm("cli")
#define intr_enable()  asm("sti")

#endif /* _MINIX and _ACK */
#endif /* __GNUC__ */

--- NEW FILE ---
# makefile

include ../config.mak

VERSION = 0.1

SHORTNAME = libdha.so
LIBNAME = libdha-$(VERSION).so

SRCS=libdha.c pci.c
OBJS=$(SRCS:.c=.o)

CFLAGS  = $(OPTFLAGS) -fPIC -I. -I.. -Wall -W

.SUFFIXES: .c .o

# .PHONY: all clean

.c.o:
	$(CC) -c $(CFLAGS) -o $@ $<

$(LIBNAME):     $(OBJS)
	$(CC) -shared -o $(LIBNAME) $(OBJS)
	ln -sf $(LIBNAME) $(SHORTNAME)

all:    $(LIBNAME) $(SHORTNAME)

test:
	$(CC) test.c -o test $(SHORTNAME)

clean:
	rm -f *.o *.so *~

distclean:
	rm -f Makefile.bak *.o *.so test *~ .depend

dep:    depend

depend:
	$(CC) -MM $(CFLAGS) $(SRCS) 1>.depend

install:
	cp $(LIBNAME) $(prefix)/lib/$(LIBNAME)
	rm $(prefix)/lib/libdha.so
	ln -sf $(LIBNAME) $(prefix)/lib/libdha.so
	ldconfig

#
# include dependency files if they exist
#
ifneq ($(wildcard .depend),)
include .depend
endif

--- NEW FILE ---
libdha - Library of Direct Hardware Access.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This library was designed for direct hardware access under different
OS and architectures. It's not linux specific only (like harddrake
and other).

This library is based on gfxdump utility from GATOS project.
Full list of supported OS'es see in libdha.h

Note: This library requires ROOT privileges or SUID'ed executable
file (same as XServer).

--- NEW FILE ---
/*
    libgha.c - Library for direct hardware access
    Copyrights:
    1996/10/27	- Robin Cutshaw (robin at xfree86.org)
		  XFree86 3.3.3 implementation
    1999	- Øyvind Aabling.
    		  Modified for GATOS/win/gfxdump.
		  
    2002	- library implementation by Nick Kurshev
    
    supported O/S's:	SVR4, UnixWare, SCO, Solaris,
			FreeBSD, NetBSD, 386BSD, BSDI BSD/386,
			Linux, Mach/386, ISC
			DOS (WATCOM 9.5 compiler), Win9x (with mapdev.vxd)
    Licence: GPL
    Original location: www.linuxvideo.org/gatos
*/

#include "libdha.h"
#include "AsmMacros.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

#ifdef _WIN32
// MAPDEV.h - include file for VxD MAPDEV
// Copyright (c) 1996 Vireo Software, Inc.

#include <windows.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) )

/* Memory Map a piece of Real Memory */
void *map_phys_mem(unsigned base, unsigned size) {

  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 ;
}

void unmap_phys_mem(void *ptr, unsigned size) { }

#else
#include <sys/mman.h>

static int mem=-1;
void *map_phys_mem(unsigned base, unsigned size)
{
  void *ptr;
  if ( (mem = open("/dev/mem",O_RDWR)) == -1) {
    perror("libdha: open(/dev/mem) failed") ; exit(1) ;
  }
  ptr=mmap(0,size,PROT_READ|PROT_WRITE,MAP_SHARED,mem,base) ;
  if ((int)ptr == -1) {
    perror("libdha: mmap() failed") ; exit(1) ;
  }
  return ptr;
}

void unmap_phys_mem(void *ptr, unsigned size)
{
  int res=munmap(ptr,size) ;
  if (res == -1) { perror("libdha: munmap() failed") ; exit(1) ; }
  close(mem);
}
#endif

unsigned char  INREG8(unsigned idx)
{
  return inb(idx);
}

unsigned short INREG16(unsigned idx)
{
  return inw(idx);
}

unsigned       INREG32(unsigned idx)
{
  return inl(idx);
}

void          OUTREG8(unsigned idx,unsigned char val)
{
  outb(idx,val);
}

void          OUTREG16(unsigned idx,unsigned short val)
{
  outw(idx,val);
}

void          OUTREG32(unsigned idx,unsigned val)
{
  outl(idx,val);
}

--- NEW FILE ---
/*
    libgha.h - Library for direct hardware access
    Copyrights:
    1996/10/27	- Robin Cutshaw (robin at xfree86.org)
		  XFree86 3.3.3 implementation
    1999	- Øyvind Aabling.
    		  Modified for GATOS/win/gfxdump.
    2002	- library implementation by Nick Kurshev
    
    supported O/S's:	SVR4, UnixWare, SCO, Solaris,
			FreeBSD, NetBSD, 386BSD, BSDI BSD/386,
			Linux, Mach/386, ISC
			DOS (WATCOM 9.5 compiler), Win9x (with mapdev.vxd)
    Licence: GPL
*/
#ifndef LIBDHA_H
#define LIBDHA_H

#ifdef __cplusplus
extern "C" {
#endif

#define MAX_DEV_PER_VENDOR_CFG1 64
#define MAX_PCI_DEVICES_PER_BUS 32
#define MAX_PCI_DEVICES         64
#define PCI_MULTIFUNC_DEV	0x80

typedef struct pciinfo_s
{
  int	bus,card,func ;			/* PCI/AGP bus:card:func */
  unsigned short vendor,device ;			/* Card vendor+device ID */
  unsigned	base0,base1,base2,baserom ;	/* Memory and I/O base addresses */
}pciinfo_t;

			/* Fill array pci_list which must have size MAX_PCI_DEVICES
			   and return 0 if sucessful */
extern int  pci_scan(pciinfo_t *pci_list,unsigned *num_card);



extern unsigned char  INREG8(unsigned idx);
extern unsigned short INREG16(unsigned idx);
extern unsigned       INREG32(unsigned idx);
#define INREG(idx) INREG32(idx)
extern void          OUTREG8(unsigned idx,unsigned char val);
extern void          OUTREG16(unsigned idx,unsigned short val);
extern void          OUTREG32(unsigned idx,unsigned val);
#define OUTREG(idx,val) OUTREG32(idx,val)

extern void *  map_phys_mem(unsigned base, unsigned size);
extern void    unmap_phys_mem(void *ptr, unsigned size);

#ifdef __cplusplus
}
#endif

#endif
--- NEW FILE ---
/*
   (C) 2002 - library implementation by Nick Kyrshev
   XFree86 3.3.3 scanpci.c, modified for GATOS/win/gfxdump by Øyvind Aabling.
 */
 
#include "libdha.h"
 
#include <errno.h>
#include <string.h>
#include "AsmMacros.h"
#ifdef __unix__
#include <unistd.h>
#include <sys/mman.h>
#elif defined ( _WIN32 )
#include <windows.h>
#else
#include <dos.h>
#endif
 
[...1138 lines suppressed...]
            pcr->_bist, pcr->_header_type, pcr->_latency_timer,
            pcr->_cache_line_size);
    printf("  PRIBUS 0x%02x SECBUS 0x%02x SUBBUS 0x%02x SECLT 0x%02x\n",
           pcr->_primary_bus_number, pcr->_secondary_bus_number,
	   pcr->_subordinate_bus_number, pcr->_secondary_latency_timer);
    printf("  IOBASE: 0x%02x00 IOLIM 0x%02x00 SECSTATUS 0x%04x\n",
	pcr->_io_base, pcr->_io_limit, pcr->_secondary_status);
    printf("  NOPREFETCH MEMBASE: 0x%08x MEMLIM 0x%08x\n",
	pcr->_mem_base, pcr->_mem_limit);
    printf("  PREFETCH MEMBASE: 0x%08x MEMLIM 0x%08x\n",
	pcr->_prefetch_mem_base, pcr->_prefetch_mem_limit);
    printf("  RBASE_E   0x%08x  addr 0x%08x  %sdecode-enabled\n",
        pcr->_baserom, pcr->_baserom & 0xFFFF8000,
        pcr->_baserom & 0x1 ? "" : "not-");
    if (pcr->_max_min_ipin_iline)
        printf("  MAX_LAT   0x%02x  MIN_GNT 0x%02x  INT_PIN 0x%02x  INT_LINE 0x%02x\n",
            pcr->_max_lat, pcr->_min_gnt, pcr->_int_pin, pcr->_int_line);
    */
}
#endif 

--- NEW FILE ---
#include "libdha.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main( void )
{
  pciinfo_t lst[MAX_PCI_DEVICES];
  unsigned i,num_pci;
  int err;
  err = pci_scan(lst,&num_pci);
  if(err)
  {
    printf("Error occured during pci scan: %s\n",strerror(err));
    return EXIT_FAILURE;
  }
  else
  {
    printf(" Bus:card:func vend:dev  base0   :base1   :base2   :baserom\n");
    for(i=0;i<num_pci;i++)
      printf("%04X:%04X:%04X %04X:%04X %08X:%08X:%08X:%08X\n"
    	    ,lst[i].bus,lst[i].card,lst[i].func
	    ,lst[i].vendor,lst[i].device
	    ,lst[i].base0,lst[i].base1,lst[i].base2,lst[i].baserom);
  }
  return EXIT_SUCCESS;
}




More information about the MPlayer-cvslog mailing list