xref: /kvm-unit-tests/lib/arm64/asm/io.h (revision a0837ab6c95ece72b926aca6c245891088836a51)
1 #ifndef _ASMARM64_IO_H_
2 #define _ASMARM64_IO_H_
3 /*
4  * From Linux arch/arm64/include/asm/io.h
5  * Generic IO read/write.  These perform native-endian accesses.
6  */
7 #include <libcflat.h>
8 #include <asm/barrier.h>
9 #include <asm/page.h>
10 
11 #define __iomem
12 #define __force
13 
14 #define __raw_writeb __raw_writeb
15 static inline void __raw_writeb(u8 val, volatile void __iomem *addr)
16 {
17 	asm volatile("strb %w0, [%1]" : : "r" (val), "r" (addr));
18 }
19 
20 #define __raw_writew __raw_writew
21 static inline void __raw_writew(u16 val, volatile void __iomem *addr)
22 {
23 	asm volatile("strh %w0, [%1]" : : "r" (val), "r" (addr));
24 }
25 
26 #define __raw_writel __raw_writel
27 static inline void __raw_writel(u32 val, volatile void __iomem *addr)
28 {
29 	asm volatile("str %w0, [%1]" : : "r" (val), "r" (addr));
30 }
31 
32 #define __raw_writeq __raw_writeq
33 static inline void __raw_writeq(u64 val, volatile void __iomem *addr)
34 {
35 	asm volatile("str %0, [%1]" : : "r" (val), "r" (addr));
36 }
37 
38 #define __raw_readb __raw_readb
39 static inline u8 __raw_readb(const volatile void __iomem *addr)
40 {
41 	u8 val;
42 	asm volatile("ldrb %w0, [%1]" : "=r" (val) : "r" (addr));
43 	return val;
44 }
45 
46 #define __raw_readw __raw_readw
47 static inline u16 __raw_readw(const volatile void __iomem *addr)
48 {
49 	u16 val;
50 	asm volatile("ldrh %w0, [%1]" : "=r" (val) : "r" (addr));
51 	return val;
52 }
53 
54 #define __raw_readl __raw_readl
55 static inline u32 __raw_readl(const volatile void __iomem *addr)
56 {
57 	u32 val;
58 	asm volatile("ldr %w0, [%1]" : "=r" (val) : "r" (addr));
59 	return val;
60 }
61 
62 #define __raw_readq __raw_readq
63 static inline u64 __raw_readq(const volatile void __iomem *addr)
64 {
65 	u64 val;
66 	asm volatile("ldr %0, [%1]" : "=r" (val) : "r" (addr));
67 	return val;
68 }
69 
70 #define virt_to_phys virt_to_phys
71 static inline phys_addr_t virt_to_phys(const volatile void *x)
72 {
73 	return __virt_to_phys((unsigned long)(x));
74 }
75 
76 #define phys_to_virt phys_to_virt
77 static inline void *phys_to_virt(phys_addr_t x)
78 {
79 	return (void *)__phys_to_virt(x);
80 }
81 
82 #include <asm-generic/io.h>
83 
84 #endif /* _ASMARM64_IO_H_ */
85