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
25static inline u8
26ioread8(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
36static inline void
37iowrite8(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
51static inline u16
52ioread16(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
62static inline u32
63ioread32(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
73static inline u64
74ioread64(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
84static inline void
85iowrite16(u16 val, volatile void __iomem *addr)
86{
87	wmb();
88	*(volatile uint16_t *)addr = val;
89}
90
91static inline void
92iowrite32(u32 val, volatile void __iomem *addr)
93{
94	wmb();
95	*(volatile uint32_t *)addr = val;
96}
97
98static inline void
99iowrite64(u64 val, volatile void __iomem *addr)
100{
101	wmb();
102	*(volatile uint64_t *)addr = val;
103}
104
105#else
106
107static inline u16
108ioread16(const volatile void __iomem *addr)
109{
110	uint16_t val;
111
112	iobarrier();
113	val = lemtoh16(addr);
114	rmb();
115	return val;
116}
117
118static inline u32
119ioread32(const volatile void __iomem *addr)
120{
121	uint32_t val;
122
123	iobarrier();
124	val = lemtoh32(addr);
125	rmb();
126	return val;
127}
128
129static inline u64
130ioread64(const volatile void __iomem *addr)
131{
132	uint64_t val;
133
134	iobarrier();
135	val = lemtoh64(addr);
136	rmb();
137	return val;
138}
139
140static inline void
141iowrite16(u16 val, volatile void __iomem *addr)
142{
143	wmb();
144	htolem16(addr, val);
145}
146
147static inline void
148iowrite32(u32 val, volatile void __iomem *addr)
149{
150	wmb();
151	htolem32(addr, val);
152}
153
154static inline void
155iowrite64(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
175int	drm_mtrr_add(unsigned long, size_t, int);
176int	drm_mtrr_del(int, unsigned long, size_t, int);
177
178#define DRM_MTRR_WC	MDF_WRITECOMBINE
179
180static inline void *
181IOMEM_ERR_PTR(long error)
182{
183	return (void *) error;
184}
185
186#define MEMREMAP_WB	(1 << 0)
187
188void	*memremap(phys_addr_t, size_t, int);
189void	memunmap(void *);
190
191#endif
192