xref: /openbsd/sys/dev/pci/drm/include/linux/io.h (revision 667382c7)
1 /* Public domain. */
2 
3 #ifndef _LINUX_IO_H
4 #define _LINUX_IO_H
5 
6 #include <sys/types.h>
7 #include <sys/systm.h>
8 #include <sys/memrange.h> /* for MDF_WRITECOMBINE */
9 
10 #include <linux/types.h>
11 #include <linux/atomic.h>
12 #include <linux/compiler.h>
13 #include <linux/vmalloc.h> /* via asm/io.h */
14 
15 #define memcpy_toio(d, s, n)	memcpy(d, s, n)
16 #define memcpy_fromio(d, s, n)	memcpy(d, s, n)
17 #define memset_io(d, b, n)	memset(d, b, n)
18 
19 #ifdef __powerpc__
20 #define iobarrier()		mb()
21 #else
22 #define iobarrier()		barrier()
23 #endif
24 
25 static inline u8
ioread8(const volatile void __iomem * addr)26 ioread8(const volatile void __iomem *addr)
27 {
28 	uint8_t val;
29 
30 	iobarrier();
31 	val = *(volatile uint8_t *)addr;
32 	rmb();
33 	return val;
34 }
35 
36 static inline void
iowrite8(u8 val,volatile void __iomem * addr)37 iowrite8(u8 val, volatile void __iomem *addr)
38 {
39 	wmb();
40 	*(volatile uint8_t *)addr = val;
41 }
42 
43 #ifdef __sparc64__
44 
45 /*
46  * On sparc64, bus_space_vaddr(9) returns a virtual address that has
47  * been mapped little-endian, so we should just use the CPU byte
48  * order.
49  */
50 
51 static inline u16
ioread16(const volatile void __iomem * addr)52 ioread16(const volatile void __iomem *addr)
53 {
54 	uint16_t val;
55 
56 	iobarrier();
57 	val = *(volatile uint16_t *)addr;
58 	rmb();
59 	return val;
60 }
61 
62 static inline u32
ioread32(const volatile void __iomem * addr)63 ioread32(const volatile void __iomem *addr)
64 {
65 	uint32_t val;
66 
67 	iobarrier();
68 	val = *(volatile uint32_t *)addr;
69 	rmb();
70 	return val;
71 }
72 
73 static inline u64
ioread64(const volatile void __iomem * addr)74 ioread64(const volatile void __iomem *addr)
75 {
76 	uint64_t val;
77 
78 	iobarrier();
79 	val = *(volatile uint64_t *)addr;
80 	rmb();
81 	return val;
82 }
83 
84 static inline void
iowrite16(u16 val,volatile void __iomem * addr)85 iowrite16(u16 val, volatile void __iomem *addr)
86 {
87 	wmb();
88 	*(volatile uint16_t *)addr = val;
89 }
90 
91 static inline void
iowrite32(u32 val,volatile void __iomem * addr)92 iowrite32(u32 val, volatile void __iomem *addr)
93 {
94 	wmb();
95 	*(volatile uint32_t *)addr = val;
96 }
97 
98 static inline void
iowrite64(u64 val,volatile void __iomem * addr)99 iowrite64(u64 val, volatile void __iomem *addr)
100 {
101 	wmb();
102 	*(volatile uint64_t *)addr = val;
103 }
104 
105 #else
106 
107 static inline u16
ioread16(const volatile void __iomem * addr)108 ioread16(const volatile void __iomem *addr)
109 {
110 	uint16_t val;
111 
112 	iobarrier();
113 	val = lemtoh16(addr);
114 	rmb();
115 	return val;
116 }
117 
118 static inline u32
ioread32(const volatile void __iomem * addr)119 ioread32(const volatile void __iomem *addr)
120 {
121 	uint32_t val;
122 
123 	iobarrier();
124 	val = lemtoh32(addr);
125 	rmb();
126 	return val;
127 }
128 
129 static inline u64
ioread64(const volatile void __iomem * addr)130 ioread64(const volatile void __iomem *addr)
131 {
132 	uint64_t val;
133 
134 	iobarrier();
135 	val = lemtoh64(addr);
136 	rmb();
137 	return val;
138 }
139 
140 static inline void
iowrite16(u16 val,volatile void __iomem * addr)141 iowrite16(u16 val, volatile void __iomem *addr)
142 {
143 	wmb();
144 	htolem16(addr, val);
145 }
146 
147 static inline void
iowrite32(u32 val,volatile void __iomem * addr)148 iowrite32(u32 val, volatile void __iomem *addr)
149 {
150 	wmb();
151 	htolem32(addr, val);
152 }
153 
154 static inline void
iowrite64(u64 val,volatile void __iomem * addr)155 iowrite64(u64 val, volatile void __iomem *addr)
156 {
157 	wmb();
158 	htolem64(addr, val);
159 }
160 
161 #endif
162 
163 #define readb(p) ioread8(p)
164 #define writeb(v, p) iowrite8(v, p)
165 #define readw(p) ioread16(p)
166 #define writew(v, p) iowrite16(v, p)
167 #define readl(p) ioread32(p)
168 #define writel(v, p) iowrite32(v, p)
169 #define readq(p) ioread64(p)
170 #define writeq(v, p) iowrite64(v, p)
171 
172 #define readl_relaxed(p) readl(p)
173 #define writel_relaxed(v, p) writel(v, p)
174 
175 int	drm_mtrr_add(unsigned long, size_t, int);
176 int	drm_mtrr_del(int, unsigned long, size_t, int);
177 
178 #define DRM_MTRR_WC	MDF_WRITECOMBINE
179 
180 static inline void *
IOMEM_ERR_PTR(long error)181 IOMEM_ERR_PTR(long error)
182 {
183 	return (void *) error;
184 }
185 
186 #define MEMREMAP_WB	(1 << 0)
187 
188 void	*memremap(phys_addr_t, size_t, int);
189 void	memunmap(void *);
190 
191 #endif
192