xref: /freebsd/sys/compat/linuxkpi/common/include/linux/io.h (revision 642909fdfb1f3530ed095a870209ba308f949dcd)
18d59ecb2SHans Petter Selasky /*-
28d59ecb2SHans Petter Selasky  * Copyright (c) 2010 Isilon Systems, Inc.
38d59ecb2SHans Petter Selasky  * Copyright (c) 2010 iX Systems, Inc.
48d59ecb2SHans Petter Selasky  * Copyright (c) 2010 Panasas, Inc.
586845417SHans Petter Selasky  * Copyright (c) 2013-2015 Mellanox Technologies, Ltd.
68d59ecb2SHans Petter Selasky  * All rights reserved.
78d59ecb2SHans Petter Selasky  *
88d59ecb2SHans Petter Selasky  * Redistribution and use in source and binary forms, with or without
98d59ecb2SHans Petter Selasky  * modification, are permitted provided that the following conditions
108d59ecb2SHans Petter Selasky  * are met:
118d59ecb2SHans Petter Selasky  * 1. Redistributions of source code must retain the above copyright
128d59ecb2SHans Petter Selasky  *    notice unmodified, this list of conditions, and the following
138d59ecb2SHans Petter Selasky  *    disclaimer.
148d59ecb2SHans Petter Selasky  * 2. Redistributions in binary form must reproduce the above copyright
158d59ecb2SHans Petter Selasky  *    notice, this list of conditions and the following disclaimer in the
168d59ecb2SHans Petter Selasky  *    documentation and/or other materials provided with the distribution.
178d59ecb2SHans Petter Selasky  *
188d59ecb2SHans Petter Selasky  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
198d59ecb2SHans Petter Selasky  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
208d59ecb2SHans Petter Selasky  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
218d59ecb2SHans Petter Selasky  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
228d59ecb2SHans Petter Selasky  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
238d59ecb2SHans Petter Selasky  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
248d59ecb2SHans Petter Selasky  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
258d59ecb2SHans Petter Selasky  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
268d59ecb2SHans Petter Selasky  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
278d59ecb2SHans Petter Selasky  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
288d59ecb2SHans Petter Selasky  *
298d59ecb2SHans Petter Selasky  * $FreeBSD$
308d59ecb2SHans Petter Selasky  */
318d59ecb2SHans Petter Selasky #ifndef	_LINUX_IO_H_
328d59ecb2SHans Petter Selasky #define	_LINUX_IO_H_
338d59ecb2SHans Petter Selasky 
348d59ecb2SHans Petter Selasky #include <machine/vm.h>
358d59ecb2SHans Petter Selasky #include <sys/endian.h>
368e7baabcSHans Petter Selasky #include <sys/types.h>
378d59ecb2SHans Petter Selasky 
38684a5fefSHans Petter Selasky #include <linux/compiler.h>
39cb564d24SMark Johnston #include <linux/types.h>
40684a5fefSHans Petter Selasky 
418d59ecb2SHans Petter Selasky /*
428d59ecb2SHans Petter Selasky  * XXX This is all x86 specific.  It should be bus space access.
438d59ecb2SHans Petter Selasky  */
448d59ecb2SHans Petter Selasky 
45*642909fdSTijl Coosemans /* Access MMIO registers atomically without barriers and byte swapping. */
468d59ecb2SHans Petter Selasky 
47684a5fefSHans Petter Selasky static inline uint8_t
48*642909fdSTijl Coosemans __raw_readb(const volatile void *addr)
49684a5fefSHans Petter Selasky {
50*642909fdSTijl Coosemans 	return (*(const volatile uint8_t *)addr);
51684a5fefSHans Petter Selasky }
52*642909fdSTijl Coosemans #define	__raw_readb(addr)	__raw_readb(addr)
53684a5fefSHans Petter Selasky 
54684a5fefSHans Petter Selasky static inline void
55*642909fdSTijl Coosemans __raw_writeb(uint8_t v, volatile void *addr)
56684a5fefSHans Petter Selasky {
57684a5fefSHans Petter Selasky 	*(volatile uint8_t *)addr = v;
58684a5fefSHans Petter Selasky }
59*642909fdSTijl Coosemans #define	__raw_writeb(v, addr)	__raw_writeb(v, addr)
60684a5fefSHans Petter Selasky 
61*642909fdSTijl Coosemans static inline uint16_t
62*642909fdSTijl Coosemans __raw_readw(const volatile void *addr)
63*642909fdSTijl Coosemans {
64*642909fdSTijl Coosemans 	return (*(const volatile uint16_t *)addr);
65*642909fdSTijl Coosemans }
66*642909fdSTijl Coosemans #define	__raw_readw(addr)	__raw_readw(addr)
67*642909fdSTijl Coosemans 
68684a5fefSHans Petter Selasky static inline void
69*642909fdSTijl Coosemans __raw_writew(uint16_t v, volatile void *addr)
70684a5fefSHans Petter Selasky {
71684a5fefSHans Petter Selasky 	*(volatile uint16_t *)addr = v;
72684a5fefSHans Petter Selasky }
73*642909fdSTijl Coosemans #define	__raw_writew(v, addr)	__raw_writew(v, addr)
74684a5fefSHans Petter Selasky 
75*642909fdSTijl Coosemans static inline uint32_t
76*642909fdSTijl Coosemans __raw_readl(const volatile void *addr)
77*642909fdSTijl Coosemans {
78*642909fdSTijl Coosemans 	return (*(const volatile uint32_t *)addr);
79*642909fdSTijl Coosemans }
80*642909fdSTijl Coosemans #define	__raw_readl(addr)	__raw_readl(addr)
81*642909fdSTijl Coosemans 
82684a5fefSHans Petter Selasky static inline void
83*642909fdSTijl Coosemans __raw_writel(uint32_t v, volatile void *addr)
84684a5fefSHans Petter Selasky {
85684a5fefSHans Petter Selasky 	*(volatile uint32_t *)addr = v;
86684a5fefSHans Petter Selasky }
87*642909fdSTijl Coosemans #define	__raw_writel(v, addr)	__raw_writel(v, addr)
88684a5fefSHans Petter Selasky 
89*642909fdSTijl Coosemans #ifdef __LP64__
90*642909fdSTijl Coosemans static inline uint64_t
91*642909fdSTijl Coosemans __raw_readq(const volatile void *addr)
928d59ecb2SHans Petter Selasky {
93*642909fdSTijl Coosemans 	return (*(const volatile uint64_t *)addr);
948d59ecb2SHans Petter Selasky }
95*642909fdSTijl Coosemans #define	__raw_readq(addr)	__raw_readq(addr)
96*642909fdSTijl Coosemans 
97*642909fdSTijl Coosemans static inline void
98*642909fdSTijl Coosemans __raw_writeq(uint64_t v, volatile void *addr)
99*642909fdSTijl Coosemans {
100*642909fdSTijl Coosemans 	*(volatile uint64_t *)addr = v;
101*642909fdSTijl Coosemans }
102*642909fdSTijl Coosemans #define	__raw_writeq(v, addr)	__raw_writeq(v, addr)
103*642909fdSTijl Coosemans #endif
104*642909fdSTijl Coosemans 
105*642909fdSTijl Coosemans #define	mmiowb()	barrier()
106*642909fdSTijl Coosemans 
107*642909fdSTijl Coosemans /* Access little-endian MMIO registers atomically with memory barriers. */
1088d59ecb2SHans Petter Selasky 
10986845417SHans Petter Selasky #undef readb
11086845417SHans Petter Selasky static inline uint8_t
11186845417SHans Petter Selasky readb(const volatile void *addr)
11286845417SHans Petter Selasky {
113*642909fdSTijl Coosemans 	uint8_t v;
114*642909fdSTijl Coosemans 
115*642909fdSTijl Coosemans 	__compiler_membar();
116*642909fdSTijl Coosemans 	v = *(const volatile uint8_t *)addr;
117*642909fdSTijl Coosemans 	__compiler_membar();
118*642909fdSTijl Coosemans 	return (v);
11986845417SHans Petter Selasky }
120*642909fdSTijl Coosemans #define	readb(addr)		readb(addr)
121*642909fdSTijl Coosemans 
122*642909fdSTijl Coosemans #undef writeb
123*642909fdSTijl Coosemans static inline void
124*642909fdSTijl Coosemans writeb(uint8_t v, volatile void *addr)
125*642909fdSTijl Coosemans {
126*642909fdSTijl Coosemans 	__compiler_membar();
127*642909fdSTijl Coosemans 	*(volatile uint8_t *)addr = v;
128*642909fdSTijl Coosemans 	__compiler_membar();
129*642909fdSTijl Coosemans }
130*642909fdSTijl Coosemans #define	writeb(v, addr)		writeb(v, addr)
13186845417SHans Petter Selasky 
13286845417SHans Petter Selasky #undef readw
13386845417SHans Petter Selasky static inline uint16_t
13486845417SHans Petter Selasky readw(const volatile void *addr)
13586845417SHans Petter Selasky {
136*642909fdSTijl Coosemans 	uint16_t v;
137*642909fdSTijl Coosemans 
138*642909fdSTijl Coosemans 	__compiler_membar();
139*642909fdSTijl Coosemans 	v = *(const volatile uint16_t *)addr;
140*642909fdSTijl Coosemans 	__compiler_membar();
141*642909fdSTijl Coosemans 	return (v);
14286845417SHans Petter Selasky }
143*642909fdSTijl Coosemans #define	readw(addr)		readw(addr)
144*642909fdSTijl Coosemans 
145*642909fdSTijl Coosemans #undef writew
146*642909fdSTijl Coosemans static inline void
147*642909fdSTijl Coosemans writew(uint16_t v, volatile void *addr)
148*642909fdSTijl Coosemans {
149*642909fdSTijl Coosemans 	__compiler_membar();
150*642909fdSTijl Coosemans 	*(volatile uint16_t *)addr = v;
151*642909fdSTijl Coosemans 	__compiler_membar();
152*642909fdSTijl Coosemans }
153*642909fdSTijl Coosemans #define	writew(v, addr)		writew(v, addr)
15486845417SHans Petter Selasky 
15586845417SHans Petter Selasky #undef readl
15686845417SHans Petter Selasky static inline uint32_t
15786845417SHans Petter Selasky readl(const volatile void *addr)
15886845417SHans Petter Selasky {
159*642909fdSTijl Coosemans 	uint32_t v;
160*642909fdSTijl Coosemans 
161*642909fdSTijl Coosemans 	__compiler_membar();
162*642909fdSTijl Coosemans 	v = *(const volatile uint32_t *)addr;
163*642909fdSTijl Coosemans 	__compiler_membar();
164*642909fdSTijl Coosemans 	return (v);
16586845417SHans Petter Selasky }
166*642909fdSTijl Coosemans #define	readl(addr)		readl(addr)
167*642909fdSTijl Coosemans 
168*642909fdSTijl Coosemans #undef writel
169*642909fdSTijl Coosemans static inline void
170*642909fdSTijl Coosemans writel(uint32_t v, volatile void *addr)
171*642909fdSTijl Coosemans {
172*642909fdSTijl Coosemans 	__compiler_membar();
173*642909fdSTijl Coosemans 	*(volatile uint32_t *)addr = v;
174*642909fdSTijl Coosemans 	__compiler_membar();
175*642909fdSTijl Coosemans }
176*642909fdSTijl Coosemans #define	writel(v, addr)		writel(v, addr)
177*642909fdSTijl Coosemans 
178*642909fdSTijl Coosemans #undef readq
179*642909fdSTijl Coosemans #undef writeq
180*642909fdSTijl Coosemans #ifdef __LP64__
181*642909fdSTijl Coosemans static inline uint64_t
182*642909fdSTijl Coosemans readq(const volatile void *addr)
183*642909fdSTijl Coosemans {
184*642909fdSTijl Coosemans 	uint64_t v;
185*642909fdSTijl Coosemans 
186*642909fdSTijl Coosemans 	__compiler_membar();
187*642909fdSTijl Coosemans 	v = *(const volatile uint64_t *)addr;
188*642909fdSTijl Coosemans 	__compiler_membar();
189*642909fdSTijl Coosemans 	return (v);
190*642909fdSTijl Coosemans }
191*642909fdSTijl Coosemans #define	readq(addr)		readq(addr)
192*642909fdSTijl Coosemans 
193*642909fdSTijl Coosemans static inline void
194*642909fdSTijl Coosemans writeq(uint64_t v, volatile void *addr)
195*642909fdSTijl Coosemans {
196*642909fdSTijl Coosemans 	__compiler_membar();
197*642909fdSTijl Coosemans 	*(volatile uint64_t *)addr = v;
198*642909fdSTijl Coosemans 	__compiler_membar();
199*642909fdSTijl Coosemans }
200*642909fdSTijl Coosemans #define	writeq(v, addr)		writeq(v, addr)
201*642909fdSTijl Coosemans #endif
202*642909fdSTijl Coosemans 
203*642909fdSTijl Coosemans /* Access little-endian MMIO registers atomically without memory barriers. */
204*642909fdSTijl Coosemans 
205*642909fdSTijl Coosemans #undef readb_relaxed
206*642909fdSTijl Coosemans static inline uint8_t
207*642909fdSTijl Coosemans readb_relaxed(const volatile void *addr)
208*642909fdSTijl Coosemans {
209*642909fdSTijl Coosemans 	return (*(const volatile uint8_t *)addr);
210*642909fdSTijl Coosemans }
211*642909fdSTijl Coosemans #define	readb_relaxed(addr)	readb_relaxed(addr)
212*642909fdSTijl Coosemans 
213*642909fdSTijl Coosemans #undef writeb_relaxed
214*642909fdSTijl Coosemans static inline void
215*642909fdSTijl Coosemans writeb_relaxed(uint8_t v, volatile void *addr)
216*642909fdSTijl Coosemans {
217*642909fdSTijl Coosemans 	*(volatile uint8_t *)addr = v;
218*642909fdSTijl Coosemans }
219*642909fdSTijl Coosemans #define	writeb_relaxed(v, addr)	writeb_relaxed(v, addr)
220*642909fdSTijl Coosemans 
221*642909fdSTijl Coosemans #undef readw_relaxed
222*642909fdSTijl Coosemans static inline uint16_t
223*642909fdSTijl Coosemans readw_relaxed(const volatile void *addr)
224*642909fdSTijl Coosemans {
225*642909fdSTijl Coosemans 	return (*(const volatile uint16_t *)addr);
226*642909fdSTijl Coosemans }
227*642909fdSTijl Coosemans #define	readw_relaxed(addr)	readw_relaxed(addr)
228*642909fdSTijl Coosemans 
229*642909fdSTijl Coosemans #undef writew_relaxed
230*642909fdSTijl Coosemans static inline void
231*642909fdSTijl Coosemans writew_relaxed(uint16_t v, volatile void *addr)
232*642909fdSTijl Coosemans {
233*642909fdSTijl Coosemans 	*(volatile uint16_t *)addr = v;
234*642909fdSTijl Coosemans }
235*642909fdSTijl Coosemans #define	writew_relaxed(v, addr)	writew_relaxed(v, addr)
236*642909fdSTijl Coosemans 
237*642909fdSTijl Coosemans #undef readl_relaxed
238*642909fdSTijl Coosemans static inline uint32_t
239*642909fdSTijl Coosemans readl_relaxed(const volatile void *addr)
240*642909fdSTijl Coosemans {
241*642909fdSTijl Coosemans 	return (*(const volatile uint32_t *)addr);
242*642909fdSTijl Coosemans }
243*642909fdSTijl Coosemans #define	readl_relaxed(addr)	readl_relaxed(addr)
244*642909fdSTijl Coosemans 
245*642909fdSTijl Coosemans #undef writel_relaxed
246*642909fdSTijl Coosemans static inline void
247*642909fdSTijl Coosemans writel_relaxed(uint32_t v, volatile void *addr)
248*642909fdSTijl Coosemans {
249*642909fdSTijl Coosemans 	*(volatile uint32_t *)addr = v;
250*642909fdSTijl Coosemans }
251*642909fdSTijl Coosemans #define	writel_relaxed(v, addr)	writel_relaxed(v, addr)
252*642909fdSTijl Coosemans 
253*642909fdSTijl Coosemans #undef readq_relaxed
254*642909fdSTijl Coosemans #undef writeq_relaxed
255*642909fdSTijl Coosemans #ifdef __LP64__
256*642909fdSTijl Coosemans static inline uint64_t
257*642909fdSTijl Coosemans readq_relaxed(const volatile void *addr)
258*642909fdSTijl Coosemans {
259*642909fdSTijl Coosemans 	return (*(const volatile uint64_t *)addr);
260*642909fdSTijl Coosemans }
261*642909fdSTijl Coosemans #define	readq_relaxed(addr)	readq_relaxed(addr)
262*642909fdSTijl Coosemans 
263*642909fdSTijl Coosemans static inline void
264*642909fdSTijl Coosemans writeq_relaxed(uint64_t v, volatile void *addr)
265*642909fdSTijl Coosemans {
266*642909fdSTijl Coosemans 	*(volatile uint64_t *)addr = v;
267*642909fdSTijl Coosemans }
268*642909fdSTijl Coosemans #define	writeq_relaxed(v, addr)	writeq_relaxed(v, addr)
269*642909fdSTijl Coosemans #endif
270*642909fdSTijl Coosemans 
271*642909fdSTijl Coosemans /* XXX On Linux ioread and iowrite handle both MMIO and port IO. */
272*642909fdSTijl Coosemans 
273*642909fdSTijl Coosemans #undef ioread8
274*642909fdSTijl Coosemans static inline uint8_t
275*642909fdSTijl Coosemans ioread8(const volatile void *addr)
276*642909fdSTijl Coosemans {
277*642909fdSTijl Coosemans 	return (readb(addr));
278*642909fdSTijl Coosemans }
279*642909fdSTijl Coosemans #define	ioread8(addr)		ioread8(addr)
280*642909fdSTijl Coosemans 
281*642909fdSTijl Coosemans #undef ioread16
282*642909fdSTijl Coosemans static inline uint16_t
283*642909fdSTijl Coosemans ioread16(const volatile void *addr)
284*642909fdSTijl Coosemans {
285*642909fdSTijl Coosemans 	return (readw(addr));
286*642909fdSTijl Coosemans }
287*642909fdSTijl Coosemans #define	ioread16(addr)		ioread16(addr)
288*642909fdSTijl Coosemans 
289*642909fdSTijl Coosemans #undef ioread16be
290*642909fdSTijl Coosemans static inline uint16_t
291*642909fdSTijl Coosemans ioread16be(const volatile void *addr)
292*642909fdSTijl Coosemans {
293*642909fdSTijl Coosemans 	return (bswap16(readw(addr)));
294*642909fdSTijl Coosemans }
295*642909fdSTijl Coosemans #define	ioread16be(addr)	ioread16be(addr)
296*642909fdSTijl Coosemans 
297*642909fdSTijl Coosemans #undef ioread32
298*642909fdSTijl Coosemans static inline uint32_t
299*642909fdSTijl Coosemans ioread32(const volatile void *addr)
300*642909fdSTijl Coosemans {
301*642909fdSTijl Coosemans 	return (readl(addr));
302*642909fdSTijl Coosemans }
303*642909fdSTijl Coosemans #define	ioread32(addr)		ioread32(addr)
304*642909fdSTijl Coosemans 
305*642909fdSTijl Coosemans #undef ioread32be
306*642909fdSTijl Coosemans static inline uint32_t
307*642909fdSTijl Coosemans ioread32be(const volatile void *addr)
308*642909fdSTijl Coosemans {
309*642909fdSTijl Coosemans 	return (bswap32(readl(addr)));
310*642909fdSTijl Coosemans }
311*642909fdSTijl Coosemans #define	ioread32be(addr)	ioread32be(addr)
312*642909fdSTijl Coosemans 
313*642909fdSTijl Coosemans #undef iowrite8
314*642909fdSTijl Coosemans static inline void
315*642909fdSTijl Coosemans iowrite8(uint8_t v, volatile void *addr)
316*642909fdSTijl Coosemans {
317*642909fdSTijl Coosemans 	writeb(v, addr);
318*642909fdSTijl Coosemans }
319*642909fdSTijl Coosemans #define	iowrite8(v, addr)	iowrite8(v, addr)
320*642909fdSTijl Coosemans 
321*642909fdSTijl Coosemans #undef iowrite16
322*642909fdSTijl Coosemans static inline void
323*642909fdSTijl Coosemans iowrite16(uint16_t v, volatile void *addr)
324*642909fdSTijl Coosemans {
325*642909fdSTijl Coosemans 	writew(v, addr);
326*642909fdSTijl Coosemans }
327*642909fdSTijl Coosemans #define	iowrite16	iowrite16
328*642909fdSTijl Coosemans 
329*642909fdSTijl Coosemans #undef iowrite32
330*642909fdSTijl Coosemans static inline void
331*642909fdSTijl Coosemans iowrite32(uint32_t v, volatile void *addr)
332*642909fdSTijl Coosemans {
333*642909fdSTijl Coosemans 	writel(v, addr);
334*642909fdSTijl Coosemans }
335*642909fdSTijl Coosemans #define	iowrite32(v, addr)	iowrite32(v, addr)
336*642909fdSTijl Coosemans 
337*642909fdSTijl Coosemans #undef iowrite32be
338*642909fdSTijl Coosemans static inline void
339*642909fdSTijl Coosemans iowrite32be(uint32_t v, volatile void *addr)
340*642909fdSTijl Coosemans {
341*642909fdSTijl Coosemans 	writel(bswap32(v), addr);
342*642909fdSTijl Coosemans }
343*642909fdSTijl Coosemans #define	iowrite32be(v, addr)	iowrite32be(v, addr)
34486845417SHans Petter Selasky 
34586845417SHans Petter Selasky #if defined(__i386__) || defined(__amd64__)
34694a201beSHans Petter Selasky static inline void
34794a201beSHans Petter Selasky _outb(u_char data, u_int port)
34894a201beSHans Petter Selasky {
34994a201beSHans Petter Selasky 	__asm __volatile("outb %0, %w1" : : "a" (data), "Nd" (port));
35094a201beSHans Petter Selasky }
35194a201beSHans Petter Selasky #endif
35294a201beSHans Petter Selasky 
353864092bcSJustin Hibbits #if defined(__i386__) || defined(__amd64__) || defined(__powerpc__)
3548d59ecb2SHans Petter Selasky void *_ioremap_attr(vm_paddr_t phys_addr, unsigned long size, int attr);
35586845417SHans Petter Selasky #else
35686845417SHans Petter Selasky #define	_ioremap_attr(...) NULL
35786845417SHans Petter Selasky #endif
35886845417SHans Petter Selasky 
3598d59ecb2SHans Petter Selasky #define	ioremap_nocache(addr, size)					\
3608d59ecb2SHans Petter Selasky     _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE)
3618d59ecb2SHans Petter Selasky #define	ioremap_wc(addr, size)						\
3628d59ecb2SHans Petter Selasky     _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_COMBINING)
363684a5fefSHans Petter Selasky #define	ioremap_wb(addr, size)						\
364684a5fefSHans Petter Selasky     _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_BACK)
365f2dbb750SHans Petter Selasky #define	ioremap_wt(addr, size)						\
366f2dbb750SHans Petter Selasky     _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_THROUGH)
36786845417SHans Petter Selasky #define	ioremap(addr, size)						\
36886845417SHans Petter Selasky     _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE)
3698d59ecb2SHans Petter Selasky void iounmap(void *addr);
3708d59ecb2SHans Petter Selasky 
3718d59ecb2SHans Petter Selasky #define	memset_io(a, b, c)	memset((a), (b), (c))
3728d59ecb2SHans Petter Selasky #define	memcpy_fromio(a, b, c)	memcpy((a), (b), (c))
3738d59ecb2SHans Petter Selasky #define	memcpy_toio(a, b, c)	memcpy((a), (b), (c))
3748d59ecb2SHans Petter Selasky 
3758d59ecb2SHans Petter Selasky static inline void
37686364964SKevin Lo __iowrite32_copy(void *to, void *from, size_t count)
37786364964SKevin Lo {
37886364964SKevin Lo 	uint32_t *src;
37986364964SKevin Lo 	uint32_t *dst;
38086364964SKevin Lo 	int i;
38186364964SKevin Lo 
38286364964SKevin Lo 	for (i = 0, src = from, dst = to; i < count; i++, src++, dst++)
38386364964SKevin Lo 		__raw_writel(*src, dst);
38486364964SKevin Lo }
38586364964SKevin Lo 
38686364964SKevin Lo static inline void
3878d59ecb2SHans Petter Selasky __iowrite64_copy(void *to, void *from, size_t count)
3888d59ecb2SHans Petter Selasky {
3898d59ecb2SHans Petter Selasky #ifdef __LP64__
3908d59ecb2SHans Petter Selasky 	uint64_t *src;
3918d59ecb2SHans Petter Selasky 	uint64_t *dst;
3928d59ecb2SHans Petter Selasky 	int i;
3938d59ecb2SHans Petter Selasky 
3948d59ecb2SHans Petter Selasky 	for (i = 0, src = from, dst = to; i < count; i++, src++, dst++)
3958d59ecb2SHans Petter Selasky 		__raw_writeq(*src, dst);
3968d59ecb2SHans Petter Selasky #else
39786364964SKevin Lo 	__iowrite32_copy(to, from, count * 2);
3988d59ecb2SHans Petter Selasky #endif
3998d59ecb2SHans Petter Selasky }
4008d59ecb2SHans Petter Selasky 
401684a5fefSHans Petter Selasky enum {
402684a5fefSHans Petter Selasky 	MEMREMAP_WB = 1 << 0,
403684a5fefSHans Petter Selasky 	MEMREMAP_WT = 1 << 1,
404684a5fefSHans Petter Selasky 	MEMREMAP_WC = 1 << 2,
405684a5fefSHans Petter Selasky };
406684a5fefSHans Petter Selasky 
407684a5fefSHans Petter Selasky static inline void *
408684a5fefSHans Petter Selasky memremap(resource_size_t offset, size_t size, unsigned long flags)
409684a5fefSHans Petter Selasky {
410684a5fefSHans Petter Selasky 	void *addr = NULL;
411684a5fefSHans Petter Selasky 
412684a5fefSHans Petter Selasky 	if ((flags & MEMREMAP_WB) &&
413684a5fefSHans Petter Selasky 	    (addr = ioremap_wb(offset, size)) != NULL)
414684a5fefSHans Petter Selasky 		goto done;
415684a5fefSHans Petter Selasky 	if ((flags & MEMREMAP_WT) &&
416f2dbb750SHans Petter Selasky 	    (addr = ioremap_wt(offset, size)) != NULL)
417684a5fefSHans Petter Selasky 		goto done;
418684a5fefSHans Petter Selasky 	if ((flags & MEMREMAP_WC) &&
419684a5fefSHans Petter Selasky 	    (addr = ioremap_wc(offset, size)) != NULL)
420684a5fefSHans Petter Selasky 		goto done;
421684a5fefSHans Petter Selasky done:
422684a5fefSHans Petter Selasky 	return (addr);
423684a5fefSHans Petter Selasky }
424684a5fefSHans Petter Selasky 
425684a5fefSHans Petter Selasky static inline void
426684a5fefSHans Petter Selasky memunmap(void *addr)
427684a5fefSHans Petter Selasky {
428684a5fefSHans Petter Selasky 	/* XXX May need to check if this is RAM */
429684a5fefSHans Petter Selasky 	iounmap(addr);
430684a5fefSHans Petter Selasky }
4318d59ecb2SHans Petter Selasky 
4328d59ecb2SHans Petter Selasky #endif	/* _LINUX_IO_H_ */
433