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__ */
|