xref: /kvm-unit-tests/lib/riscv/asm/io.h (revision bd744d46591007f4dbb2ec1b9e05a55a145c8684)
1*bd744d46SAndrew Jones /* SPDX-License-Identifier: GPL-2.0-only */
2*bd744d46SAndrew Jones /*
3*bd744d46SAndrew Jones  * From Linux arch/riscv/include/asm/mmio.h
4*bd744d46SAndrew Jones  */
5*bd744d46SAndrew Jones #ifndef _ASMRISCV_IO_H_
6*bd744d46SAndrew Jones #define _ASMRISCV_IO_H_
7*bd744d46SAndrew Jones #include <libcflat.h>
8*bd744d46SAndrew Jones 
9*bd744d46SAndrew Jones #define __iomem
10*bd744d46SAndrew Jones 
11*bd744d46SAndrew Jones /* Generic IO read/write.  These perform native-endian accesses. */
12*bd744d46SAndrew Jones #define __raw_writeb __raw_writeb
13*bd744d46SAndrew Jones static inline void __raw_writeb(u8 val, volatile void __iomem *addr)
14*bd744d46SAndrew Jones {
15*bd744d46SAndrew Jones 	asm volatile("sb %0, 0(%1)" : : "r" (val), "r" (addr));
16*bd744d46SAndrew Jones }
17*bd744d46SAndrew Jones 
18*bd744d46SAndrew Jones #define __raw_writew __raw_writew
19*bd744d46SAndrew Jones static inline void __raw_writew(u16 val, volatile void __iomem *addr)
20*bd744d46SAndrew Jones {
21*bd744d46SAndrew Jones 	asm volatile("sh %0, 0(%1)" : : "r" (val), "r" (addr));
22*bd744d46SAndrew Jones }
23*bd744d46SAndrew Jones 
24*bd744d46SAndrew Jones #define __raw_writel __raw_writel
25*bd744d46SAndrew Jones static inline void __raw_writel(u32 val, volatile void __iomem *addr)
26*bd744d46SAndrew Jones {
27*bd744d46SAndrew Jones 	asm volatile("sw %0, 0(%1)" : : "r" (val), "r" (addr));
28*bd744d46SAndrew Jones }
29*bd744d46SAndrew Jones 
30*bd744d46SAndrew Jones #ifdef CONFIG_64BIT
31*bd744d46SAndrew Jones #define __raw_writeq __raw_writeq
32*bd744d46SAndrew Jones static inline void __raw_writeq(u64 val, volatile void __iomem *addr)
33*bd744d46SAndrew Jones {
34*bd744d46SAndrew Jones 	asm volatile("sd %0, 0(%1)" : : "r" (val), "r" (addr));
35*bd744d46SAndrew Jones }
36*bd744d46SAndrew Jones #endif
37*bd744d46SAndrew Jones 
38*bd744d46SAndrew Jones #define __raw_readb __raw_readb
39*bd744d46SAndrew Jones static inline u8 __raw_readb(const volatile void __iomem *addr)
40*bd744d46SAndrew Jones {
41*bd744d46SAndrew Jones 	u8 val;
42*bd744d46SAndrew Jones 
43*bd744d46SAndrew Jones 	asm volatile("lb %0, 0(%1)" : "=r" (val) : "r" (addr));
44*bd744d46SAndrew Jones 	return val;
45*bd744d46SAndrew Jones }
46*bd744d46SAndrew Jones 
47*bd744d46SAndrew Jones #define __raw_readw __raw_readw
48*bd744d46SAndrew Jones static inline u16 __raw_readw(const volatile void __iomem *addr)
49*bd744d46SAndrew Jones {
50*bd744d46SAndrew Jones 	u16 val;
51*bd744d46SAndrew Jones 
52*bd744d46SAndrew Jones 	asm volatile("lh %0, 0(%1)" : "=r" (val) : "r" (addr));
53*bd744d46SAndrew Jones 	return val;
54*bd744d46SAndrew Jones }
55*bd744d46SAndrew Jones 
56*bd744d46SAndrew Jones #define __raw_readl __raw_readl
57*bd744d46SAndrew Jones static inline u32 __raw_readl(const volatile void __iomem *addr)
58*bd744d46SAndrew Jones {
59*bd744d46SAndrew Jones 	u32 val;
60*bd744d46SAndrew Jones 
61*bd744d46SAndrew Jones 	asm volatile("lw %0, 0(%1)" : "=r" (val) : "r" (addr));
62*bd744d46SAndrew Jones 	return val;
63*bd744d46SAndrew Jones }
64*bd744d46SAndrew Jones 
65*bd744d46SAndrew Jones #ifdef CONFIG_64BIT
66*bd744d46SAndrew Jones #define __raw_readq __raw_readq
67*bd744d46SAndrew Jones static inline u64 __raw_readq(const volatile void __iomem *addr)
68*bd744d46SAndrew Jones {
69*bd744d46SAndrew Jones 	u64 val;
70*bd744d46SAndrew Jones 
71*bd744d46SAndrew Jones 	asm volatile("ld %0, 0(%1)" : "=r" (val) : "r" (addr));
72*bd744d46SAndrew Jones 	return val;
73*bd744d46SAndrew Jones }
74*bd744d46SAndrew Jones #endif
75*bd744d46SAndrew Jones 
76*bd744d46SAndrew Jones #include <asm-generic/io.h>
77*bd744d46SAndrew Jones 
78*bd744d46SAndrew Jones #endif /* _ASMRISCV_IO_H_ */
79