0001
0002 #ifndef _IO_H
0003 #define _IO_H
0004
0005 #include "types.h"
0006
0007
0008
0009
0010
0011
0012 static inline int in_8(const volatile unsigned char *addr)
0013 {
0014 int ret;
0015
0016 __asm__ __volatile__("lbz%U1%X1 %0,%1; twi 0,%0,0; isync"
0017 : "=r" (ret) : "m" (*addr));
0018 return ret;
0019 }
0020
0021 static inline void out_8(volatile unsigned char *addr, int val)
0022 {
0023 __asm__ __volatile__("stb%U0%X0 %1,%0; sync"
0024 : "=m" (*addr) : "r" (val));
0025 }
0026
0027 static inline unsigned in_le16(const volatile u16 *addr)
0028 {
0029 unsigned ret;
0030
0031 __asm__ __volatile__("lhbrx %0,0,%1; twi 0,%0,0; isync"
0032 : "=r" (ret) : "r" (addr), "m" (*addr));
0033
0034 return ret;
0035 }
0036
0037 static inline unsigned in_be16(const volatile u16 *addr)
0038 {
0039 unsigned ret;
0040
0041 __asm__ __volatile__("lhz%U1%X1 %0,%1; twi 0,%0,0; isync"
0042 : "=r" (ret) : "m" (*addr));
0043 return ret;
0044 }
0045
0046 static inline void out_le16(volatile u16 *addr, int val)
0047 {
0048 __asm__ __volatile__("sthbrx %1,0,%2; sync" : "=m" (*addr)
0049 : "r" (val), "r" (addr));
0050 }
0051
0052 static inline void out_be16(volatile u16 *addr, int val)
0053 {
0054 __asm__ __volatile__("sth%U0%X0 %1,%0; sync"
0055 : "=m" (*addr) : "r" (val));
0056 }
0057
0058 static inline unsigned in_le32(const volatile unsigned *addr)
0059 {
0060 unsigned ret;
0061
0062 __asm__ __volatile__("lwbrx %0,0,%1; twi 0,%0,0; isync"
0063 : "=r" (ret) : "r" (addr), "m" (*addr));
0064 return ret;
0065 }
0066
0067 static inline unsigned in_be32(const volatile unsigned *addr)
0068 {
0069 unsigned ret;
0070
0071 __asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync"
0072 : "=r" (ret) : "m" (*addr));
0073 return ret;
0074 }
0075
0076 static inline void out_le32(volatile unsigned *addr, int val)
0077 {
0078 __asm__ __volatile__("stwbrx %1,0,%2; sync" : "=m" (*addr)
0079 : "r" (val), "r" (addr));
0080 }
0081
0082 static inline void out_be32(volatile unsigned *addr, int val)
0083 {
0084 __asm__ __volatile__("stw%U0%X0 %1,%0; sync"
0085 : "=m" (*addr) : "r" (val));
0086 }
0087
0088 static inline void sync(void)
0089 {
0090 asm volatile("sync" : : : "memory");
0091 }
0092
0093 static inline void eieio(void)
0094 {
0095 asm volatile("eieio" : : : "memory");
0096 }
0097
0098 static inline void barrier(void)
0099 {
0100 asm volatile("" : : : "memory");
0101 }
0102
0103 #endif