xref: /linux/include/asm-generic/io.h (revision 690da22d)
1b4d0d230SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
2739d875dSDavid Howells /* Generic I/O port emulation.
33f7e212dSArnd Bergmann  *
43f7e212dSArnd Bergmann  * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
53f7e212dSArnd Bergmann  * Written by David Howells (dhowells@redhat.com)
63f7e212dSArnd Bergmann  */
73f7e212dSArnd Bergmann #ifndef __ASM_GENERIC_IO_H
83f7e212dSArnd Bergmann #define __ASM_GENERIC_IO_H
93f7e212dSArnd Bergmann 
103f7e212dSArnd Bergmann #include <asm/page.h> /* I/O is all done through memory accesses */
119216efafSThierry Reding #include <linux/string.h> /* for memset() and memcpy() */
12*0069455bSKent Overstreet #include <linux/sizes.h>
133f7e212dSArnd Bergmann #include <linux/types.h>
1421003197SSai Prakash Ranjan #include <linux/instruction_pointer.h>
153f7e212dSArnd Bergmann 
163f7e212dSArnd Bergmann #ifdef CONFIG_GENERIC_IOMAP
173f7e212dSArnd Bergmann #include <asm-generic/iomap.h>
183f7e212dSArnd Bergmann #endif
193f7e212dSArnd Bergmann 
2060ca1e5aSWill Deacon #include <asm/mmiowb.h>
2166eab4dfSMichael S. Tsirkin #include <asm-generic/pci_iomap.h>
2266eab4dfSMichael S. Tsirkin 
2364e2c673SSinan Kaya #ifndef __io_br
2464e2c673SSinan Kaya #define __io_br()      barrier()
2564e2c673SSinan Kaya #endif
2664e2c673SSinan Kaya 
2764e2c673SSinan Kaya /* prevent prefetching of coherent DMA data ahead of a dma-complete */
2864e2c673SSinan Kaya #ifndef __io_ar
2964e2c673SSinan Kaya #ifdef rmb
30abbbbc83SWill Deacon #define __io_ar(v)      rmb()
3164e2c673SSinan Kaya #else
32abbbbc83SWill Deacon #define __io_ar(v)      barrier()
3364e2c673SSinan Kaya #endif
3464e2c673SSinan Kaya #endif
3564e2c673SSinan Kaya 
3664e2c673SSinan Kaya /* flush writes to coherent DMA data before possibly triggering a DMA read */
3764e2c673SSinan Kaya #ifndef __io_bw
3864e2c673SSinan Kaya #ifdef wmb
3964e2c673SSinan Kaya #define __io_bw()      wmb()
4064e2c673SSinan Kaya #else
4164e2c673SSinan Kaya #define __io_bw()      barrier()
4264e2c673SSinan Kaya #endif
4364e2c673SSinan Kaya #endif
4464e2c673SSinan Kaya 
4564e2c673SSinan Kaya /* serialize device access against a spin_unlock, usually handled there. */
4664e2c673SSinan Kaya #ifndef __io_aw
4760ca1e5aSWill Deacon #define __io_aw()      mmiowb_set_pending()
4864e2c673SSinan Kaya #endif
4964e2c673SSinan Kaya 
5064e2c673SSinan Kaya #ifndef __io_pbw
5164e2c673SSinan Kaya #define __io_pbw()     __io_bw()
5264e2c673SSinan Kaya #endif
5364e2c673SSinan Kaya 
5464e2c673SSinan Kaya #ifndef __io_paw
5564e2c673SSinan Kaya #define __io_paw()     __io_aw()
5664e2c673SSinan Kaya #endif
5764e2c673SSinan Kaya 
5864e2c673SSinan Kaya #ifndef __io_pbr
5964e2c673SSinan Kaya #define __io_pbr()     __io_br()
6064e2c673SSinan Kaya #endif
6164e2c673SSinan Kaya 
6264e2c673SSinan Kaya #ifndef __io_par
63abbbbc83SWill Deacon #define __io_par(v)     __io_ar(v)
6464e2c673SSinan Kaya #endif
6564e2c673SSinan Kaya 
6621003197SSai Prakash Ranjan /*
6721003197SSai Prakash Ranjan  * "__DISABLE_TRACE_MMIO__" flag can be used to disable MMIO tracing for
6821003197SSai Prakash Ranjan  * specific kernel drivers in case of excessive/unwanted logging.
6921003197SSai Prakash Ranjan  *
7021003197SSai Prakash Ranjan  * Usage: Add a #define flag at the beginning of the driver file.
7121003197SSai Prakash Ranjan  * Ex: #define __DISABLE_TRACE_MMIO__
7221003197SSai Prakash Ranjan  *     #include <...>
7321003197SSai Prakash Ranjan  *     ...
7421003197SSai Prakash Ranjan  */
7521003197SSai Prakash Ranjan #if IS_ENABLED(CONFIG_TRACE_MMIO_ACCESS) && !(defined(__DISABLE_TRACE_MMIO__))
7621003197SSai Prakash Ranjan #include <linux/tracepoint-defs.h>
7721003197SSai Prakash Ranjan 
7821003197SSai Prakash Ranjan DECLARE_TRACEPOINT(rwmmio_write);
7921003197SSai Prakash Ranjan DECLARE_TRACEPOINT(rwmmio_post_write);
8021003197SSai Prakash Ranjan DECLARE_TRACEPOINT(rwmmio_read);
8121003197SSai Prakash Ranjan DECLARE_TRACEPOINT(rwmmio_post_read);
8221003197SSai Prakash Ranjan 
8321003197SSai Prakash Ranjan void log_write_mmio(u64 val, u8 width, volatile void __iomem *addr,
845e5ff73cSSai Prakash Ranjan 		    unsigned long caller_addr, unsigned long caller_addr0);
8521003197SSai Prakash Ranjan void log_post_write_mmio(u64 val, u8 width, volatile void __iomem *addr,
865e5ff73cSSai Prakash Ranjan 			 unsigned long caller_addr, unsigned long caller_addr0);
8721003197SSai Prakash Ranjan void log_read_mmio(u8 width, const volatile void __iomem *addr,
885e5ff73cSSai Prakash Ranjan 		   unsigned long caller_addr, unsigned long caller_addr0);
8921003197SSai Prakash Ranjan void log_post_read_mmio(u64 val, u8 width, const volatile void __iomem *addr,
905e5ff73cSSai Prakash Ranjan 			unsigned long caller_addr, unsigned long caller_addr0);
9121003197SSai Prakash Ranjan 
9221003197SSai Prakash Ranjan #else
9321003197SSai Prakash Ranjan 
log_write_mmio(u64 val,u8 width,volatile void __iomem * addr,unsigned long caller_addr,unsigned long caller_addr0)9421003197SSai Prakash Ranjan static inline void log_write_mmio(u64 val, u8 width, volatile void __iomem *addr,
955e5ff73cSSai Prakash Ranjan 				  unsigned long caller_addr, unsigned long caller_addr0) {}
log_post_write_mmio(u64 val,u8 width,volatile void __iomem * addr,unsigned long caller_addr,unsigned long caller_addr0)9621003197SSai Prakash Ranjan static inline void log_post_write_mmio(u64 val, u8 width, volatile void __iomem *addr,
975e5ff73cSSai Prakash Ranjan 				       unsigned long caller_addr, unsigned long caller_addr0) {}
log_read_mmio(u8 width,const volatile void __iomem * addr,unsigned long caller_addr,unsigned long caller_addr0)9821003197SSai Prakash Ranjan static inline void log_read_mmio(u8 width, const volatile void __iomem *addr,
995e5ff73cSSai Prakash Ranjan 				 unsigned long caller_addr, unsigned long caller_addr0) {}
log_post_read_mmio(u64 val,u8 width,const volatile void __iomem * addr,unsigned long caller_addr,unsigned long caller_addr0)10021003197SSai Prakash Ranjan static inline void log_post_read_mmio(u64 val, u8 width, const volatile void __iomem *addr,
1015e5ff73cSSai Prakash Ranjan 				      unsigned long caller_addr, unsigned long caller_addr0) {}
10221003197SSai Prakash Ranjan 
10321003197SSai Prakash Ranjan #endif /* CONFIG_TRACE_MMIO_ACCESS */
10464e2c673SSinan Kaya 
1053f7e212dSArnd Bergmann /*
1069216efafSThierry Reding  * __raw_{read,write}{b,w,l,q}() access memory in native endianness.
1079216efafSThierry Reding  *
1089216efafSThierry Reding  * On some architectures memory mapped IO needs to be accessed differently.
1099216efafSThierry Reding  * On the simple architectures, we just read/write the memory location
1109216efafSThierry Reding  * directly.
1113f7e212dSArnd Bergmann  */
1129216efafSThierry Reding 
11335dbc0e0SMike Frysinger #ifndef __raw_readb
1149216efafSThierry Reding #define __raw_readb __raw_readb
__raw_readb(const volatile void __iomem * addr)1153f7e212dSArnd Bergmann static inline u8 __raw_readb(const volatile void __iomem *addr)
1163f7e212dSArnd Bergmann {
1173f7e212dSArnd Bergmann 	return *(const volatile u8 __force *)addr;
1183f7e212dSArnd Bergmann }
11935dbc0e0SMike Frysinger #endif
1203f7e212dSArnd Bergmann 
12135dbc0e0SMike Frysinger #ifndef __raw_readw
1229216efafSThierry Reding #define __raw_readw __raw_readw
__raw_readw(const volatile void __iomem * addr)1233f7e212dSArnd Bergmann static inline u16 __raw_readw(const volatile void __iomem *addr)
1243f7e212dSArnd Bergmann {
1253f7e212dSArnd Bergmann 	return *(const volatile u16 __force *)addr;
1263f7e212dSArnd Bergmann }
12735dbc0e0SMike Frysinger #endif
1283f7e212dSArnd Bergmann 
12935dbc0e0SMike Frysinger #ifndef __raw_readl
1309216efafSThierry Reding #define __raw_readl __raw_readl
__raw_readl(const volatile void __iomem * addr)1313f7e212dSArnd Bergmann static inline u32 __raw_readl(const volatile void __iomem *addr)
1323f7e212dSArnd Bergmann {
1333f7e212dSArnd Bergmann 	return *(const volatile u32 __force *)addr;
1343f7e212dSArnd Bergmann }
13535dbc0e0SMike Frysinger #endif
1363f7e212dSArnd Bergmann 
1373f7e212dSArnd Bergmann #ifdef CONFIG_64BIT
138cd248341SJan Glauber #ifndef __raw_readq
1399216efafSThierry Reding #define __raw_readq __raw_readq
__raw_readq(const volatile void __iomem * addr)1403f7e212dSArnd Bergmann static inline u64 __raw_readq(const volatile void __iomem *addr)
1413f7e212dSArnd Bergmann {
1423f7e212dSArnd Bergmann 	return *(const volatile u64 __force *)addr;
1433f7e212dSArnd Bergmann }
144cd248341SJan Glauber #endif
1459216efafSThierry Reding #endif /* CONFIG_64BIT */
146cd248341SJan Glauber 
1479216efafSThierry Reding #ifndef __raw_writeb
1489216efafSThierry Reding #define __raw_writeb __raw_writeb
__raw_writeb(u8 value,volatile void __iomem * addr)1499216efafSThierry Reding static inline void __raw_writeb(u8 value, volatile void __iomem *addr)
1509216efafSThierry Reding {
1519216efafSThierry Reding 	*(volatile u8 __force *)addr = value;
1529216efafSThierry Reding }
1539216efafSThierry Reding #endif
1549216efafSThierry Reding 
1559216efafSThierry Reding #ifndef __raw_writew
1569216efafSThierry Reding #define __raw_writew __raw_writew
__raw_writew(u16 value,volatile void __iomem * addr)1579216efafSThierry Reding static inline void __raw_writew(u16 value, volatile void __iomem *addr)
1589216efafSThierry Reding {
1599216efafSThierry Reding 	*(volatile u16 __force *)addr = value;
1609216efafSThierry Reding }
1619216efafSThierry Reding #endif
1629216efafSThierry Reding 
1639216efafSThierry Reding #ifndef __raw_writel
1649216efafSThierry Reding #define __raw_writel __raw_writel
__raw_writel(u32 value,volatile void __iomem * addr)1659216efafSThierry Reding static inline void __raw_writel(u32 value, volatile void __iomem *addr)
1669216efafSThierry Reding {
1679216efafSThierry Reding 	*(volatile u32 __force *)addr = value;
1689216efafSThierry Reding }
1699216efafSThierry Reding #endif
1709216efafSThierry Reding 
1719216efafSThierry Reding #ifdef CONFIG_64BIT
1729216efafSThierry Reding #ifndef __raw_writeq
1739216efafSThierry Reding #define __raw_writeq __raw_writeq
__raw_writeq(u64 value,volatile void __iomem * addr)1749216efafSThierry Reding static inline void __raw_writeq(u64 value, volatile void __iomem *addr)
1759216efafSThierry Reding {
1769216efafSThierry Reding 	*(volatile u64 __force *)addr = value;
1779216efafSThierry Reding }
1789216efafSThierry Reding #endif
1799216efafSThierry Reding #endif /* CONFIG_64BIT */
1809216efafSThierry Reding 
1819216efafSThierry Reding /*
1829216efafSThierry Reding  * {read,write}{b,w,l,q}() access little endian memory and return result in
1839216efafSThierry Reding  * native endianness.
1849216efafSThierry Reding  */
1859216efafSThierry Reding 
1869216efafSThierry Reding #ifndef readb
1879216efafSThierry Reding #define readb readb
readb(const volatile void __iomem * addr)1889216efafSThierry Reding static inline u8 readb(const volatile void __iomem *addr)
1899216efafSThierry Reding {
190032d59e1SSinan Kaya 	u8 val;
191032d59e1SSinan Kaya 
1925e5ff73cSSai Prakash Ranjan 	log_read_mmio(8, addr, _THIS_IP_, _RET_IP_);
193032d59e1SSinan Kaya 	__io_br();
194032d59e1SSinan Kaya 	val = __raw_readb(addr);
195abbbbc83SWill Deacon 	__io_ar(val);
1965e5ff73cSSai Prakash Ranjan 	log_post_read_mmio(val, 8, addr, _THIS_IP_, _RET_IP_);
197032d59e1SSinan Kaya 	return val;
1989216efafSThierry Reding }
1999216efafSThierry Reding #endif
2009216efafSThierry Reding 
2019216efafSThierry Reding #ifndef readw
2029216efafSThierry Reding #define readw readw
readw(const volatile void __iomem * addr)2039216efafSThierry Reding static inline u16 readw(const volatile void __iomem *addr)
2049216efafSThierry Reding {
205032d59e1SSinan Kaya 	u16 val;
206032d59e1SSinan Kaya 
2075e5ff73cSSai Prakash Ranjan 	log_read_mmio(16, addr, _THIS_IP_, _RET_IP_);
208032d59e1SSinan Kaya 	__io_br();
209c1d55d50SStafford Horne 	val = __le16_to_cpu((__le16 __force)__raw_readw(addr));
210abbbbc83SWill Deacon 	__io_ar(val);
2115e5ff73cSSai Prakash Ranjan 	log_post_read_mmio(val, 16, addr, _THIS_IP_, _RET_IP_);
212032d59e1SSinan Kaya 	return val;
2139216efafSThierry Reding }
2149216efafSThierry Reding #endif
2159216efafSThierry Reding 
2169216efafSThierry Reding #ifndef readl
2179216efafSThierry Reding #define readl readl
readl(const volatile void __iomem * addr)2189216efafSThierry Reding static inline u32 readl(const volatile void __iomem *addr)
2199216efafSThierry Reding {
220032d59e1SSinan Kaya 	u32 val;
221032d59e1SSinan Kaya 
2225e5ff73cSSai Prakash Ranjan 	log_read_mmio(32, addr, _THIS_IP_, _RET_IP_);
223032d59e1SSinan Kaya 	__io_br();
224c1d55d50SStafford Horne 	val = __le32_to_cpu((__le32 __force)__raw_readl(addr));
225abbbbc83SWill Deacon 	__io_ar(val);
2265e5ff73cSSai Prakash Ranjan 	log_post_read_mmio(val, 32, addr, _THIS_IP_, _RET_IP_);
227032d59e1SSinan Kaya 	return val;
2289216efafSThierry Reding }
2299216efafSThierry Reding #endif
2309216efafSThierry Reding 
2319216efafSThierry Reding #ifdef CONFIG_64BIT
2329216efafSThierry Reding #ifndef readq
2337292e7e0SHeiko Carstens #define readq readq
readq(const volatile void __iomem * addr)2347292e7e0SHeiko Carstens static inline u64 readq(const volatile void __iomem *addr)
2357292e7e0SHeiko Carstens {
236032d59e1SSinan Kaya 	u64 val;
237032d59e1SSinan Kaya 
2385e5ff73cSSai Prakash Ranjan 	log_read_mmio(64, addr, _THIS_IP_, _RET_IP_);
239032d59e1SSinan Kaya 	__io_br();
240d564fa1fSVladimir Oltean 	val = __le64_to_cpu((__le64 __force)__raw_readq(addr));
241abbbbc83SWill Deacon 	__io_ar(val);
2425e5ff73cSSai Prakash Ranjan 	log_post_read_mmio(val, 64, addr, _THIS_IP_, _RET_IP_);
243032d59e1SSinan Kaya 	return val;
2447292e7e0SHeiko Carstens }
2453f7e212dSArnd Bergmann #endif
246cd248341SJan Glauber #endif /* CONFIG_64BIT */
247cd248341SJan Glauber 
2489216efafSThierry Reding #ifndef writeb
2499216efafSThierry Reding #define writeb writeb
writeb(u8 value,volatile void __iomem * addr)2509216efafSThierry Reding static inline void writeb(u8 value, volatile void __iomem *addr)
2519216efafSThierry Reding {
2525e5ff73cSSai Prakash Ranjan 	log_write_mmio(value, 8, addr, _THIS_IP_, _RET_IP_);
253755bd04aSSinan Kaya 	__io_bw();
2549216efafSThierry Reding 	__raw_writeb(value, addr);
255755bd04aSSinan Kaya 	__io_aw();
2565e5ff73cSSai Prakash Ranjan 	log_post_write_mmio(value, 8, addr, _THIS_IP_, _RET_IP_);
2579216efafSThierry Reding }
2587dc59bddSGuanXuetao #endif
2597dc59bddSGuanXuetao 
2609216efafSThierry Reding #ifndef writew
2619216efafSThierry Reding #define writew writew
writew(u16 value,volatile void __iomem * addr)2629216efafSThierry Reding static inline void writew(u16 value, volatile void __iomem *addr)
2633f7e212dSArnd Bergmann {
2645e5ff73cSSai Prakash Ranjan 	log_write_mmio(value, 16, addr, _THIS_IP_, _RET_IP_);
265755bd04aSSinan Kaya 	__io_bw();
266c1d55d50SStafford Horne 	__raw_writew((u16 __force)cpu_to_le16(value), addr);
267755bd04aSSinan Kaya 	__io_aw();
2685e5ff73cSSai Prakash Ranjan 	log_post_write_mmio(value, 16, addr, _THIS_IP_, _RET_IP_);
2693f7e212dSArnd Bergmann }
2709216efafSThierry Reding #endif
2713f7e212dSArnd Bergmann 
2729216efafSThierry Reding #ifndef writel
2739216efafSThierry Reding #define writel writel
writel(u32 value,volatile void __iomem * addr)2749216efafSThierry Reding static inline void writel(u32 value, volatile void __iomem *addr)
2753f7e212dSArnd Bergmann {
2765e5ff73cSSai Prakash Ranjan 	log_write_mmio(value, 32, addr, _THIS_IP_, _RET_IP_);
277755bd04aSSinan Kaya 	__io_bw();
278c1d55d50SStafford Horne 	__raw_writel((u32 __force)__cpu_to_le32(value), addr);
279755bd04aSSinan Kaya 	__io_aw();
2805e5ff73cSSai Prakash Ranjan 	log_post_write_mmio(value, 32, addr, _THIS_IP_, _RET_IP_);
2813f7e212dSArnd Bergmann }
2829216efafSThierry Reding #endif
2833f7e212dSArnd Bergmann 
2849216efafSThierry Reding #ifdef CONFIG_64BIT
2859216efafSThierry Reding #ifndef writeq
2869216efafSThierry Reding #define writeq writeq
writeq(u64 value,volatile void __iomem * addr)2879216efafSThierry Reding static inline void writeq(u64 value, volatile void __iomem *addr)
2883f7e212dSArnd Bergmann {
2895e5ff73cSSai Prakash Ranjan 	log_write_mmio(value, 64, addr, _THIS_IP_, _RET_IP_);
290755bd04aSSinan Kaya 	__io_bw();
291d564fa1fSVladimir Oltean 	__raw_writeq((u64 __force)__cpu_to_le64(value), addr);
292755bd04aSSinan Kaya 	__io_aw();
2935e5ff73cSSai Prakash Ranjan 	log_post_write_mmio(value, 64, addr, _THIS_IP_, _RET_IP_);
2943f7e212dSArnd Bergmann }
2959216efafSThierry Reding #endif
2969216efafSThierry Reding #endif /* CONFIG_64BIT */
2973f7e212dSArnd Bergmann 
2989ab3a7a0SThierry Reding /*
2991c8d2969SArnd Bergmann  * {read,write}{b,w,l,q}_relaxed() are like the regular version, but
3001c8d2969SArnd Bergmann  * are not guaranteed to provide ordering against spinlocks or memory
3011c8d2969SArnd Bergmann  * accesses.
3021c8d2969SArnd Bergmann  */
3031c8d2969SArnd Bergmann #ifndef readb_relaxed
3048875c554SSinan Kaya #define readb_relaxed readb_relaxed
readb_relaxed(const volatile void __iomem * addr)3058875c554SSinan Kaya static inline u8 readb_relaxed(const volatile void __iomem *addr)
3068875c554SSinan Kaya {
30721003197SSai Prakash Ranjan 	u8 val;
30821003197SSai Prakash Ranjan 
3095e5ff73cSSai Prakash Ranjan 	log_read_mmio(8, addr, _THIS_IP_, _RET_IP_);
31021003197SSai Prakash Ranjan 	val = __raw_readb(addr);
3115e5ff73cSSai Prakash Ranjan 	log_post_read_mmio(val, 8, addr, _THIS_IP_, _RET_IP_);
31221003197SSai Prakash Ranjan 	return val;
3138875c554SSinan Kaya }
3141c8d2969SArnd Bergmann #endif
3151c8d2969SArnd Bergmann 
3161c8d2969SArnd Bergmann #ifndef readw_relaxed
3178875c554SSinan Kaya #define readw_relaxed readw_relaxed
readw_relaxed(const volatile void __iomem * addr)3188875c554SSinan Kaya static inline u16 readw_relaxed(const volatile void __iomem *addr)
3198875c554SSinan Kaya {
32021003197SSai Prakash Ranjan 	u16 val;
32121003197SSai Prakash Ranjan 
3225e5ff73cSSai Prakash Ranjan 	log_read_mmio(16, addr, _THIS_IP_, _RET_IP_);
32305d3855bSVladimir Oltean 	val = __le16_to_cpu((__le16 __force)__raw_readw(addr));
3245e5ff73cSSai Prakash Ranjan 	log_post_read_mmio(val, 16, addr, _THIS_IP_, _RET_IP_);
32521003197SSai Prakash Ranjan 	return val;
3268875c554SSinan Kaya }
3271c8d2969SArnd Bergmann #endif
3281c8d2969SArnd Bergmann 
3291c8d2969SArnd Bergmann #ifndef readl_relaxed
3308875c554SSinan Kaya #define readl_relaxed readl_relaxed
readl_relaxed(const volatile void __iomem * addr)3318875c554SSinan Kaya static inline u32 readl_relaxed(const volatile void __iomem *addr)
3328875c554SSinan Kaya {
33321003197SSai Prakash Ranjan 	u32 val;
33421003197SSai Prakash Ranjan 
3355e5ff73cSSai Prakash Ranjan 	log_read_mmio(32, addr, _THIS_IP_, _RET_IP_);
33605d3855bSVladimir Oltean 	val = __le32_to_cpu((__le32 __force)__raw_readl(addr));
3375e5ff73cSSai Prakash Ranjan 	log_post_read_mmio(val, 32, addr, _THIS_IP_, _RET_IP_);
33821003197SSai Prakash Ranjan 	return val;
3398875c554SSinan Kaya }
3401c8d2969SArnd Bergmann #endif
3411c8d2969SArnd Bergmann 
342e511267bSRobin Murphy #if defined(readq) && !defined(readq_relaxed)
3438875c554SSinan Kaya #define readq_relaxed readq_relaxed
readq_relaxed(const volatile void __iomem * addr)3448875c554SSinan Kaya static inline u64 readq_relaxed(const volatile void __iomem *addr)
3458875c554SSinan Kaya {
34621003197SSai Prakash Ranjan 	u64 val;
34721003197SSai Prakash Ranjan 
3485e5ff73cSSai Prakash Ranjan 	log_read_mmio(64, addr, _THIS_IP_, _RET_IP_);
34905d3855bSVladimir Oltean 	val = __le64_to_cpu((__le64 __force)__raw_readq(addr));
3505e5ff73cSSai Prakash Ranjan 	log_post_read_mmio(val, 64, addr, _THIS_IP_, _RET_IP_);
35121003197SSai Prakash Ranjan 	return val;
3528875c554SSinan Kaya }
3539439eb3aSWill Deacon #endif
3543f7e212dSArnd Bergmann 
3551c8d2969SArnd Bergmann #ifndef writeb_relaxed
356a71e7c44SSinan Kaya #define writeb_relaxed writeb_relaxed
writeb_relaxed(u8 value,volatile void __iomem * addr)357a71e7c44SSinan Kaya static inline void writeb_relaxed(u8 value, volatile void __iomem *addr)
358a71e7c44SSinan Kaya {
3595e5ff73cSSai Prakash Ranjan 	log_write_mmio(value, 8, addr, _THIS_IP_, _RET_IP_);
360a71e7c44SSinan Kaya 	__raw_writeb(value, addr);
3615e5ff73cSSai Prakash Ranjan 	log_post_write_mmio(value, 8, addr, _THIS_IP_, _RET_IP_);
362a71e7c44SSinan Kaya }
3631c8d2969SArnd Bergmann #endif
3641c8d2969SArnd Bergmann 
3651c8d2969SArnd Bergmann #ifndef writew_relaxed
366a71e7c44SSinan Kaya #define writew_relaxed writew_relaxed
writew_relaxed(u16 value,volatile void __iomem * addr)367a71e7c44SSinan Kaya static inline void writew_relaxed(u16 value, volatile void __iomem *addr)
368a71e7c44SSinan Kaya {
3695e5ff73cSSai Prakash Ranjan 	log_write_mmio(value, 16, addr, _THIS_IP_, _RET_IP_);
37005d3855bSVladimir Oltean 	__raw_writew((u16 __force)cpu_to_le16(value), addr);
3715e5ff73cSSai Prakash Ranjan 	log_post_write_mmio(value, 16, addr, _THIS_IP_, _RET_IP_);
372a71e7c44SSinan Kaya }
3731c8d2969SArnd Bergmann #endif
3741c8d2969SArnd Bergmann 
3751c8d2969SArnd Bergmann #ifndef writel_relaxed
376a71e7c44SSinan Kaya #define writel_relaxed writel_relaxed
writel_relaxed(u32 value,volatile void __iomem * addr)377a71e7c44SSinan Kaya static inline void writel_relaxed(u32 value, volatile void __iomem *addr)
378a71e7c44SSinan Kaya {
3795e5ff73cSSai Prakash Ranjan 	log_write_mmio(value, 32, addr, _THIS_IP_, _RET_IP_);
38005d3855bSVladimir Oltean 	__raw_writel((u32 __force)__cpu_to_le32(value), addr);
3815e5ff73cSSai Prakash Ranjan 	log_post_write_mmio(value, 32, addr, _THIS_IP_, _RET_IP_);
382a71e7c44SSinan Kaya }
3831c8d2969SArnd Bergmann #endif
3841c8d2969SArnd Bergmann 
385e511267bSRobin Murphy #if defined(writeq) && !defined(writeq_relaxed)
386a71e7c44SSinan Kaya #define writeq_relaxed writeq_relaxed
writeq_relaxed(u64 value,volatile void __iomem * addr)387a71e7c44SSinan Kaya static inline void writeq_relaxed(u64 value, volatile void __iomem *addr)
388a71e7c44SSinan Kaya {
3895e5ff73cSSai Prakash Ranjan 	log_write_mmio(value, 64, addr, _THIS_IP_, _RET_IP_);
39005d3855bSVladimir Oltean 	__raw_writeq((u64 __force)__cpu_to_le64(value), addr);
3915e5ff73cSSai Prakash Ranjan 	log_post_write_mmio(value, 64, addr, _THIS_IP_, _RET_IP_);
392a71e7c44SSinan Kaya }
3931c8d2969SArnd Bergmann #endif
3941c8d2969SArnd Bergmann 
3951c8d2969SArnd Bergmann /*
3969ab3a7a0SThierry Reding  * {read,write}s{b,w,l,q}() repeatedly access the same memory address in
3979ab3a7a0SThierry Reding  * native endianness in 8-, 16-, 32- or 64-bit chunks (@count times).
3989ab3a7a0SThierry Reding  */
3999ab3a7a0SThierry Reding #ifndef readsb
4009ab3a7a0SThierry Reding #define readsb readsb
readsb(const volatile void __iomem * addr,void * buffer,unsigned int count)4019ab3a7a0SThierry Reding static inline void readsb(const volatile void __iomem *addr, void *buffer,
4029ab3a7a0SThierry Reding 			  unsigned int count)
4033f7e212dSArnd Bergmann {
4043f7e212dSArnd Bergmann 	if (count) {
4053f7e212dSArnd Bergmann 		u8 *buf = buffer;
4069ab3a7a0SThierry Reding 
4073f7e212dSArnd Bergmann 		do {
4089ab3a7a0SThierry Reding 			u8 x = __raw_readb(addr);
4093f7e212dSArnd Bergmann 			*buf++ = x;
4103f7e212dSArnd Bergmann 		} while (--count);
4113f7e212dSArnd Bergmann 	}
4123f7e212dSArnd Bergmann }
41335dbc0e0SMike Frysinger #endif
4143f7e212dSArnd Bergmann 
4159ab3a7a0SThierry Reding #ifndef readsw
4169ab3a7a0SThierry Reding #define readsw readsw
readsw(const volatile void __iomem * addr,void * buffer,unsigned int count)4179ab3a7a0SThierry Reding static inline void readsw(const volatile void __iomem *addr, void *buffer,
4189ab3a7a0SThierry Reding 			  unsigned int count)
4193f7e212dSArnd Bergmann {
4203f7e212dSArnd Bergmann 	if (count) {
4213f7e212dSArnd Bergmann 		u16 *buf = buffer;
4229ab3a7a0SThierry Reding 
4233f7e212dSArnd Bergmann 		do {
4249ab3a7a0SThierry Reding 			u16 x = __raw_readw(addr);
4253f7e212dSArnd Bergmann 			*buf++ = x;
4263f7e212dSArnd Bergmann 		} while (--count);
4273f7e212dSArnd Bergmann 	}
4283f7e212dSArnd Bergmann }
42935dbc0e0SMike Frysinger #endif
4303f7e212dSArnd Bergmann 
4319ab3a7a0SThierry Reding #ifndef readsl
4329ab3a7a0SThierry Reding #define readsl readsl
readsl(const volatile void __iomem * addr,void * buffer,unsigned int count)4339ab3a7a0SThierry Reding static inline void readsl(const volatile void __iomem *addr, void *buffer,
4349ab3a7a0SThierry Reding 			  unsigned int count)
4353f7e212dSArnd Bergmann {
4363f7e212dSArnd Bergmann 	if (count) {
4373f7e212dSArnd Bergmann 		u32 *buf = buffer;
4389ab3a7a0SThierry Reding 
4393f7e212dSArnd Bergmann 		do {
4409ab3a7a0SThierry Reding 			u32 x = __raw_readl(addr);
4413f7e212dSArnd Bergmann 			*buf++ = x;
4423f7e212dSArnd Bergmann 		} while (--count);
4433f7e212dSArnd Bergmann 	}
4443f7e212dSArnd Bergmann }
44535dbc0e0SMike Frysinger #endif
4463f7e212dSArnd Bergmann 
4479ab3a7a0SThierry Reding #ifdef CONFIG_64BIT
4489ab3a7a0SThierry Reding #ifndef readsq
4499ab3a7a0SThierry Reding #define readsq readsq
readsq(const volatile void __iomem * addr,void * buffer,unsigned int count)4509ab3a7a0SThierry Reding static inline void readsq(const volatile void __iomem *addr, void *buffer,
4519ab3a7a0SThierry Reding 			  unsigned int count)
4529ab3a7a0SThierry Reding {
4539ab3a7a0SThierry Reding 	if (count) {
4549ab3a7a0SThierry Reding 		u64 *buf = buffer;
4559ab3a7a0SThierry Reding 
4569ab3a7a0SThierry Reding 		do {
4579ab3a7a0SThierry Reding 			u64 x = __raw_readq(addr);
4589ab3a7a0SThierry Reding 			*buf++ = x;
4599ab3a7a0SThierry Reding 		} while (--count);
4609ab3a7a0SThierry Reding 	}
4619ab3a7a0SThierry Reding }
4629ab3a7a0SThierry Reding #endif
4639ab3a7a0SThierry Reding #endif /* CONFIG_64BIT */
4649ab3a7a0SThierry Reding 
4659ab3a7a0SThierry Reding #ifndef writesb
4669ab3a7a0SThierry Reding #define writesb writesb
writesb(volatile void __iomem * addr,const void * buffer,unsigned int count)4679ab3a7a0SThierry Reding static inline void writesb(volatile void __iomem *addr, const void *buffer,
4689ab3a7a0SThierry Reding 			   unsigned int count)
4693f7e212dSArnd Bergmann {
4703f7e212dSArnd Bergmann 	if (count) {
4713f7e212dSArnd Bergmann 		const u8 *buf = buffer;
4729ab3a7a0SThierry Reding 
4733f7e212dSArnd Bergmann 		do {
4749ab3a7a0SThierry Reding 			__raw_writeb(*buf++, addr);
4753f7e212dSArnd Bergmann 		} while (--count);
4763f7e212dSArnd Bergmann 	}
4773f7e212dSArnd Bergmann }
47835dbc0e0SMike Frysinger #endif
4793f7e212dSArnd Bergmann 
4809ab3a7a0SThierry Reding #ifndef writesw
4819ab3a7a0SThierry Reding #define writesw writesw
writesw(volatile void __iomem * addr,const void * buffer,unsigned int count)4829ab3a7a0SThierry Reding static inline void writesw(volatile void __iomem *addr, const void *buffer,
4839ab3a7a0SThierry Reding 			   unsigned int count)
4843f7e212dSArnd Bergmann {
4853f7e212dSArnd Bergmann 	if (count) {
4863f7e212dSArnd Bergmann 		const u16 *buf = buffer;
4879ab3a7a0SThierry Reding 
4883f7e212dSArnd Bergmann 		do {
4899ab3a7a0SThierry Reding 			__raw_writew(*buf++, addr);
4903f7e212dSArnd Bergmann 		} while (--count);
4913f7e212dSArnd Bergmann 	}
4923f7e212dSArnd Bergmann }
49335dbc0e0SMike Frysinger #endif
4943f7e212dSArnd Bergmann 
4959ab3a7a0SThierry Reding #ifndef writesl
4969ab3a7a0SThierry Reding #define writesl writesl
writesl(volatile void __iomem * addr,const void * buffer,unsigned int count)4979ab3a7a0SThierry Reding static inline void writesl(volatile void __iomem *addr, const void *buffer,
4989ab3a7a0SThierry Reding 			   unsigned int count)
4993f7e212dSArnd Bergmann {
5003f7e212dSArnd Bergmann 	if (count) {
5013f7e212dSArnd Bergmann 		const u32 *buf = buffer;
5029ab3a7a0SThierry Reding 
5033f7e212dSArnd Bergmann 		do {
5049ab3a7a0SThierry Reding 			__raw_writel(*buf++, addr);
5053f7e212dSArnd Bergmann 		} while (--count);
5063f7e212dSArnd Bergmann 	}
5073f7e212dSArnd Bergmann }
50835dbc0e0SMike Frysinger #endif
5093f7e212dSArnd Bergmann 
5109ab3a7a0SThierry Reding #ifdef CONFIG_64BIT
5119ab3a7a0SThierry Reding #ifndef writesq
5129ab3a7a0SThierry Reding #define writesq writesq
writesq(volatile void __iomem * addr,const void * buffer,unsigned int count)5139ab3a7a0SThierry Reding static inline void writesq(volatile void __iomem *addr, const void *buffer,
5149ab3a7a0SThierry Reding 			   unsigned int count)
5159ab3a7a0SThierry Reding {
5169ab3a7a0SThierry Reding 	if (count) {
5179ab3a7a0SThierry Reding 		const u64 *buf = buffer;
5183f7e212dSArnd Bergmann 
5199ab3a7a0SThierry Reding 		do {
5209ab3a7a0SThierry Reding 			__raw_writeq(*buf++, addr);
5219ab3a7a0SThierry Reding 		} while (--count);
5229ab3a7a0SThierry Reding 	}
5239ab3a7a0SThierry Reding }
5249ab3a7a0SThierry Reding #endif
5259ab3a7a0SThierry Reding #endif /* CONFIG_64BIT */
5263f7e212dSArnd Bergmann 
5279216efafSThierry Reding #ifndef PCI_IOBASE
5289216efafSThierry Reding #define PCI_IOBASE ((void __iomem *)0)
5299216efafSThierry Reding #endif
5309216efafSThierry Reding 
5317dc59bddSGuanXuetao #ifndef IO_SPACE_LIMIT
5327dc59bddSGuanXuetao #define IO_SPACE_LIMIT 0xffff
5337dc59bddSGuanXuetao #endif
5343f7e212dSArnd Bergmann 
5359216efafSThierry Reding /*
5369216efafSThierry Reding  * {in,out}{b,w,l}() access little endian I/O. {in,out}{b,w,l}_p() can be
5379216efafSThierry Reding  * implemented on hardware that needs an additional delay for I/O accesses to
5389216efafSThierry Reding  * take effect.
5399216efafSThierry Reding  */
5409216efafSThierry Reding 
541f009c89dSJohn Garry #if !defined(inb) && !defined(_inb)
542f009c89dSJohn Garry #define _inb _inb
_inb(unsigned long addr)543214ba358SStafford Horne static inline u8 _inb(unsigned long addr)
5449216efafSThierry Reding {
54587fe2d54SSinan Kaya 	u8 val;
54687fe2d54SSinan Kaya 
54787fe2d54SSinan Kaya 	__io_pbr();
54887fe2d54SSinan Kaya 	val = __raw_readb(PCI_IOBASE + addr);
549abbbbc83SWill Deacon 	__io_par(val);
55087fe2d54SSinan Kaya 	return val;
5519216efafSThierry Reding }
5529216efafSThierry Reding #endif
5539216efafSThierry Reding 
554f009c89dSJohn Garry #if !defined(inw) && !defined(_inw)
555f009c89dSJohn Garry #define _inw _inw
_inw(unsigned long addr)556f009c89dSJohn Garry static inline u16 _inw(unsigned long addr)
5579216efafSThierry Reding {
55887fe2d54SSinan Kaya 	u16 val;
55987fe2d54SSinan Kaya 
56087fe2d54SSinan Kaya 	__io_pbr();
561c1d55d50SStafford Horne 	val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
562abbbbc83SWill Deacon 	__io_par(val);
56387fe2d54SSinan Kaya 	return val;
5649216efafSThierry Reding }
5659216efafSThierry Reding #endif
5669216efafSThierry Reding 
567f009c89dSJohn Garry #if !defined(inl) && !defined(_inl)
568f009c89dSJohn Garry #define _inl _inl
_inl(unsigned long addr)569214ba358SStafford Horne static inline u32 _inl(unsigned long addr)
5709216efafSThierry Reding {
57187fe2d54SSinan Kaya 	u32 val;
57287fe2d54SSinan Kaya 
57387fe2d54SSinan Kaya 	__io_pbr();
574c1d55d50SStafford Horne 	val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
575abbbbc83SWill Deacon 	__io_par(val);
57687fe2d54SSinan Kaya 	return val;
5779216efafSThierry Reding }
5789216efafSThierry Reding #endif
5799216efafSThierry Reding 
580f009c89dSJohn Garry #if !defined(outb) && !defined(_outb)
581f009c89dSJohn Garry #define _outb _outb
_outb(u8 value,unsigned long addr)582f009c89dSJohn Garry static inline void _outb(u8 value, unsigned long addr)
5839216efafSThierry Reding {
584a7851aa5SSinan Kaya 	__io_pbw();
585a7851aa5SSinan Kaya 	__raw_writeb(value, PCI_IOBASE + addr);
586a7851aa5SSinan Kaya 	__io_paw();
5879216efafSThierry Reding }
5889216efafSThierry Reding #endif
5899216efafSThierry Reding 
590f009c89dSJohn Garry #if !defined(outw) && !defined(_outw)
591f009c89dSJohn Garry #define _outw _outw
_outw(u16 value,unsigned long addr)592f009c89dSJohn Garry static inline void _outw(u16 value, unsigned long addr)
5939216efafSThierry Reding {
594a7851aa5SSinan Kaya 	__io_pbw();
595c1d55d50SStafford Horne 	__raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
596a7851aa5SSinan Kaya 	__io_paw();
5979216efafSThierry Reding }
5989216efafSThierry Reding #endif
5999216efafSThierry Reding 
600f009c89dSJohn Garry #if !defined(outl) && !defined(_outl)
601f009c89dSJohn Garry #define _outl _outl
_outl(u32 value,unsigned long addr)602f009c89dSJohn Garry static inline void _outl(u32 value, unsigned long addr)
6039216efafSThierry Reding {
604a7851aa5SSinan Kaya 	__io_pbw();
605c1d55d50SStafford Horne 	__raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
606a7851aa5SSinan Kaya 	__io_paw();
6079216efafSThierry Reding }
6089216efafSThierry Reding #endif
6099216efafSThierry Reding 
610f009c89dSJohn Garry #include <linux/logic_pio.h>
611f009c89dSJohn Garry 
612f009c89dSJohn Garry #ifndef inb
613f009c89dSJohn Garry #define inb _inb
614f009c89dSJohn Garry #endif
615f009c89dSJohn Garry 
616f009c89dSJohn Garry #ifndef inw
617f009c89dSJohn Garry #define inw _inw
618f009c89dSJohn Garry #endif
619f009c89dSJohn Garry 
620f009c89dSJohn Garry #ifndef inl
621f009c89dSJohn Garry #define inl _inl
622f009c89dSJohn Garry #endif
623f009c89dSJohn Garry 
624f009c89dSJohn Garry #ifndef outb
625f009c89dSJohn Garry #define outb _outb
626f009c89dSJohn Garry #endif
627f009c89dSJohn Garry 
628f009c89dSJohn Garry #ifndef outw
629f009c89dSJohn Garry #define outw _outw
630f009c89dSJohn Garry #endif
631f009c89dSJohn Garry 
632f009c89dSJohn Garry #ifndef outl
633f009c89dSJohn Garry #define outl _outl
634f009c89dSJohn Garry #endif
635f009c89dSJohn Garry 
6369216efafSThierry Reding #ifndef inb_p
6379216efafSThierry Reding #define inb_p inb_p
inb_p(unsigned long addr)6389216efafSThierry Reding static inline u8 inb_p(unsigned long addr)
6399216efafSThierry Reding {
6409216efafSThierry Reding 	return inb(addr);
6419216efafSThierry Reding }
6429216efafSThierry Reding #endif
6439216efafSThierry Reding 
6449216efafSThierry Reding #ifndef inw_p
6459216efafSThierry Reding #define inw_p inw_p
inw_p(unsigned long addr)6469216efafSThierry Reding static inline u16 inw_p(unsigned long addr)
6479216efafSThierry Reding {
6489216efafSThierry Reding 	return inw(addr);
6499216efafSThierry Reding }
6509216efafSThierry Reding #endif
6519216efafSThierry Reding 
6529216efafSThierry Reding #ifndef inl_p
6539216efafSThierry Reding #define inl_p inl_p
inl_p(unsigned long addr)6549216efafSThierry Reding static inline u32 inl_p(unsigned long addr)
6559216efafSThierry Reding {
6569216efafSThierry Reding 	return inl(addr);
6579216efafSThierry Reding }
6589216efafSThierry Reding #endif
6599216efafSThierry Reding 
6609216efafSThierry Reding #ifndef outb_p
6619216efafSThierry Reding #define outb_p outb_p
outb_p(u8 value,unsigned long addr)6629216efafSThierry Reding static inline void outb_p(u8 value, unsigned long addr)
6639216efafSThierry Reding {
6649216efafSThierry Reding 	outb(value, addr);
6659216efafSThierry Reding }
6669216efafSThierry Reding #endif
6679216efafSThierry Reding 
6689216efafSThierry Reding #ifndef outw_p
6699216efafSThierry Reding #define outw_p outw_p
outw_p(u16 value,unsigned long addr)6709216efafSThierry Reding static inline void outw_p(u16 value, unsigned long addr)
6719216efafSThierry Reding {
6729216efafSThierry Reding 	outw(value, addr);
6739216efafSThierry Reding }
6749216efafSThierry Reding #endif
6759216efafSThierry Reding 
6769216efafSThierry Reding #ifndef outl_p
6779216efafSThierry Reding #define outl_p outl_p
outl_p(u32 value,unsigned long addr)6789216efafSThierry Reding static inline void outl_p(u32 value, unsigned long addr)
6799216efafSThierry Reding {
6809216efafSThierry Reding 	outl(value, addr);
6819216efafSThierry Reding }
6829216efafSThierry Reding #endif
6839216efafSThierry Reding 
6849ab3a7a0SThierry Reding /*
6859ab3a7a0SThierry Reding  * {in,out}s{b,w,l}{,_p}() are variants of the above that repeatedly access a
6869ab3a7a0SThierry Reding  * single I/O port multiple times.
6879ab3a7a0SThierry Reding  */
6889ab3a7a0SThierry Reding 
6899ab3a7a0SThierry Reding #ifndef insb
6909ab3a7a0SThierry Reding #define insb insb
insb(unsigned long addr,void * buffer,unsigned int count)6919ab3a7a0SThierry Reding static inline void insb(unsigned long addr, void *buffer, unsigned int count)
6929ab3a7a0SThierry Reding {
6939ab3a7a0SThierry Reding 	readsb(PCI_IOBASE + addr, buffer, count);
6949ab3a7a0SThierry Reding }
6959ab3a7a0SThierry Reding #endif
6969ab3a7a0SThierry Reding 
6979ab3a7a0SThierry Reding #ifndef insw
6989ab3a7a0SThierry Reding #define insw insw
insw(unsigned long addr,void * buffer,unsigned int count)6999ab3a7a0SThierry Reding static inline void insw(unsigned long addr, void *buffer, unsigned int count)
7009ab3a7a0SThierry Reding {
7019ab3a7a0SThierry Reding 	readsw(PCI_IOBASE + addr, buffer, count);
7029ab3a7a0SThierry Reding }
7039ab3a7a0SThierry Reding #endif
7049ab3a7a0SThierry Reding 
7059ab3a7a0SThierry Reding #ifndef insl
7069ab3a7a0SThierry Reding #define insl insl
insl(unsigned long addr,void * buffer,unsigned int count)7079ab3a7a0SThierry Reding static inline void insl(unsigned long addr, void *buffer, unsigned int count)
7089ab3a7a0SThierry Reding {
7099ab3a7a0SThierry Reding 	readsl(PCI_IOBASE + addr, buffer, count);
7109ab3a7a0SThierry Reding }
7119ab3a7a0SThierry Reding #endif
7129ab3a7a0SThierry Reding 
7139ab3a7a0SThierry Reding #ifndef outsb
7149ab3a7a0SThierry Reding #define outsb outsb
outsb(unsigned long addr,const void * buffer,unsigned int count)7159ab3a7a0SThierry Reding static inline void outsb(unsigned long addr, const void *buffer,
7169ab3a7a0SThierry Reding 			 unsigned int count)
7179ab3a7a0SThierry Reding {
7189ab3a7a0SThierry Reding 	writesb(PCI_IOBASE + addr, buffer, count);
7199ab3a7a0SThierry Reding }
7209ab3a7a0SThierry Reding #endif
7219ab3a7a0SThierry Reding 
7229ab3a7a0SThierry Reding #ifndef outsw
7239ab3a7a0SThierry Reding #define outsw outsw
outsw(unsigned long addr,const void * buffer,unsigned int count)7249ab3a7a0SThierry Reding static inline void outsw(unsigned long addr, const void *buffer,
7259ab3a7a0SThierry Reding 			 unsigned int count)
7269ab3a7a0SThierry Reding {
7279ab3a7a0SThierry Reding 	writesw(PCI_IOBASE + addr, buffer, count);
7289ab3a7a0SThierry Reding }
7299ab3a7a0SThierry Reding #endif
7309ab3a7a0SThierry Reding 
7319ab3a7a0SThierry Reding #ifndef outsl
7329ab3a7a0SThierry Reding #define outsl outsl
outsl(unsigned long addr,const void * buffer,unsigned int count)7339ab3a7a0SThierry Reding static inline void outsl(unsigned long addr, const void *buffer,
7349ab3a7a0SThierry Reding 			 unsigned int count)
7359ab3a7a0SThierry Reding {
7369ab3a7a0SThierry Reding 	writesl(PCI_IOBASE + addr, buffer, count);
7379ab3a7a0SThierry Reding }
7389ab3a7a0SThierry Reding #endif
7399ab3a7a0SThierry Reding 
7409ab3a7a0SThierry Reding #ifndef insb_p
7419ab3a7a0SThierry Reding #define insb_p insb_p
insb_p(unsigned long addr,void * buffer,unsigned int count)7429ab3a7a0SThierry Reding static inline void insb_p(unsigned long addr, void *buffer, unsigned int count)
7439ab3a7a0SThierry Reding {
7449ab3a7a0SThierry Reding 	insb(addr, buffer, count);
7459ab3a7a0SThierry Reding }
7469ab3a7a0SThierry Reding #endif
7479ab3a7a0SThierry Reding 
7489ab3a7a0SThierry Reding #ifndef insw_p
7499ab3a7a0SThierry Reding #define insw_p insw_p
insw_p(unsigned long addr,void * buffer,unsigned int count)7509ab3a7a0SThierry Reding static inline void insw_p(unsigned long addr, void *buffer, unsigned int count)
7519ab3a7a0SThierry Reding {
7529ab3a7a0SThierry Reding 	insw(addr, buffer, count);
7539ab3a7a0SThierry Reding }
7549ab3a7a0SThierry Reding #endif
7559ab3a7a0SThierry Reding 
7569ab3a7a0SThierry Reding #ifndef insl_p
7579ab3a7a0SThierry Reding #define insl_p insl_p
insl_p(unsigned long addr,void * buffer,unsigned int count)7589ab3a7a0SThierry Reding static inline void insl_p(unsigned long addr, void *buffer, unsigned int count)
7599ab3a7a0SThierry Reding {
7609ab3a7a0SThierry Reding 	insl(addr, buffer, count);
7619ab3a7a0SThierry Reding }
7629ab3a7a0SThierry Reding #endif
7639ab3a7a0SThierry Reding 
7649ab3a7a0SThierry Reding #ifndef outsb_p
7659ab3a7a0SThierry Reding #define outsb_p outsb_p
outsb_p(unsigned long addr,const void * buffer,unsigned int count)7669ab3a7a0SThierry Reding static inline void outsb_p(unsigned long addr, const void *buffer,
7679ab3a7a0SThierry Reding 			   unsigned int count)
7689ab3a7a0SThierry Reding {
7699ab3a7a0SThierry Reding 	outsb(addr, buffer, count);
7709ab3a7a0SThierry Reding }
7719ab3a7a0SThierry Reding #endif
7729ab3a7a0SThierry Reding 
7739ab3a7a0SThierry Reding #ifndef outsw_p
7749ab3a7a0SThierry Reding #define outsw_p outsw_p
outsw_p(unsigned long addr,const void * buffer,unsigned int count)7759ab3a7a0SThierry Reding static inline void outsw_p(unsigned long addr, const void *buffer,
7769ab3a7a0SThierry Reding 			   unsigned int count)
7779ab3a7a0SThierry Reding {
7789ab3a7a0SThierry Reding 	outsw(addr, buffer, count);
7799ab3a7a0SThierry Reding }
7809ab3a7a0SThierry Reding #endif
7819ab3a7a0SThierry Reding 
7829ab3a7a0SThierry Reding #ifndef outsl_p
7839ab3a7a0SThierry Reding #define outsl_p outsl_p
outsl_p(unsigned long addr,const void * buffer,unsigned int count)7849ab3a7a0SThierry Reding static inline void outsl_p(unsigned long addr, const void *buffer,
7859ab3a7a0SThierry Reding 			   unsigned int count)
7869ab3a7a0SThierry Reding {
7879ab3a7a0SThierry Reding 	outsl(addr, buffer, count);
7889ab3a7a0SThierry Reding }
7899ab3a7a0SThierry Reding #endif
7909ab3a7a0SThierry Reding 
7919216efafSThierry Reding #ifndef CONFIG_GENERIC_IOMAP
7929216efafSThierry Reding #ifndef ioread8
7939216efafSThierry Reding #define ioread8 ioread8
ioread8(const volatile void __iomem * addr)7949216efafSThierry Reding static inline u8 ioread8(const volatile void __iomem *addr)
7959216efafSThierry Reding {
7969216efafSThierry Reding 	return readb(addr);
7979216efafSThierry Reding }
7989216efafSThierry Reding #endif
7999216efafSThierry Reding 
8009216efafSThierry Reding #ifndef ioread16
8019216efafSThierry Reding #define ioread16 ioread16
ioread16(const volatile void __iomem * addr)8029216efafSThierry Reding static inline u16 ioread16(const volatile void __iomem *addr)
8039216efafSThierry Reding {
8049216efafSThierry Reding 	return readw(addr);
8059216efafSThierry Reding }
8069216efafSThierry Reding #endif
8079216efafSThierry Reding 
8089216efafSThierry Reding #ifndef ioread32
8099216efafSThierry Reding #define ioread32 ioread32
ioread32(const volatile void __iomem * addr)8109216efafSThierry Reding static inline u32 ioread32(const volatile void __iomem *addr)
8119216efafSThierry Reding {
8129216efafSThierry Reding 	return readl(addr);
8139216efafSThierry Reding }
8149216efafSThierry Reding #endif
8159216efafSThierry Reding 
8169e44fb18SHoria Geantă #ifdef CONFIG_64BIT
8179e44fb18SHoria Geantă #ifndef ioread64
8189e44fb18SHoria Geantă #define ioread64 ioread64
ioread64(const volatile void __iomem * addr)8199e44fb18SHoria Geantă static inline u64 ioread64(const volatile void __iomem *addr)
8209e44fb18SHoria Geantă {
8219e44fb18SHoria Geantă 	return readq(addr);
8229e44fb18SHoria Geantă }
8239e44fb18SHoria Geantă #endif
8249e44fb18SHoria Geantă #endif /* CONFIG_64BIT */
8259e44fb18SHoria Geantă 
8269216efafSThierry Reding #ifndef iowrite8
8279216efafSThierry Reding #define iowrite8 iowrite8
iowrite8(u8 value,volatile void __iomem * addr)8289216efafSThierry Reding static inline void iowrite8(u8 value, volatile void __iomem *addr)
8299216efafSThierry Reding {
8309216efafSThierry Reding 	writeb(value, addr);
8319216efafSThierry Reding }
8329216efafSThierry Reding #endif
8339216efafSThierry Reding 
8349216efafSThierry Reding #ifndef iowrite16
8359216efafSThierry Reding #define iowrite16 iowrite16
iowrite16(u16 value,volatile void __iomem * addr)8369216efafSThierry Reding static inline void iowrite16(u16 value, volatile void __iomem *addr)
8379216efafSThierry Reding {
8389216efafSThierry Reding 	writew(value, addr);
8399216efafSThierry Reding }
8409216efafSThierry Reding #endif
8419216efafSThierry Reding 
8429216efafSThierry Reding #ifndef iowrite32
8439216efafSThierry Reding #define iowrite32 iowrite32
iowrite32(u32 value,volatile void __iomem * addr)8449216efafSThierry Reding static inline void iowrite32(u32 value, volatile void __iomem *addr)
8459216efafSThierry Reding {
8469216efafSThierry Reding 	writel(value, addr);
8479216efafSThierry Reding }
8489216efafSThierry Reding #endif
8499216efafSThierry Reding 
8509e44fb18SHoria Geantă #ifdef CONFIG_64BIT
8519e44fb18SHoria Geantă #ifndef iowrite64
8529e44fb18SHoria Geantă #define iowrite64 iowrite64
iowrite64(u64 value,volatile void __iomem * addr)8539e44fb18SHoria Geantă static inline void iowrite64(u64 value, volatile void __iomem *addr)
8549e44fb18SHoria Geantă {
8559e44fb18SHoria Geantă 	writeq(value, addr);
8569e44fb18SHoria Geantă }
8579e44fb18SHoria Geantă #endif
8589e44fb18SHoria Geantă #endif /* CONFIG_64BIT */
8599e44fb18SHoria Geantă 
8609216efafSThierry Reding #ifndef ioread16be
8619216efafSThierry Reding #define ioread16be ioread16be
ioread16be(const volatile void __iomem * addr)8629216efafSThierry Reding static inline u16 ioread16be(const volatile void __iomem *addr)
8639216efafSThierry Reding {
8647a1aedbaSHoria Geantă 	return swab16(readw(addr));
8659216efafSThierry Reding }
8669216efafSThierry Reding #endif
8679216efafSThierry Reding 
8689216efafSThierry Reding #ifndef ioread32be
8699216efafSThierry Reding #define ioread32be ioread32be
ioread32be(const volatile void __iomem * addr)8709216efafSThierry Reding static inline u32 ioread32be(const volatile void __iomem *addr)
8719216efafSThierry Reding {
8727a1aedbaSHoria Geantă 	return swab32(readl(addr));
8739216efafSThierry Reding }
8749216efafSThierry Reding #endif
8759216efafSThierry Reding 
8769e44fb18SHoria Geantă #ifdef CONFIG_64BIT
8779e44fb18SHoria Geantă #ifndef ioread64be
8789e44fb18SHoria Geantă #define ioread64be ioread64be
ioread64be(const volatile void __iomem * addr)8799e44fb18SHoria Geantă static inline u64 ioread64be(const volatile void __iomem *addr)
8809e44fb18SHoria Geantă {
8819e44fb18SHoria Geantă 	return swab64(readq(addr));
8829e44fb18SHoria Geantă }
8839e44fb18SHoria Geantă #endif
8849e44fb18SHoria Geantă #endif /* CONFIG_64BIT */
8859e44fb18SHoria Geantă 
8869216efafSThierry Reding #ifndef iowrite16be
8879216efafSThierry Reding #define iowrite16be iowrite16be
iowrite16be(u16 value,void volatile __iomem * addr)8889216efafSThierry Reding static inline void iowrite16be(u16 value, void volatile __iomem *addr)
8899216efafSThierry Reding {
8907a1aedbaSHoria Geantă 	writew(swab16(value), addr);
8919216efafSThierry Reding }
8929216efafSThierry Reding #endif
8939216efafSThierry Reding 
8949216efafSThierry Reding #ifndef iowrite32be
8959216efafSThierry Reding #define iowrite32be iowrite32be
iowrite32be(u32 value,volatile void __iomem * addr)8969216efafSThierry Reding static inline void iowrite32be(u32 value, volatile void __iomem *addr)
8979216efafSThierry Reding {
8987a1aedbaSHoria Geantă 	writel(swab32(value), addr);
8999216efafSThierry Reding }
9009216efafSThierry Reding #endif
9019ab3a7a0SThierry Reding 
9029e44fb18SHoria Geantă #ifdef CONFIG_64BIT
9039e44fb18SHoria Geantă #ifndef iowrite64be
9049e44fb18SHoria Geantă #define iowrite64be iowrite64be
iowrite64be(u64 value,volatile void __iomem * addr)9059e44fb18SHoria Geantă static inline void iowrite64be(u64 value, volatile void __iomem *addr)
9069e44fb18SHoria Geantă {
9079e44fb18SHoria Geantă 	writeq(swab64(value), addr);
9089e44fb18SHoria Geantă }
9099e44fb18SHoria Geantă #endif
9109e44fb18SHoria Geantă #endif /* CONFIG_64BIT */
9119e44fb18SHoria Geantă 
9129ab3a7a0SThierry Reding #ifndef ioread8_rep
9139ab3a7a0SThierry Reding #define ioread8_rep ioread8_rep
ioread8_rep(const volatile void __iomem * addr,void * buffer,unsigned int count)9149ab3a7a0SThierry Reding static inline void ioread8_rep(const volatile void __iomem *addr, void *buffer,
9159ab3a7a0SThierry Reding 			       unsigned int count)
9169ab3a7a0SThierry Reding {
9179ab3a7a0SThierry Reding 	readsb(addr, buffer, count);
9189ab3a7a0SThierry Reding }
9199ab3a7a0SThierry Reding #endif
9209ab3a7a0SThierry Reding 
9219ab3a7a0SThierry Reding #ifndef ioread16_rep
9229ab3a7a0SThierry Reding #define ioread16_rep ioread16_rep
ioread16_rep(const volatile void __iomem * addr,void * buffer,unsigned int count)9239ab3a7a0SThierry Reding static inline void ioread16_rep(const volatile void __iomem *addr,
9249ab3a7a0SThierry Reding 				void *buffer, unsigned int count)
9259ab3a7a0SThierry Reding {
9269ab3a7a0SThierry Reding 	readsw(addr, buffer, count);
9279ab3a7a0SThierry Reding }
9289ab3a7a0SThierry Reding #endif
9299ab3a7a0SThierry Reding 
9309ab3a7a0SThierry Reding #ifndef ioread32_rep
9319ab3a7a0SThierry Reding #define ioread32_rep ioread32_rep
ioread32_rep(const volatile void __iomem * addr,void * buffer,unsigned int count)9329ab3a7a0SThierry Reding static inline void ioread32_rep(const volatile void __iomem *addr,
9339ab3a7a0SThierry Reding 				void *buffer, unsigned int count)
9349ab3a7a0SThierry Reding {
9359ab3a7a0SThierry Reding 	readsl(addr, buffer, count);
9369ab3a7a0SThierry Reding }
9379ab3a7a0SThierry Reding #endif
9389ab3a7a0SThierry Reding 
9399e44fb18SHoria Geantă #ifdef CONFIG_64BIT
9409e44fb18SHoria Geantă #ifndef ioread64_rep
9419e44fb18SHoria Geantă #define ioread64_rep ioread64_rep
ioread64_rep(const volatile void __iomem * addr,void * buffer,unsigned int count)9429e44fb18SHoria Geantă static inline void ioread64_rep(const volatile void __iomem *addr,
9439e44fb18SHoria Geantă 				void *buffer, unsigned int count)
9449e44fb18SHoria Geantă {
9459e44fb18SHoria Geantă 	readsq(addr, buffer, count);
9469e44fb18SHoria Geantă }
9479e44fb18SHoria Geantă #endif
9489e44fb18SHoria Geantă #endif /* CONFIG_64BIT */
9499e44fb18SHoria Geantă 
9509ab3a7a0SThierry Reding #ifndef iowrite8_rep
9519ab3a7a0SThierry Reding #define iowrite8_rep iowrite8_rep
iowrite8_rep(volatile void __iomem * addr,const void * buffer,unsigned int count)9529ab3a7a0SThierry Reding static inline void iowrite8_rep(volatile void __iomem *addr,
9539ab3a7a0SThierry Reding 				const void *buffer,
9549ab3a7a0SThierry Reding 				unsigned int count)
9559ab3a7a0SThierry Reding {
9569ab3a7a0SThierry Reding 	writesb(addr, buffer, count);
9579ab3a7a0SThierry Reding }
9589ab3a7a0SThierry Reding #endif
9599ab3a7a0SThierry Reding 
9609ab3a7a0SThierry Reding #ifndef iowrite16_rep
9619ab3a7a0SThierry Reding #define iowrite16_rep iowrite16_rep
iowrite16_rep(volatile void __iomem * addr,const void * buffer,unsigned int count)9629ab3a7a0SThierry Reding static inline void iowrite16_rep(volatile void __iomem *addr,
9639ab3a7a0SThierry Reding 				 const void *buffer,
9649ab3a7a0SThierry Reding 				 unsigned int count)
9659ab3a7a0SThierry Reding {
9669ab3a7a0SThierry Reding 	writesw(addr, buffer, count);
9679ab3a7a0SThierry Reding }
9689ab3a7a0SThierry Reding #endif
9699ab3a7a0SThierry Reding 
9709ab3a7a0SThierry Reding #ifndef iowrite32_rep
9719ab3a7a0SThierry Reding #define iowrite32_rep iowrite32_rep
iowrite32_rep(volatile void __iomem * addr,const void * buffer,unsigned int count)9729ab3a7a0SThierry Reding static inline void iowrite32_rep(volatile void __iomem *addr,
9739ab3a7a0SThierry Reding 				 const void *buffer,
9749ab3a7a0SThierry Reding 				 unsigned int count)
9759ab3a7a0SThierry Reding {
9769ab3a7a0SThierry Reding 	writesl(addr, buffer, count);
9779ab3a7a0SThierry Reding }
9789ab3a7a0SThierry Reding #endif
9799e44fb18SHoria Geantă 
9809e44fb18SHoria Geantă #ifdef CONFIG_64BIT
9819e44fb18SHoria Geantă #ifndef iowrite64_rep
9829e44fb18SHoria Geantă #define iowrite64_rep iowrite64_rep
iowrite64_rep(volatile void __iomem * addr,const void * buffer,unsigned int count)9839e44fb18SHoria Geantă static inline void iowrite64_rep(volatile void __iomem *addr,
9849e44fb18SHoria Geantă 				 const void *buffer,
9859e44fb18SHoria Geantă 				 unsigned int count)
9869e44fb18SHoria Geantă {
9879e44fb18SHoria Geantă 	writesq(addr, buffer, count);
9889e44fb18SHoria Geantă }
9899e44fb18SHoria Geantă #endif
9909e44fb18SHoria Geantă #endif /* CONFIG_64BIT */
9919216efafSThierry Reding #endif /* CONFIG_GENERIC_IOMAP */
9929216efafSThierry Reding 
9933f7e212dSArnd Bergmann #ifdef __KERNEL__
9943f7e212dSArnd Bergmann 
9953f7e212dSArnd Bergmann #define __io_virt(x) ((void __force *)(x))
9963f7e212dSArnd Bergmann 
9973f7e212dSArnd Bergmann /*
9983f7e212dSArnd Bergmann  * Change virtual addresses to physical addresses and vv.
9993f7e212dSArnd Bergmann  * These are pretty trivial
10003f7e212dSArnd Bergmann  */
1001cd248341SJan Glauber #ifndef virt_to_phys
10029216efafSThierry Reding #define virt_to_phys virt_to_phys
virt_to_phys(volatile void * address)10033f7e212dSArnd Bergmann static inline unsigned long virt_to_phys(volatile void *address)
10043f7e212dSArnd Bergmann {
10053f7e212dSArnd Bergmann 	return __pa((unsigned long)address);
10063f7e212dSArnd Bergmann }
10079216efafSThierry Reding #endif
10083f7e212dSArnd Bergmann 
10099216efafSThierry Reding #ifndef phys_to_virt
10109216efafSThierry Reding #define phys_to_virt phys_to_virt
phys_to_virt(unsigned long address)10113f7e212dSArnd Bergmann static inline void *phys_to_virt(unsigned long address)
10123f7e212dSArnd Bergmann {
10133f7e212dSArnd Bergmann 	return __va(address);
10143f7e212dSArnd Bergmann }
1015cd248341SJan Glauber #endif
10163f7e212dSArnd Bergmann 
10178c7ea50cSLuis R. Rodriguez /**
10188c7ea50cSLuis R. Rodriguez  * DOC: ioremap() and ioremap_*() variants
10198c7ea50cSLuis R. Rodriguez  *
102097c9801aSChristoph Hellwig  * Architectures with an MMU are expected to provide ioremap() and iounmap()
102180b0ca98SChristoph Hellwig  * themselves or rely on GENERIC_IOREMAP.  For NOMMU architectures we provide
102280b0ca98SChristoph Hellwig  * a default nop-op implementation that expect that the physical address used
102380b0ca98SChristoph Hellwig  * for MMIO are already marked as uncached, and can be used as kernel virtual
102480b0ca98SChristoph Hellwig  * addresses.
10258c7ea50cSLuis R. Rodriguez  *
102697c9801aSChristoph Hellwig  * ioremap_wc() and ioremap_wt() can provide more relaxed caching attributes
102797c9801aSChristoph Hellwig  * for specific drivers if the architecture choses to implement them.  If they
10287c566bb5SHector Martin  * are not implemented we fall back to plain ioremap. Conversely, ioremap_np()
10297c566bb5SHector Martin  * can provide stricter non-posted write semantics if the architecture
10307c566bb5SHector Martin  * implements them.
10318c7ea50cSLuis R. Rodriguez  */
1032e9713395SChristoph Hellwig #ifndef CONFIG_MMU
10339216efafSThierry Reding #ifndef ioremap
10349216efafSThierry Reding #define ioremap ioremap
ioremap(phys_addr_t offset,size_t size)10359216efafSThierry Reding static inline void __iomem *ioremap(phys_addr_t offset, size_t size)
10363f7e212dSArnd Bergmann {
10373f7e212dSArnd Bergmann 	return (void __iomem *)(unsigned long)offset;
10383f7e212dSArnd Bergmann }
10399216efafSThierry Reding #endif
10403f7e212dSArnd Bergmann 
1041b3ada9d0SGreentime Hu #ifndef iounmap
1042b3ada9d0SGreentime Hu #define iounmap iounmap
iounmap(volatile void __iomem * addr)10432fbc3499SAdam Borowski static inline void iounmap(volatile void __iomem *addr)
1044b3ada9d0SGreentime Hu {
1045b3ada9d0SGreentime Hu }
1046b3ada9d0SGreentime Hu #endif
104780b0ca98SChristoph Hellwig #elif defined(CONFIG_GENERIC_IOREMAP)
1048ca5999fdSMike Rapoport #include <linux/pgtable.h>
104980b0ca98SChristoph Hellwig 
10507613366aSChristophe Leroy void __iomem *generic_ioremap_prot(phys_addr_t phys_addr, size_t size,
10517613366aSChristophe Leroy 				   pgprot_t prot);
10527613366aSChristophe Leroy 
1053abc5992bSKefeng Wang void __iomem *ioremap_prot(phys_addr_t phys_addr, size_t size,
1054abc5992bSKefeng Wang 			   unsigned long prot);
105580b0ca98SChristoph Hellwig void iounmap(volatile void __iomem *addr);
10567613366aSChristophe Leroy void generic_iounmap(volatile void __iomem *addr);
105780b0ca98SChristoph Hellwig 
1058dfdc6ba9SBaoquan He #ifndef ioremap
1059dfdc6ba9SBaoquan He #define ioremap ioremap
ioremap(phys_addr_t addr,size_t size)106080b0ca98SChristoph Hellwig static inline void __iomem *ioremap(phys_addr_t addr, size_t size)
106180b0ca98SChristoph Hellwig {
106280b0ca98SChristoph Hellwig 	/* _PAGE_IOREMAP needs to be supplied by the architecture */
106380b0ca98SChristoph Hellwig 	return ioremap_prot(addr, size, _PAGE_IOREMAP);
106480b0ca98SChristoph Hellwig }
1065dfdc6ba9SBaoquan He #endif
106680b0ca98SChristoph Hellwig #endif /* !CONFIG_MMU || CONFIG_GENERIC_IOREMAP */
106797c9801aSChristoph Hellwig 
10683f7e212dSArnd Bergmann #ifndef ioremap_wc
1069d092a870SChristoph Hellwig #define ioremap_wc ioremap
10703f7e212dSArnd Bergmann #endif
10713f7e212dSArnd Bergmann 
1072d838270eSToshi Kani #ifndef ioremap_wt
1073d092a870SChristoph Hellwig #define ioremap_wt ioremap
1074d838270eSToshi Kani #endif
1075d838270eSToshi Kani 
1076e9713395SChristoph Hellwig /*
1077e9713395SChristoph Hellwig  * ioremap_uc is special in that we do require an explicit architecture
1078e9713395SChristoph Hellwig  * implementation.  In general you do not want to use this function in a
1079e9713395SChristoph Hellwig  * driver and use plain ioremap, which is uncached by default.  Similarly
1080e9713395SChristoph Hellwig  * architectures should not implement it unless they have a very good
1081e9713395SChristoph Hellwig  * reason.
1082e9713395SChristoph Hellwig  */
1083e9713395SChristoph Hellwig #ifndef ioremap_uc
1084e9713395SChristoph Hellwig #define ioremap_uc ioremap_uc
ioremap_uc(phys_addr_t offset,size_t size)1085e9713395SChristoph Hellwig static inline void __iomem *ioremap_uc(phys_addr_t offset, size_t size)
1086e9713395SChristoph Hellwig {
1087e9713395SChristoph Hellwig 	return NULL;
1088e9713395SChristoph Hellwig }
1089ea962928SHector Martin #endif
10907c566bb5SHector Martin 
10917c566bb5SHector Martin /*
10927c566bb5SHector Martin  * ioremap_np needs an explicit architecture implementation, as it
10937c566bb5SHector Martin  * requests stronger semantics than regular ioremap(). Portable drivers
10947c566bb5SHector Martin  * should instead use one of the higher-level abstractions, like
10957c566bb5SHector Martin  * devm_ioremap_resource(), to choose the correct variant for any given
10967c566bb5SHector Martin  * device and bus. Portable drivers with a good reason to want non-posted
10977c566bb5SHector Martin  * write semantics should always provide an ioremap() fallback in case
10987c566bb5SHector Martin  * ioremap_np() is not available.
10997c566bb5SHector Martin  */
11007c566bb5SHector Martin #ifndef ioremap_np
11017c566bb5SHector Martin #define ioremap_np ioremap_np
ioremap_np(phys_addr_t offset,size_t size)11027c566bb5SHector Martin static inline void __iomem *ioremap_np(phys_addr_t offset, size_t size)
11037c566bb5SHector Martin {
11047c566bb5SHector Martin 	return NULL;
11057c566bb5SHector Martin }
11067c566bb5SHector Martin #endif
11077c566bb5SHector Martin 
1108ce816fa8SUwe Kleine-König #ifdef CONFIG_HAS_IOPORT_MAP
11093f7e212dSArnd Bergmann #ifndef CONFIG_GENERIC_IOMAP
11109216efafSThierry Reding #ifndef ioport_map
11119216efafSThierry Reding #define ioport_map ioport_map
ioport_map(unsigned long port,unsigned int nr)11123f7e212dSArnd Bergmann static inline void __iomem *ioport_map(unsigned long port, unsigned int nr)
11133f7e212dSArnd Bergmann {
1114500dd232SAndrew Murray 	port &= IO_SPACE_LIMIT;
1115500dd232SAndrew Murray 	return (port > MMIO_UPPER_LIMIT) ? NULL : PCI_IOBASE + port;
11163f7e212dSArnd Bergmann }
1117316e8d79SLinus Torvalds #define ARCH_HAS_GENERIC_IOPORT_MAP
11189216efafSThierry Reding #endif
11193f7e212dSArnd Bergmann 
11209216efafSThierry Reding #ifndef ioport_unmap
11219216efafSThierry Reding #define ioport_unmap ioport_unmap
ioport_unmap(void __iomem * p)11223f7e212dSArnd Bergmann static inline void ioport_unmap(void __iomem *p)
11233f7e212dSArnd Bergmann {
11243f7e212dSArnd Bergmann }
11259216efafSThierry Reding #endif
11263f7e212dSArnd Bergmann #else /* CONFIG_GENERIC_IOMAP */
11273f7e212dSArnd Bergmann extern void __iomem *ioport_map(unsigned long port, unsigned int nr);
11283f7e212dSArnd Bergmann extern void ioport_unmap(void __iomem *p);
11293f7e212dSArnd Bergmann #endif /* CONFIG_GENERIC_IOMAP */
1130ce816fa8SUwe Kleine-König #endif /* CONFIG_HAS_IOPORT_MAP */
11313f7e212dSArnd Bergmann 
1132f5810e5cSLorenzo Pieralisi #ifndef CONFIG_GENERIC_IOMAP
1133f5810e5cSLorenzo Pieralisi #ifndef pci_iounmap
1134316e8d79SLinus Torvalds #define ARCH_WANTS_GENERIC_PCI_IOUNMAP
1135f5810e5cSLorenzo Pieralisi #endif
1136316e8d79SLinus Torvalds #endif
1137f5810e5cSLorenzo Pieralisi 
1138576ebd74SMichael Holzheu #ifndef xlate_dev_mem_ptr
11399216efafSThierry Reding #define xlate_dev_mem_ptr xlate_dev_mem_ptr
xlate_dev_mem_ptr(phys_addr_t addr)11409216efafSThierry Reding static inline void *xlate_dev_mem_ptr(phys_addr_t addr)
11419216efafSThierry Reding {
11429216efafSThierry Reding 	return __va(addr);
11439216efafSThierry Reding }
11449216efafSThierry Reding #endif
11459216efafSThierry Reding 
11469216efafSThierry Reding #ifndef unxlate_dev_mem_ptr
11479216efafSThierry Reding #define unxlate_dev_mem_ptr unxlate_dev_mem_ptr
unxlate_dev_mem_ptr(phys_addr_t phys,void * addr)11489216efafSThierry Reding static inline void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr)
11499216efafSThierry Reding {
11509216efafSThierry Reding }
1151576ebd74SMichael Holzheu #endif
11523f7e212dSArnd Bergmann 
1153cd248341SJan Glauber #ifndef memset_io
11549216efafSThierry Reding #define memset_io memset_io
1155c2327da0SAndy Shevchenko /**
1156c2327da0SAndy Shevchenko  * memset_io	Set a range of I/O memory to a constant value
1157c2327da0SAndy Shevchenko  * @addr:	The beginning of the I/O-memory range to set
1158c2327da0SAndy Shevchenko  * @val:	The value to set the memory to
1159c2327da0SAndy Shevchenko  * @count:	The number of bytes to set
1160c2327da0SAndy Shevchenko  *
1161c2327da0SAndy Shevchenko  * Set a range of I/O memory to a given value.
1162c2327da0SAndy Shevchenko  */
memset_io(volatile void __iomem * addr,int value,size_t size)11639216efafSThierry Reding static inline void memset_io(volatile void __iomem *addr, int value,
11649216efafSThierry Reding 			     size_t size)
11659216efafSThierry Reding {
11669216efafSThierry Reding 	memset(__io_virt(addr), value, size);
11679216efafSThierry Reding }
1168cd248341SJan Glauber #endif
1169cd248341SJan Glauber 
1170cd248341SJan Glauber #ifndef memcpy_fromio
11719216efafSThierry Reding #define memcpy_fromio memcpy_fromio
1172c2327da0SAndy Shevchenko /**
1173c2327da0SAndy Shevchenko  * memcpy_fromio	Copy a block of data from I/O memory
1174c2327da0SAndy Shevchenko  * @dst:		The (RAM) destination for the copy
1175c2327da0SAndy Shevchenko  * @src:		The (I/O memory) source for the data
1176c2327da0SAndy Shevchenko  * @count:		The number of bytes to copy
1177c2327da0SAndy Shevchenko  *
1178c2327da0SAndy Shevchenko  * Copy a block of data from I/O memory.
1179c2327da0SAndy Shevchenko  */
memcpy_fromio(void * buffer,const volatile void __iomem * addr,size_t size)11809216efafSThierry Reding static inline void memcpy_fromio(void *buffer,
11819216efafSThierry Reding 				 const volatile void __iomem *addr,
11829216efafSThierry Reding 				 size_t size)
11839216efafSThierry Reding {
11849216efafSThierry Reding 	memcpy(buffer, __io_virt(addr), size);
11859216efafSThierry Reding }
1186cd248341SJan Glauber #endif
11879216efafSThierry Reding 
1188cd248341SJan Glauber #ifndef memcpy_toio
11899216efafSThierry Reding #define memcpy_toio memcpy_toio
1190c2327da0SAndy Shevchenko /**
1191c2327da0SAndy Shevchenko  * memcpy_toio		Copy a block of data into I/O memory
1192c2327da0SAndy Shevchenko  * @dst:		The (I/O memory) destination for the copy
1193c2327da0SAndy Shevchenko  * @src:		The (RAM) source for the data
1194c2327da0SAndy Shevchenko  * @count:		The number of bytes to copy
1195c2327da0SAndy Shevchenko  *
1196c2327da0SAndy Shevchenko  * Copy a block of data to I/O memory.
1197c2327da0SAndy Shevchenko  */
memcpy_toio(volatile void __iomem * addr,const void * buffer,size_t size)11989216efafSThierry Reding static inline void memcpy_toio(volatile void __iomem *addr, const void *buffer,
11999216efafSThierry Reding 			       size_t size)
12009216efafSThierry Reding {
12019216efafSThierry Reding 	memcpy(__io_virt(addr), buffer, size);
12029216efafSThierry Reding }
1203cd248341SJan Glauber #endif
12043f7e212dSArnd Bergmann 
1205527701edSPalmer Dabbelt extern int devmem_is_allowed(unsigned long pfn);
1206527701edSPalmer Dabbelt 
12073f7e212dSArnd Bergmann #endif /* __KERNEL__ */
12083f7e212dSArnd Bergmann 
12093f7e212dSArnd Bergmann #endif /* __ASM_GENERIC_IO_H */
1210