xref: /freebsd/sys/compat/linuxkpi/common/include/linux/io.h (revision 937a05ba81c3d6fc5c9558b98b882fd61fa56e7b)
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*937a05baSJustin Hibbits 
46*937a05baSJustin Hibbits /* rmb and wmb are declared in machine/atomic.h, so should be included first. */
47*937a05baSJustin Hibbits #ifndef __io_br
48*937a05baSJustin Hibbits #define	__io_br()	__compiler_membar()
49*937a05baSJustin Hibbits #endif
50*937a05baSJustin Hibbits 
51*937a05baSJustin Hibbits #ifndef __io_ar
52*937a05baSJustin Hibbits #ifdef rmb
53*937a05baSJustin Hibbits #define	__io_ar()	rmb()
54*937a05baSJustin Hibbits #else
55*937a05baSJustin Hibbits #define	__io_ar()	__compiler_membar()
56*937a05baSJustin Hibbits #endif
57*937a05baSJustin Hibbits #endif
58*937a05baSJustin Hibbits 
59*937a05baSJustin Hibbits #ifndef __io_bw
60*937a05baSJustin Hibbits #ifdef wmb
61*937a05baSJustin Hibbits #define	__io_bw()	wmb()
62*937a05baSJustin Hibbits #else
63*937a05baSJustin Hibbits #define	__io_bw()	__compiler_membar()
64*937a05baSJustin Hibbits #endif
65*937a05baSJustin Hibbits #endif
66*937a05baSJustin Hibbits 
67*937a05baSJustin Hibbits #ifndef __io_aw
68*937a05baSJustin Hibbits #define	__io_aw()	__compiler_membar()
69*937a05baSJustin Hibbits #endif
70*937a05baSJustin Hibbits 
71642909fdSTijl Coosemans /* Access MMIO registers atomically without barriers and byte swapping. */
728d59ecb2SHans Petter Selasky 
73684a5fefSHans Petter Selasky static inline uint8_t
74642909fdSTijl Coosemans __raw_readb(const volatile void *addr)
75684a5fefSHans Petter Selasky {
76642909fdSTijl Coosemans 	return (*(const volatile uint8_t *)addr);
77684a5fefSHans Petter Selasky }
78642909fdSTijl Coosemans #define	__raw_readb(addr)	__raw_readb(addr)
79684a5fefSHans Petter Selasky 
80684a5fefSHans Petter Selasky static inline void
81642909fdSTijl Coosemans __raw_writeb(uint8_t v, volatile void *addr)
82684a5fefSHans Petter Selasky {
83684a5fefSHans Petter Selasky 	*(volatile uint8_t *)addr = v;
84684a5fefSHans Petter Selasky }
85642909fdSTijl Coosemans #define	__raw_writeb(v, addr)	__raw_writeb(v, addr)
86684a5fefSHans Petter Selasky 
87642909fdSTijl Coosemans static inline uint16_t
88642909fdSTijl Coosemans __raw_readw(const volatile void *addr)
89642909fdSTijl Coosemans {
90642909fdSTijl Coosemans 	return (*(const volatile uint16_t *)addr);
91642909fdSTijl Coosemans }
92642909fdSTijl Coosemans #define	__raw_readw(addr)	__raw_readw(addr)
93642909fdSTijl Coosemans 
94684a5fefSHans Petter Selasky static inline void
95642909fdSTijl Coosemans __raw_writew(uint16_t v, volatile void *addr)
96684a5fefSHans Petter Selasky {
97684a5fefSHans Petter Selasky 	*(volatile uint16_t *)addr = v;
98684a5fefSHans Petter Selasky }
99642909fdSTijl Coosemans #define	__raw_writew(v, addr)	__raw_writew(v, addr)
100684a5fefSHans Petter Selasky 
101642909fdSTijl Coosemans static inline uint32_t
102642909fdSTijl Coosemans __raw_readl(const volatile void *addr)
103642909fdSTijl Coosemans {
104642909fdSTijl Coosemans 	return (*(const volatile uint32_t *)addr);
105642909fdSTijl Coosemans }
106642909fdSTijl Coosemans #define	__raw_readl(addr)	__raw_readl(addr)
107642909fdSTijl Coosemans 
108684a5fefSHans Petter Selasky static inline void
109642909fdSTijl Coosemans __raw_writel(uint32_t v, volatile void *addr)
110684a5fefSHans Petter Selasky {
111684a5fefSHans Petter Selasky 	*(volatile uint32_t *)addr = v;
112684a5fefSHans Petter Selasky }
113642909fdSTijl Coosemans #define	__raw_writel(v, addr)	__raw_writel(v, addr)
114684a5fefSHans Petter Selasky 
115642909fdSTijl Coosemans #ifdef __LP64__
116642909fdSTijl Coosemans static inline uint64_t
117642909fdSTijl Coosemans __raw_readq(const volatile void *addr)
1188d59ecb2SHans Petter Selasky {
119642909fdSTijl Coosemans 	return (*(const volatile uint64_t *)addr);
1208d59ecb2SHans Petter Selasky }
121642909fdSTijl Coosemans #define	__raw_readq(addr)	__raw_readq(addr)
122642909fdSTijl Coosemans 
123642909fdSTijl Coosemans static inline void
124642909fdSTijl Coosemans __raw_writeq(uint64_t v, volatile void *addr)
125642909fdSTijl Coosemans {
126642909fdSTijl Coosemans 	*(volatile uint64_t *)addr = v;
127642909fdSTijl Coosemans }
128642909fdSTijl Coosemans #define	__raw_writeq(v, addr)	__raw_writeq(v, addr)
129642909fdSTijl Coosemans #endif
130642909fdSTijl Coosemans 
131642909fdSTijl Coosemans #define	mmiowb()	barrier()
132642909fdSTijl Coosemans 
133642909fdSTijl Coosemans /* Access little-endian MMIO registers atomically with memory barriers. */
1348d59ecb2SHans Petter Selasky 
13586845417SHans Petter Selasky #undef readb
13686845417SHans Petter Selasky static inline uint8_t
13786845417SHans Petter Selasky readb(const volatile void *addr)
13886845417SHans Petter Selasky {
139642909fdSTijl Coosemans 	uint8_t v;
140642909fdSTijl Coosemans 
141*937a05baSJustin Hibbits 	__io_br();
142642909fdSTijl Coosemans 	v = *(const volatile uint8_t *)addr;
143*937a05baSJustin Hibbits 	__io_ar();
144642909fdSTijl Coosemans 	return (v);
14586845417SHans Petter Selasky }
146642909fdSTijl Coosemans #define	readb(addr)		readb(addr)
147642909fdSTijl Coosemans 
148642909fdSTijl Coosemans #undef writeb
149642909fdSTijl Coosemans static inline void
150642909fdSTijl Coosemans writeb(uint8_t v, volatile void *addr)
151642909fdSTijl Coosemans {
152*937a05baSJustin Hibbits 	__io_bw();
153642909fdSTijl Coosemans 	*(volatile uint8_t *)addr = v;
154*937a05baSJustin Hibbits 	__io_aw();
155642909fdSTijl Coosemans }
156642909fdSTijl Coosemans #define	writeb(v, addr)		writeb(v, addr)
15786845417SHans Petter Selasky 
15886845417SHans Petter Selasky #undef readw
15986845417SHans Petter Selasky static inline uint16_t
16086845417SHans Petter Selasky readw(const volatile void *addr)
16186845417SHans Petter Selasky {
162642909fdSTijl Coosemans 	uint16_t v;
163642909fdSTijl Coosemans 
164*937a05baSJustin Hibbits 	__io_br();
165*937a05baSJustin Hibbits 	v = le16toh(__raw_readw(addr));
166*937a05baSJustin Hibbits 	__io_ar();
167642909fdSTijl Coosemans 	return (v);
16886845417SHans Petter Selasky }
169642909fdSTijl Coosemans #define	readw(addr)		readw(addr)
170642909fdSTijl Coosemans 
171642909fdSTijl Coosemans #undef writew
172642909fdSTijl Coosemans static inline void
173642909fdSTijl Coosemans writew(uint16_t v, volatile void *addr)
174642909fdSTijl Coosemans {
175*937a05baSJustin Hibbits 	__io_bw();
176*937a05baSJustin Hibbits 	__raw_writew(htole16(v), addr);
177*937a05baSJustin Hibbits 	__io_aw();
178642909fdSTijl Coosemans }
179642909fdSTijl Coosemans #define	writew(v, addr)		writew(v, addr)
18086845417SHans Petter Selasky 
18186845417SHans Petter Selasky #undef readl
18286845417SHans Petter Selasky static inline uint32_t
18386845417SHans Petter Selasky readl(const volatile void *addr)
18486845417SHans Petter Selasky {
185642909fdSTijl Coosemans 	uint32_t v;
186642909fdSTijl Coosemans 
187*937a05baSJustin Hibbits 	__io_br();
188*937a05baSJustin Hibbits 	v = le32toh(__raw_readl(addr));
189*937a05baSJustin Hibbits 	__io_ar();
190642909fdSTijl Coosemans 	return (v);
19186845417SHans Petter Selasky }
192642909fdSTijl Coosemans #define	readl(addr)		readl(addr)
193642909fdSTijl Coosemans 
194642909fdSTijl Coosemans #undef writel
195642909fdSTijl Coosemans static inline void
196642909fdSTijl Coosemans writel(uint32_t v, volatile void *addr)
197642909fdSTijl Coosemans {
198*937a05baSJustin Hibbits 	__io_bw();
199*937a05baSJustin Hibbits 	__raw_writel(htole32(v), addr);
200*937a05baSJustin Hibbits 	__io_aw();
201642909fdSTijl Coosemans }
202642909fdSTijl Coosemans #define	writel(v, addr)		writel(v, addr)
203642909fdSTijl Coosemans 
204642909fdSTijl Coosemans #undef readq
205642909fdSTijl Coosemans #undef writeq
206642909fdSTijl Coosemans #ifdef __LP64__
207642909fdSTijl Coosemans static inline uint64_t
208642909fdSTijl Coosemans readq(const volatile void *addr)
209642909fdSTijl Coosemans {
210642909fdSTijl Coosemans 	uint64_t v;
211642909fdSTijl Coosemans 
212*937a05baSJustin Hibbits 	__io_br();
213*937a05baSJustin Hibbits 	v = le64toh(__raw_readq(addr));
214*937a05baSJustin Hibbits 	__io_ar();
215642909fdSTijl Coosemans 	return (v);
216642909fdSTijl Coosemans }
217642909fdSTijl Coosemans #define	readq(addr)		readq(addr)
218642909fdSTijl Coosemans 
219642909fdSTijl Coosemans static inline void
220642909fdSTijl Coosemans writeq(uint64_t v, volatile void *addr)
221642909fdSTijl Coosemans {
222*937a05baSJustin Hibbits 	__io_bw();
223*937a05baSJustin Hibbits 	__raw_writeq(htole64(v), addr);
224*937a05baSJustin Hibbits 	__io_aw();
225642909fdSTijl Coosemans }
226642909fdSTijl Coosemans #define	writeq(v, addr)		writeq(v, addr)
227642909fdSTijl Coosemans #endif
228642909fdSTijl Coosemans 
229642909fdSTijl Coosemans /* Access little-endian MMIO registers atomically without memory barriers. */
230642909fdSTijl Coosemans 
231642909fdSTijl Coosemans #undef readb_relaxed
232642909fdSTijl Coosemans static inline uint8_t
233642909fdSTijl Coosemans readb_relaxed(const volatile void *addr)
234642909fdSTijl Coosemans {
235*937a05baSJustin Hibbits 	return (__raw_readb(addr));
236642909fdSTijl Coosemans }
237642909fdSTijl Coosemans #define	readb_relaxed(addr)	readb_relaxed(addr)
238642909fdSTijl Coosemans 
239642909fdSTijl Coosemans #undef writeb_relaxed
240642909fdSTijl Coosemans static inline void
241642909fdSTijl Coosemans writeb_relaxed(uint8_t v, volatile void *addr)
242642909fdSTijl Coosemans {
243*937a05baSJustin Hibbits 	__raw_writeb(v, addr);
244642909fdSTijl Coosemans }
245642909fdSTijl Coosemans #define	writeb_relaxed(v, addr)	writeb_relaxed(v, addr)
246642909fdSTijl Coosemans 
247642909fdSTijl Coosemans #undef readw_relaxed
248642909fdSTijl Coosemans static inline uint16_t
249642909fdSTijl Coosemans readw_relaxed(const volatile void *addr)
250642909fdSTijl Coosemans {
251*937a05baSJustin Hibbits 	return (le16toh(__raw_readw(addr)));
252642909fdSTijl Coosemans }
253642909fdSTijl Coosemans #define	readw_relaxed(addr)	readw_relaxed(addr)
254642909fdSTijl Coosemans 
255642909fdSTijl Coosemans #undef writew_relaxed
256642909fdSTijl Coosemans static inline void
257642909fdSTijl Coosemans writew_relaxed(uint16_t v, volatile void *addr)
258642909fdSTijl Coosemans {
259*937a05baSJustin Hibbits 	__raw_writew(htole16(v), addr);
260642909fdSTijl Coosemans }
261642909fdSTijl Coosemans #define	writew_relaxed(v, addr)	writew_relaxed(v, addr)
262642909fdSTijl Coosemans 
263642909fdSTijl Coosemans #undef readl_relaxed
264642909fdSTijl Coosemans static inline uint32_t
265642909fdSTijl Coosemans readl_relaxed(const volatile void *addr)
266642909fdSTijl Coosemans {
267*937a05baSJustin Hibbits 	return (le32toh(__raw_readl(addr)));
268642909fdSTijl Coosemans }
269642909fdSTijl Coosemans #define	readl_relaxed(addr)	readl_relaxed(addr)
270642909fdSTijl Coosemans 
271642909fdSTijl Coosemans #undef writel_relaxed
272642909fdSTijl Coosemans static inline void
273642909fdSTijl Coosemans writel_relaxed(uint32_t v, volatile void *addr)
274642909fdSTijl Coosemans {
275*937a05baSJustin Hibbits 	__raw_writel(htole32(v), addr);
276642909fdSTijl Coosemans }
277642909fdSTijl Coosemans #define	writel_relaxed(v, addr)	writel_relaxed(v, addr)
278642909fdSTijl Coosemans 
279642909fdSTijl Coosemans #undef readq_relaxed
280642909fdSTijl Coosemans #undef writeq_relaxed
281642909fdSTijl Coosemans #ifdef __LP64__
282642909fdSTijl Coosemans static inline uint64_t
283642909fdSTijl Coosemans readq_relaxed(const volatile void *addr)
284642909fdSTijl Coosemans {
285*937a05baSJustin Hibbits 	return (le64toh(__raw_readq(addr)));
286642909fdSTijl Coosemans }
287642909fdSTijl Coosemans #define	readq_relaxed(addr)	readq_relaxed(addr)
288642909fdSTijl Coosemans 
289642909fdSTijl Coosemans static inline void
290642909fdSTijl Coosemans writeq_relaxed(uint64_t v, volatile void *addr)
291642909fdSTijl Coosemans {
292*937a05baSJustin Hibbits 	__raw_writeq(htole64(v), addr);
293642909fdSTijl Coosemans }
294642909fdSTijl Coosemans #define	writeq_relaxed(v, addr)	writeq_relaxed(v, addr)
295642909fdSTijl Coosemans #endif
296642909fdSTijl Coosemans 
297642909fdSTijl Coosemans /* XXX On Linux ioread and iowrite handle both MMIO and port IO. */
298642909fdSTijl Coosemans 
299642909fdSTijl Coosemans #undef ioread8
300642909fdSTijl Coosemans static inline uint8_t
301642909fdSTijl Coosemans ioread8(const volatile void *addr)
302642909fdSTijl Coosemans {
303642909fdSTijl Coosemans 	return (readb(addr));
304642909fdSTijl Coosemans }
305642909fdSTijl Coosemans #define	ioread8(addr)		ioread8(addr)
306642909fdSTijl Coosemans 
307642909fdSTijl Coosemans #undef ioread16
308642909fdSTijl Coosemans static inline uint16_t
309642909fdSTijl Coosemans ioread16(const volatile void *addr)
310642909fdSTijl Coosemans {
311642909fdSTijl Coosemans 	return (readw(addr));
312642909fdSTijl Coosemans }
313642909fdSTijl Coosemans #define	ioread16(addr)		ioread16(addr)
314642909fdSTijl Coosemans 
315642909fdSTijl Coosemans #undef ioread16be
316642909fdSTijl Coosemans static inline uint16_t
317642909fdSTijl Coosemans ioread16be(const volatile void *addr)
318642909fdSTijl Coosemans {
319*937a05baSJustin Hibbits 	uint16_t v;
320*937a05baSJustin Hibbits 
321*937a05baSJustin Hibbits 	__io_br();
322*937a05baSJustin Hibbits 	v = (be16toh(__raw_readw(addr)));
323*937a05baSJustin Hibbits 	__io_ar();
324*937a05baSJustin Hibbits 
325*937a05baSJustin Hibbits 	return (v);
326642909fdSTijl Coosemans }
327642909fdSTijl Coosemans #define	ioread16be(addr)	ioread16be(addr)
328642909fdSTijl Coosemans 
329642909fdSTijl Coosemans #undef ioread32
330642909fdSTijl Coosemans static inline uint32_t
331642909fdSTijl Coosemans ioread32(const volatile void *addr)
332642909fdSTijl Coosemans {
333642909fdSTijl Coosemans 	return (readl(addr));
334642909fdSTijl Coosemans }
335642909fdSTijl Coosemans #define	ioread32(addr)		ioread32(addr)
336642909fdSTijl Coosemans 
337642909fdSTijl Coosemans #undef ioread32be
338642909fdSTijl Coosemans static inline uint32_t
339642909fdSTijl Coosemans ioread32be(const volatile void *addr)
340642909fdSTijl Coosemans {
341*937a05baSJustin Hibbits 	uint32_t v;
342*937a05baSJustin Hibbits 
343*937a05baSJustin Hibbits 	__io_br();
344*937a05baSJustin Hibbits 	v = (be32toh(__raw_readl(addr)));
345*937a05baSJustin Hibbits 	__io_ar();
346*937a05baSJustin Hibbits 
347*937a05baSJustin Hibbits 	return (v);
348642909fdSTijl Coosemans }
349642909fdSTijl Coosemans #define	ioread32be(addr)	ioread32be(addr)
350642909fdSTijl Coosemans 
351642909fdSTijl Coosemans #undef iowrite8
352642909fdSTijl Coosemans static inline void
353642909fdSTijl Coosemans iowrite8(uint8_t v, volatile void *addr)
354642909fdSTijl Coosemans {
355642909fdSTijl Coosemans 	writeb(v, addr);
356642909fdSTijl Coosemans }
357642909fdSTijl Coosemans #define	iowrite8(v, addr)	iowrite8(v, addr)
358642909fdSTijl Coosemans 
359642909fdSTijl Coosemans #undef iowrite16
360642909fdSTijl Coosemans static inline void
361642909fdSTijl Coosemans iowrite16(uint16_t v, volatile void *addr)
362642909fdSTijl Coosemans {
363642909fdSTijl Coosemans 	writew(v, addr);
364642909fdSTijl Coosemans }
365642909fdSTijl Coosemans #define	iowrite16	iowrite16
366642909fdSTijl Coosemans 
367642909fdSTijl Coosemans #undef iowrite32
368642909fdSTijl Coosemans static inline void
369642909fdSTijl Coosemans iowrite32(uint32_t v, volatile void *addr)
370642909fdSTijl Coosemans {
371642909fdSTijl Coosemans 	writel(v, addr);
372642909fdSTijl Coosemans }
373642909fdSTijl Coosemans #define	iowrite32(v, addr)	iowrite32(v, addr)
374642909fdSTijl Coosemans 
375642909fdSTijl Coosemans #undef iowrite32be
376642909fdSTijl Coosemans static inline void
377642909fdSTijl Coosemans iowrite32be(uint32_t v, volatile void *addr)
378642909fdSTijl Coosemans {
379*937a05baSJustin Hibbits 	__io_bw();
380*937a05baSJustin Hibbits 	__raw_writel(htobe32(v), addr);
381*937a05baSJustin Hibbits 	__io_aw();
382642909fdSTijl Coosemans }
383642909fdSTijl Coosemans #define	iowrite32be(v, addr)	iowrite32be(v, addr)
38486845417SHans Petter Selasky 
38586845417SHans Petter Selasky #if defined(__i386__) || defined(__amd64__)
38694a201beSHans Petter Selasky static inline void
38794a201beSHans Petter Selasky _outb(u_char data, u_int port)
38894a201beSHans Petter Selasky {
38994a201beSHans Petter Selasky 	__asm __volatile("outb %0, %w1" : : "a" (data), "Nd" (port));
39094a201beSHans Petter Selasky }
39194a201beSHans Petter Selasky #endif
39294a201beSHans Petter Selasky 
393ff9be73eSEd Maste #if defined(__i386__) || defined(__amd64__) || defined(__powerpc__) || defined(__aarch64__)
3948d59ecb2SHans Petter Selasky void *_ioremap_attr(vm_paddr_t phys_addr, unsigned long size, int attr);
39586845417SHans Petter Selasky #else
39686845417SHans Petter Selasky #define	_ioremap_attr(...) NULL
39786845417SHans Petter Selasky #endif
39886845417SHans Petter Selasky 
3998d59ecb2SHans Petter Selasky #define	ioremap_nocache(addr, size)					\
4008d59ecb2SHans Petter Selasky     _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE)
4018d59ecb2SHans Petter Selasky #define	ioremap_wc(addr, size)						\
4028d59ecb2SHans Petter Selasky     _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_COMBINING)
403684a5fefSHans Petter Selasky #define	ioremap_wb(addr, size)						\
404684a5fefSHans Petter Selasky     _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_BACK)
405f2dbb750SHans Petter Selasky #define	ioremap_wt(addr, size)						\
406f2dbb750SHans Petter Selasky     _ioremap_attr((addr), (size), VM_MEMATTR_WRITE_THROUGH)
40786845417SHans Petter Selasky #define	ioremap(addr, size)						\
40886845417SHans Petter Selasky     _ioremap_attr((addr), (size), VM_MEMATTR_UNCACHEABLE)
4098d59ecb2SHans Petter Selasky void iounmap(void *addr);
4108d59ecb2SHans Petter Selasky 
4118d59ecb2SHans Petter Selasky #define	memset_io(a, b, c)	memset((a), (b), (c))
4128d59ecb2SHans Petter Selasky #define	memcpy_fromio(a, b, c)	memcpy((a), (b), (c))
4138d59ecb2SHans Petter Selasky #define	memcpy_toio(a, b, c)	memcpy((a), (b), (c))
4148d59ecb2SHans Petter Selasky 
4158d59ecb2SHans Petter Selasky static inline void
41686364964SKevin Lo __iowrite32_copy(void *to, void *from, size_t count)
41786364964SKevin Lo {
41886364964SKevin Lo 	uint32_t *src;
41986364964SKevin Lo 	uint32_t *dst;
42086364964SKevin Lo 	int i;
42186364964SKevin Lo 
42286364964SKevin Lo 	for (i = 0, src = from, dst = to; i < count; i++, src++, dst++)
42386364964SKevin Lo 		__raw_writel(*src, dst);
42486364964SKevin Lo }
42586364964SKevin Lo 
42686364964SKevin Lo static inline void
4278d59ecb2SHans Petter Selasky __iowrite64_copy(void *to, void *from, size_t count)
4288d59ecb2SHans Petter Selasky {
4298d59ecb2SHans Petter Selasky #ifdef __LP64__
4308d59ecb2SHans Petter Selasky 	uint64_t *src;
4318d59ecb2SHans Petter Selasky 	uint64_t *dst;
4328d59ecb2SHans Petter Selasky 	int i;
4338d59ecb2SHans Petter Selasky 
4348d59ecb2SHans Petter Selasky 	for (i = 0, src = from, dst = to; i < count; i++, src++, dst++)
4358d59ecb2SHans Petter Selasky 		__raw_writeq(*src, dst);
4368d59ecb2SHans Petter Selasky #else
43786364964SKevin Lo 	__iowrite32_copy(to, from, count * 2);
4388d59ecb2SHans Petter Selasky #endif
4398d59ecb2SHans Petter Selasky }
4408d59ecb2SHans Petter Selasky 
441684a5fefSHans Petter Selasky enum {
442684a5fefSHans Petter Selasky 	MEMREMAP_WB = 1 << 0,
443684a5fefSHans Petter Selasky 	MEMREMAP_WT = 1 << 1,
444684a5fefSHans Petter Selasky 	MEMREMAP_WC = 1 << 2,
445684a5fefSHans Petter Selasky };
446684a5fefSHans Petter Selasky 
447684a5fefSHans Petter Selasky static inline void *
448684a5fefSHans Petter Selasky memremap(resource_size_t offset, size_t size, unsigned long flags)
449684a5fefSHans Petter Selasky {
450684a5fefSHans Petter Selasky 	void *addr = NULL;
451684a5fefSHans Petter Selasky 
452684a5fefSHans Petter Selasky 	if ((flags & MEMREMAP_WB) &&
453684a5fefSHans Petter Selasky 	    (addr = ioremap_wb(offset, size)) != NULL)
454684a5fefSHans Petter Selasky 		goto done;
455684a5fefSHans Petter Selasky 	if ((flags & MEMREMAP_WT) &&
456f2dbb750SHans Petter Selasky 	    (addr = ioremap_wt(offset, size)) != NULL)
457684a5fefSHans Petter Selasky 		goto done;
458684a5fefSHans Petter Selasky 	if ((flags & MEMREMAP_WC) &&
459684a5fefSHans Petter Selasky 	    (addr = ioremap_wc(offset, size)) != NULL)
460684a5fefSHans Petter Selasky 		goto done;
461684a5fefSHans Petter Selasky done:
462684a5fefSHans Petter Selasky 	return (addr);
463684a5fefSHans Petter Selasky }
464684a5fefSHans Petter Selasky 
465684a5fefSHans Petter Selasky static inline void
466684a5fefSHans Petter Selasky memunmap(void *addr)
467684a5fefSHans Petter Selasky {
468684a5fefSHans Petter Selasky 	/* XXX May need to check if this is RAM */
469684a5fefSHans Petter Selasky 	iounmap(addr);
470684a5fefSHans Petter Selasky }
4718d59ecb2SHans Petter Selasky 
4728d59ecb2SHans Petter Selasky #endif	/* _LINUX_IO_H_ */
473