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