1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _IO_H
3*4882a593Smuzhiyun #define _IO_H
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun #include "types.h"
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun /*
8*4882a593Smuzhiyun * Low-level I/O routines.
9*4882a593Smuzhiyun *
10*4882a593Smuzhiyun * Copied from <file:arch/powerpc/include/asm/io.h> (which has no copyright)
11*4882a593Smuzhiyun */
in_8(const volatile unsigned char * addr)12*4882a593Smuzhiyun static inline int in_8(const volatile unsigned char *addr)
13*4882a593Smuzhiyun {
14*4882a593Smuzhiyun int ret;
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun __asm__ __volatile__("lbz%U1%X1 %0,%1; twi 0,%0,0; isync"
17*4882a593Smuzhiyun : "=r" (ret) : "m" (*addr));
18*4882a593Smuzhiyun return ret;
19*4882a593Smuzhiyun }
20*4882a593Smuzhiyun
out_8(volatile unsigned char * addr,int val)21*4882a593Smuzhiyun static inline void out_8(volatile unsigned char *addr, int val)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun __asm__ __volatile__("stb%U0%X0 %1,%0; sync"
24*4882a593Smuzhiyun : "=m" (*addr) : "r" (val));
25*4882a593Smuzhiyun }
26*4882a593Smuzhiyun
in_le16(const volatile u16 * addr)27*4882a593Smuzhiyun static inline unsigned in_le16(const volatile u16 *addr)
28*4882a593Smuzhiyun {
29*4882a593Smuzhiyun unsigned ret;
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun __asm__ __volatile__("lhbrx %0,0,%1; twi 0,%0,0; isync"
32*4882a593Smuzhiyun : "=r" (ret) : "r" (addr), "m" (*addr));
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun return ret;
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun
in_be16(const volatile u16 * addr)37*4882a593Smuzhiyun static inline unsigned in_be16(const volatile u16 *addr)
38*4882a593Smuzhiyun {
39*4882a593Smuzhiyun unsigned ret;
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun __asm__ __volatile__("lhz%U1%X1 %0,%1; twi 0,%0,0; isync"
42*4882a593Smuzhiyun : "=r" (ret) : "m" (*addr));
43*4882a593Smuzhiyun return ret;
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun
out_le16(volatile u16 * addr,int val)46*4882a593Smuzhiyun static inline void out_le16(volatile u16 *addr, int val)
47*4882a593Smuzhiyun {
48*4882a593Smuzhiyun __asm__ __volatile__("sthbrx %1,0,%2; sync" : "=m" (*addr)
49*4882a593Smuzhiyun : "r" (val), "r" (addr));
50*4882a593Smuzhiyun }
51*4882a593Smuzhiyun
out_be16(volatile u16 * addr,int val)52*4882a593Smuzhiyun static inline void out_be16(volatile u16 *addr, int val)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun __asm__ __volatile__("sth%U0%X0 %1,%0; sync"
55*4882a593Smuzhiyun : "=m" (*addr) : "r" (val));
56*4882a593Smuzhiyun }
57*4882a593Smuzhiyun
in_le32(const volatile unsigned * addr)58*4882a593Smuzhiyun static inline unsigned in_le32(const volatile unsigned *addr)
59*4882a593Smuzhiyun {
60*4882a593Smuzhiyun unsigned ret;
61*4882a593Smuzhiyun
62*4882a593Smuzhiyun __asm__ __volatile__("lwbrx %0,0,%1; twi 0,%0,0; isync"
63*4882a593Smuzhiyun : "=r" (ret) : "r" (addr), "m" (*addr));
64*4882a593Smuzhiyun return ret;
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun
in_be32(const volatile unsigned * addr)67*4882a593Smuzhiyun static inline unsigned in_be32(const volatile unsigned *addr)
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun unsigned ret;
70*4882a593Smuzhiyun
71*4882a593Smuzhiyun __asm__ __volatile__("lwz%U1%X1 %0,%1; twi 0,%0,0; isync"
72*4882a593Smuzhiyun : "=r" (ret) : "m" (*addr));
73*4882a593Smuzhiyun return ret;
74*4882a593Smuzhiyun }
75*4882a593Smuzhiyun
out_le32(volatile unsigned * addr,int val)76*4882a593Smuzhiyun static inline void out_le32(volatile unsigned *addr, int val)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun __asm__ __volatile__("stwbrx %1,0,%2; sync" : "=m" (*addr)
79*4882a593Smuzhiyun : "r" (val), "r" (addr));
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun
out_be32(volatile unsigned * addr,int val)82*4882a593Smuzhiyun static inline void out_be32(volatile unsigned *addr, int val)
83*4882a593Smuzhiyun {
84*4882a593Smuzhiyun __asm__ __volatile__("stw%U0%X0 %1,%0; sync"
85*4882a593Smuzhiyun : "=m" (*addr) : "r" (val));
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun
sync(void)88*4882a593Smuzhiyun static inline void sync(void)
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun asm volatile("sync" : : : "memory");
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun
eieio(void)93*4882a593Smuzhiyun static inline void eieio(void)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun asm volatile("eieio" : : : "memory");
96*4882a593Smuzhiyun }
97*4882a593Smuzhiyun
barrier(void)98*4882a593Smuzhiyun static inline void barrier(void)
99*4882a593Smuzhiyun {
100*4882a593Smuzhiyun asm volatile("" : : : "memory");
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun #endif /* _IO_H */
104