Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #ifndef _IO_H
0003 #define _IO_H
0004 
0005 #include "types.h"
0006 
0007 /*
0008  * Low-level I/O routines.
0009  *
0010  * Copied from <file:arch/powerpc/include/asm/io.h> (which has no copyright)
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 /* _IO_H */