xref: /kvm-unit-tests/lib/asm-generic/io.h (revision 3df0ccccd6304ce0cbbad7fd14564e6b2b648ff9)
1*3df0ccccSAndrew Jones #ifndef _ASM_GENERIC_IO_H_
2*3df0ccccSAndrew Jones #define _ASM_GENERIC_IO_H_
3*3df0ccccSAndrew Jones /*
4*3df0ccccSAndrew Jones  * asm-generic/io.h
5*3df0ccccSAndrew Jones  *  adapted from the Linux kernel's include/asm-generic/io.h
6*3df0ccccSAndrew Jones  *  and arch/arm/include/asm/io.h
7*3df0ccccSAndrew Jones  *
8*3df0ccccSAndrew Jones  * Copyright (C) 2014, Red Hat Inc, Andrew Jones <drjones@redhat.com>
9*3df0ccccSAndrew Jones  *
10*3df0ccccSAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
11*3df0ccccSAndrew Jones  */
12*3df0ccccSAndrew Jones #include "libcflat.h"
13*3df0ccccSAndrew Jones 
14*3df0ccccSAndrew Jones #ifndef __raw_readb
15*3df0ccccSAndrew Jones static inline u8 __raw_readb(const volatile void *addr)
16*3df0ccccSAndrew Jones {
17*3df0ccccSAndrew Jones 	return *(const volatile u8 *)addr;
18*3df0ccccSAndrew Jones }
19*3df0ccccSAndrew Jones #endif
20*3df0ccccSAndrew Jones 
21*3df0ccccSAndrew Jones #ifndef __raw_readw
22*3df0ccccSAndrew Jones static inline u16 __raw_readw(const volatile void *addr)
23*3df0ccccSAndrew Jones {
24*3df0ccccSAndrew Jones 	return *(const volatile u16 *)addr;
25*3df0ccccSAndrew Jones }
26*3df0ccccSAndrew Jones #endif
27*3df0ccccSAndrew Jones 
28*3df0ccccSAndrew Jones #ifndef __raw_readl
29*3df0ccccSAndrew Jones static inline u32 __raw_readl(const volatile void *addr)
30*3df0ccccSAndrew Jones {
31*3df0ccccSAndrew Jones 	return *(const volatile u32 *)addr;
32*3df0ccccSAndrew Jones }
33*3df0ccccSAndrew Jones #endif
34*3df0ccccSAndrew Jones 
35*3df0ccccSAndrew Jones #ifndef __raw_readq
36*3df0ccccSAndrew Jones static inline u64 __raw_readq(const volatile void *addr)
37*3df0ccccSAndrew Jones {
38*3df0ccccSAndrew Jones 	assert(sizeof(unsigned long) == sizeof(u64));
39*3df0ccccSAndrew Jones 	return *(const volatile u64 *)addr;
40*3df0ccccSAndrew Jones }
41*3df0ccccSAndrew Jones #endif
42*3df0ccccSAndrew Jones 
43*3df0ccccSAndrew Jones #ifndef __raw_writeb
44*3df0ccccSAndrew Jones static inline void __raw_writeb(u8 b, volatile void *addr)
45*3df0ccccSAndrew Jones {
46*3df0ccccSAndrew Jones 	*(volatile u8 *)addr = b;
47*3df0ccccSAndrew Jones }
48*3df0ccccSAndrew Jones #endif
49*3df0ccccSAndrew Jones 
50*3df0ccccSAndrew Jones #ifndef __raw_writew
51*3df0ccccSAndrew Jones static inline void __raw_writew(u16 b, volatile void *addr)
52*3df0ccccSAndrew Jones {
53*3df0ccccSAndrew Jones 	*(volatile u16 *)addr = b;
54*3df0ccccSAndrew Jones }
55*3df0ccccSAndrew Jones #endif
56*3df0ccccSAndrew Jones 
57*3df0ccccSAndrew Jones #ifndef __raw_writel
58*3df0ccccSAndrew Jones static inline void __raw_writel(u32 b, volatile void *addr)
59*3df0ccccSAndrew Jones {
60*3df0ccccSAndrew Jones 	*(volatile u32 *)addr = b;
61*3df0ccccSAndrew Jones }
62*3df0ccccSAndrew Jones #endif
63*3df0ccccSAndrew Jones 
64*3df0ccccSAndrew Jones #ifndef __raw_writeq
65*3df0ccccSAndrew Jones static inline void __raw_writeq(u64 b, volatile void *addr)
66*3df0ccccSAndrew Jones {
67*3df0ccccSAndrew Jones 	assert(sizeof(unsigned long) == sizeof(u64));
68*3df0ccccSAndrew Jones 	*(volatile u64 *)addr = b;
69*3df0ccccSAndrew Jones }
70*3df0ccccSAndrew Jones #endif
71*3df0ccccSAndrew Jones 
72*3df0ccccSAndrew Jones #ifndef __bswap16
73*3df0ccccSAndrew Jones static inline u16 __bswap16(u16 x)
74*3df0ccccSAndrew Jones {
75*3df0ccccSAndrew Jones 	return ((x >> 8) & 0xff) | ((x & 0xff) << 8);
76*3df0ccccSAndrew Jones }
77*3df0ccccSAndrew Jones #endif
78*3df0ccccSAndrew Jones 
79*3df0ccccSAndrew Jones #ifndef __bswap32
80*3df0ccccSAndrew Jones static inline u32 __bswap32(u32 x)
81*3df0ccccSAndrew Jones {
82*3df0ccccSAndrew Jones 	return ((x & 0xff000000) >> 24) | ((x & 0x00ff0000) >>  8) |
83*3df0ccccSAndrew Jones 	       ((x & 0x0000ff00) <<  8) | ((x & 0x000000ff) << 24);
84*3df0ccccSAndrew Jones }
85*3df0ccccSAndrew Jones #endif
86*3df0ccccSAndrew Jones 
87*3df0ccccSAndrew Jones #ifndef __bswap64
88*3df0ccccSAndrew Jones static inline u64 __bswap64(u64 x)
89*3df0ccccSAndrew Jones {
90*3df0ccccSAndrew Jones 	return ((x & 0x00000000000000ffULL) << 56) |
91*3df0ccccSAndrew Jones 	       ((x & 0x000000000000ff00ULL) << 40) |
92*3df0ccccSAndrew Jones 	       ((x & 0x0000000000ff0000ULL) << 24) |
93*3df0ccccSAndrew Jones 	       ((x & 0x00000000ff000000ULL) <<  8) |
94*3df0ccccSAndrew Jones 	       ((x & 0x000000ff00000000ULL) >>  8) |
95*3df0ccccSAndrew Jones 	       ((x & 0x0000ff0000000000ULL) >> 24) |
96*3df0ccccSAndrew Jones 	       ((x & 0x00ff000000000000ULL) >> 40) |
97*3df0ccccSAndrew Jones 	       ((x & 0xff00000000000000ULL) >> 56);
98*3df0ccccSAndrew Jones }
99*3df0ccccSAndrew Jones #endif
100*3df0ccccSAndrew Jones 
101*3df0ccccSAndrew Jones #ifndef __cpu_is_be
102*3df0ccccSAndrew Jones #define __cpu_is_be() (0)
103*3df0ccccSAndrew Jones #endif
104*3df0ccccSAndrew Jones 
105*3df0ccccSAndrew Jones #define le16_to_cpu(x) \
106*3df0ccccSAndrew Jones 	({ u16 __r = __cpu_is_be() ? __bswap16(x) : (x); __r; })
107*3df0ccccSAndrew Jones #define cpu_to_le16 le16_to_cpu
108*3df0ccccSAndrew Jones 
109*3df0ccccSAndrew Jones #define le32_to_cpu(x) \
110*3df0ccccSAndrew Jones 	({ u32 __r = __cpu_is_be() ? __bswap32(x) : (x); __r; })
111*3df0ccccSAndrew Jones #define cpu_to_le32 le32_to_cpu
112*3df0ccccSAndrew Jones 
113*3df0ccccSAndrew Jones #define le64_to_cpu(x) \
114*3df0ccccSAndrew Jones 	({ u64 __r = __cpu_is_be() ? __bswap64(x) : (x); __r; })
115*3df0ccccSAndrew Jones #define cpu_to_le64 le64_to_cpu
116*3df0ccccSAndrew Jones 
117*3df0ccccSAndrew Jones #define be16_to_cpu(x) \
118*3df0ccccSAndrew Jones 	({ u16 __r = !__cpu_is_be() ? __bswap16(x) : (x); __r; })
119*3df0ccccSAndrew Jones #define cpu_to_be16 be16_to_cpu
120*3df0ccccSAndrew Jones 
121*3df0ccccSAndrew Jones #define be32_to_cpu(x) \
122*3df0ccccSAndrew Jones 	({ u32 __r = !__cpu_is_be() ? __bswap32(x) : (x); __r; })
123*3df0ccccSAndrew Jones #define cpu_to_be32 be32_to_cpu
124*3df0ccccSAndrew Jones 
125*3df0ccccSAndrew Jones #define be64_to_cpu(x) \
126*3df0ccccSAndrew Jones 	({ u64 __r = !__cpu_is_be() ? __bswap64(x) : (x); __r; })
127*3df0ccccSAndrew Jones #define cpu_to_be64 be64_to_cpu
128*3df0ccccSAndrew Jones 
129*3df0ccccSAndrew Jones #ifndef rmb
130*3df0ccccSAndrew Jones #define rmb() do { } while (0)
131*3df0ccccSAndrew Jones #endif
132*3df0ccccSAndrew Jones #ifndef wmb
133*3df0ccccSAndrew Jones #define wmb() do { } while (0)
134*3df0ccccSAndrew Jones #endif
135*3df0ccccSAndrew Jones 
136*3df0ccccSAndrew Jones #define readb(addr) \
137*3df0ccccSAndrew Jones 	({ u8 __r = __raw_readb(addr); rmb(); __r; })
138*3df0ccccSAndrew Jones #define readw(addr) \
139*3df0ccccSAndrew Jones 	({ u16 __r = le16_to_cpu(__raw_readw(addr)); rmb(); __r; })
140*3df0ccccSAndrew Jones #define readl(addr) \
141*3df0ccccSAndrew Jones 	({ u32 __r = le32_to_cpu(__raw_readl(addr)); rmb(); __r; })
142*3df0ccccSAndrew Jones #define readq(addr) \
143*3df0ccccSAndrew Jones 	({ u64 __r = le64_to_cpu(__raw_readq(addr)); rmb(); __r; })
144*3df0ccccSAndrew Jones 
145*3df0ccccSAndrew Jones #define writeb(b, addr) \
146*3df0ccccSAndrew Jones 	({ wmb(); __raw_writeb(b, addr); })
147*3df0ccccSAndrew Jones #define writew(b, addr) \
148*3df0ccccSAndrew Jones 	({ wmb(); __raw_writew(cpu_to_le16(b), addr); })
149*3df0ccccSAndrew Jones #define writel(b, addr) \
150*3df0ccccSAndrew Jones 	({ wmb(); __raw_writel(cpu_to_le32(b), addr); })
151*3df0ccccSAndrew Jones #define writeq(b, addr) \
152*3df0ccccSAndrew Jones 	({ wmb(); __raw_writeq(cpu_to_le64(b), addr); })
153*3df0ccccSAndrew Jones 
154*3df0ccccSAndrew Jones #ifndef ioremap
155*3df0ccccSAndrew Jones static inline void *ioremap(u64 phys_addr, size_t size __unused)
156*3df0ccccSAndrew Jones {
157*3df0ccccSAndrew Jones 	assert(sizeof(long) == 8 || !(phys_addr >> 32));
158*3df0ccccSAndrew Jones 	return (void *)(unsigned long)phys_addr;
159*3df0ccccSAndrew Jones }
160*3df0ccccSAndrew Jones #endif
161*3df0ccccSAndrew Jones 
162*3df0ccccSAndrew Jones #endif /* _ASM_GENERIC_IO_H_ */
163