178 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * Copyright 1998 by Metro Link Incorporated
 | 
						|
 *
 | 
						|
 * Permission to use, copy, modify, distribute, and sell this software
 | 
						|
 * and its documentation for any purpose is hereby granted without fee,
 | 
						|
 * provided that the above copyright notice appear in all copies and that
 | 
						|
 * both that copyright notice and this permission notice appear in
 | 
						|
 * supporting documentation, and that the name of Metro Link
 | 
						|
 * Incorporated not be used in advertising or publicity pertaining to
 | 
						|
 * distribution of the software without specific, written prior
 | 
						|
 * permission.  Metro Link Incorporated makes no representations
 | 
						|
 * about the suitability of this software for any purpose.  It is
 | 
						|
 * provided "as is" without express or implied warranty.
 | 
						|
 *
 | 
						|
 * METRO LINK INCORPORATED DISCLAIMS ALL WARRANTIES WITH REGARD
 | 
						|
 * TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
 | 
						|
 * AND FITNESS, IN NO EVENT SHALL METRO LINK INCORPORATED BE
 | 
						|
 * LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY
 | 
						|
 * DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
 | 
						|
 * WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
 | 
						|
 * ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
 | 
						|
 * SOFTWARE.
 | 
						|
 */
 | 
						|
 | 
						|
#ifdef HAVE_XORG_CONFIG_H
 | 
						|
#include <xorg-config.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#if /* NO_INLINE && */ defined(__powerpc__)
 | 
						|
 | 
						|
#include "xf86Pci.h"
 | 
						|
 | 
						|
extern volatile unsigned char *ioBase;
 | 
						|
 | 
						|
_X_EXPORT void
 | 
						|
eieio()
 | 
						|
{
 | 
						|
	__asm__ __volatile__ ("eieio");
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT unsigned long
 | 
						|
ldl_brx(volatile unsigned char *base, int ndx)
 | 
						|
{
 | 
						|
	register unsigned long tmp = *(volatile unsigned long *)(base+ndx);
 | 
						|
	return( ((tmp & 0x000000ff) << 24) |
 | 
						|
		((tmp & 0x0000ff00) << 8) |
 | 
						|
		((tmp & 0x00ff0000) >> 8) |
 | 
						|
		((tmp & 0xff000000) >> 24) );
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT unsigned short
 | 
						|
ldw_brx(volatile unsigned char *base, int ndx)
 | 
						|
{
 | 
						|
	register unsigned short tmp = *(volatile unsigned short *)(base+ndx);
 | 
						|
	return((tmp << 8) | (tmp >> 8));
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT void
 | 
						|
stl_brx(unsigned long val, volatile unsigned char *base, int ndx)
 | 
						|
{
 | 
						|
   unsigned char *p = (unsigned char *)&val;
 | 
						|
   unsigned long tmp = (p[3] << 24) | (p[2] << 16) | (p[1] << 8) | (p[0] << 0);
 | 
						|
   *(volatile unsigned long *)(base+ndx) = tmp;
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT void
 | 
						|
stw_brx(unsigned short val, volatile unsigned char *base, int ndx)
 | 
						|
{
 | 
						|
  unsigned char *p = (unsigned char *)&val;
 | 
						|
  unsigned short tmp = (p[1] << 8) | p[0];
 | 
						|
  *(volatile unsigned short *)(base+ndx) = tmp;
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT void
 | 
						|
outb(IOADDRESS port, unsigned char value)
 | 
						|
{
 | 
						|
	*((volatile unsigned char *)(ioBase + port)) = value; eieio();
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT void
 | 
						|
outw(IOADDRESS port, unsigned short value)
 | 
						|
{
 | 
						|
	stw_brx(value, ioBase, port); eieio();
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT void
 | 
						|
outl(IOADDRESS port, unsigned int value)
 | 
						|
{
 | 
						|
	stl_brx(value, ioBase, port); eieio();
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT unsigned char
 | 
						|
inb(IOADDRESS port)
 | 
						|
{
 | 
						|
	unsigned char val;
 | 
						|
 | 
						|
	val = *((volatile unsigned char *)(ioBase + port)); eieio();
 | 
						|
	return(val);
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT unsigned short
 | 
						|
inw(IOADDRESS port)
 | 
						|
{
 | 
						|
	unsigned short val;
 | 
						|
 | 
						|
	val = ldw_brx(ioBase, port); eieio();
 | 
						|
	return(val);
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT unsigned int
 | 
						|
inl(IOADDRESS port)
 | 
						|
{
 | 
						|
	unsigned int val;
 | 
						|
 | 
						|
	val = ldl_brx(ioBase, port); eieio();
 | 
						|
	return(val);
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT unsigned long 
 | 
						|
ldl_u(void *p)
 | 
						|
{
 | 
						|
	return (((*(unsigned char *)(p)) |
 | 
						|
	 	 (*((unsigned char *)(p)+1)<<8)	|
 | 
						|
		 (*((unsigned char *)(p)+2)<<16) |
 | 
						|
		 (*((unsigned char *)(p)+3)<<24)));
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT unsigned long 
 | 
						|
ldq_u(void *p)
 | 
						|
{
 | 
						|
	return ldl_u(p);
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT unsigned short
 | 
						|
ldw_u(void *p)
 | 
						|
{
 | 
						|
	return(((*(unsigned char *)(p)) |
 | 
						|
	       (*((unsigned char *)(p)+1)<<8)));
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT void
 | 
						|
stl_u(unsigned long v, void *p)
 | 
						|
{
 | 
						|
 | 
						|
	(*(unsigned char *)(p)) = (v);
 | 
						|
	(*((unsigned char *)(p)+1)) = ((v) >> 8);
 | 
						|
	(*((unsigned char *)(p)+2)) = ((v) >> 16);
 | 
						|
	(*((unsigned char *)(p)+3)) = ((v) >> 24);
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT void
 | 
						|
stq_u(unsigned long v, void *p)
 | 
						|
{
 | 
						|
	stl_u(v,p);
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT void
 | 
						|
stw_u(unsigned short v, void *p)
 | 
						|
{
 | 
						|
	(*(unsigned char *)(p)) = (v);
 | 
						|
	(*((unsigned char *)(p)+1)) = ((v) >> 8);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
_X_EXPORT void
 | 
						|
mem_barrier(void)
 | 
						|
{
 | 
						|
   __asm__ __volatile__("eieio");
 | 
						|
}
 | 
						|
 | 
						|
_X_EXPORT void
 | 
						|
write_mem_barrier(void)
 | 
						|
{
 | 
						|
   __asm__ __volatile__("eieio");
 | 
						|
}
 | 
						|
 | 
						|
#endif /* NO_INLINE && __powerpc__ */
 |