00001
00002
00003
00004
00005
00006
00007 #ifndef _PPC_IO_LIB_H
00008 #define _PPC_IO_LIB_H
00009
00010 #ifdef __cplusplus
00011 extern "C" {
00012 #endif
00013
00014
00015
00016
00017
00018
00019
00020 extern __inline void eieio(void)
00021 {
00022 __asm__ volatile ("eieio ") ;
00023
00024 return ;
00025 }
00026
00027
00028
00029
00030
00031
00032
00033
00034 extern __inline void w32(volatile unsigned int *addr, unsigned int data)
00035 {
00036 *addr = data ;
00037 eieio() ;
00038 return ;
00039 }
00040
00041
00042
00043
00044 extern __inline void w16(volatile unsigned short *addr, unsigned short data)
00045 {
00046 *addr = data ;
00047 eieio() ;
00048 return ;
00049 }
00050
00051
00052
00053
00054 extern __inline void w8(volatile unsigned char *addr, unsigned char data)
00055 {
00056 *addr = data ;
00057 eieio() ;
00058 return ;
00059 }
00060
00061
00062
00063
00064
00065
00066 extern __inline unsigned int rs32(volatile unsigned int *addr)
00067 {
00068 unsigned int tmp ;
00069
00070 __asm__ volatile ("lwbrx %0,0,%1 " : "=rI" (tmp) : "rI" (addr)) ;
00071
00072
00073 return tmp ;
00074 }
00075
00076
00077
00078
00079 extern __inline unsigned short rs16(volatile unsigned short *addr)
00080 {
00081 unsigned int tmp ;
00082
00083 __asm__ volatile ("lhbrx %0,0,%1 " : "=rI" (tmp) : "rI" (addr)) ;
00084
00085
00086 return (unsigned short)tmp ;
00087 }
00088
00089
00090
00091
00092
00093
00094
00095 extern __inline void ws32(volatile unsigned int *addr, unsigned int data)
00096 {
00097 __asm__ volatile ("stwbrx %0,0,%1; eieio " : : "r" (data) , "rI" (addr)) ;
00098
00099 return ;
00100 }
00101
00102
00103
00104
00105 extern __inline void ws16(volatile unsigned short *addr, unsigned short data)
00106 {
00107 __asm__ volatile ("sthbrx %0,0,%1 \n eieio " : : "r" (data) , "rI" (addr)) ;
00108
00109 return ;
00110 }
00111
00112
00113
00114 #ifdef __cplusplus
00115 }
00116 #endif
00117
00118 #endif