xenocara/xserver/hw/xfree86/os-support/lynxos/lynx_noinline.c
2006-11-26 18:13:41 +00:00

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