xref: /OK3568_Linux_fs/kernel/lib/iomap.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Implement the default iomap interfaces
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * (C) Copyright 2004 Linus Torvalds
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun #include <linux/pci.h>
8*4882a593Smuzhiyun #include <linux/io.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #include <linux/export.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun /*
13*4882a593Smuzhiyun  * Read/write from/to an (offsettable) iomem cookie. It might be a PIO
14*4882a593Smuzhiyun  * access or a MMIO access, these functions don't care. The info is
15*4882a593Smuzhiyun  * encoded in the hardware mapping set up by the mapping functions
16*4882a593Smuzhiyun  * (or the cookie itself, depending on implementation and hw).
17*4882a593Smuzhiyun  *
18*4882a593Smuzhiyun  * The generic routines don't assume any hardware mappings, and just
19*4882a593Smuzhiyun  * encode the PIO/MMIO as part of the cookie. They coldly assume that
20*4882a593Smuzhiyun  * the MMIO IO mappings are not in the low address range.
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  * Architectures for which this is not true can't use this generic
23*4882a593Smuzhiyun  * implementation and should do their own copy.
24*4882a593Smuzhiyun  */
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #ifndef HAVE_ARCH_PIO_SIZE
27*4882a593Smuzhiyun /*
28*4882a593Smuzhiyun  * We encode the physical PIO addresses (0-0xffff) into the
29*4882a593Smuzhiyun  * pointer by offsetting them with a constant (0x10000) and
30*4882a593Smuzhiyun  * assuming that all the low addresses are always PIO. That means
31*4882a593Smuzhiyun  * we can do some sanity checks on the low bits, and don't
32*4882a593Smuzhiyun  * need to just take things for granted.
33*4882a593Smuzhiyun  */
34*4882a593Smuzhiyun #define PIO_OFFSET	0x10000UL
35*4882a593Smuzhiyun #define PIO_MASK	0x0ffffUL
36*4882a593Smuzhiyun #define PIO_RESERVED	0x40000UL
37*4882a593Smuzhiyun #endif
38*4882a593Smuzhiyun 
bad_io_access(unsigned long port,const char * access)39*4882a593Smuzhiyun static void bad_io_access(unsigned long port, const char *access)
40*4882a593Smuzhiyun {
41*4882a593Smuzhiyun 	static int count = 10;
42*4882a593Smuzhiyun 	if (count) {
43*4882a593Smuzhiyun 		count--;
44*4882a593Smuzhiyun 		WARN(1, KERN_ERR "Bad IO access at port %#lx (%s)\n", port, access);
45*4882a593Smuzhiyun 	}
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun /*
49*4882a593Smuzhiyun  * Ugly macros are a way of life.
50*4882a593Smuzhiyun  */
51*4882a593Smuzhiyun #define IO_COND(addr, is_pio, is_mmio) do {			\
52*4882a593Smuzhiyun 	unsigned long port = (unsigned long __force)addr;	\
53*4882a593Smuzhiyun 	if (port >= PIO_RESERVED) {				\
54*4882a593Smuzhiyun 		is_mmio;					\
55*4882a593Smuzhiyun 	} else if (port > PIO_OFFSET) {				\
56*4882a593Smuzhiyun 		port &= PIO_MASK;				\
57*4882a593Smuzhiyun 		is_pio;						\
58*4882a593Smuzhiyun 	} else							\
59*4882a593Smuzhiyun 		bad_io_access(port, #is_pio );			\
60*4882a593Smuzhiyun } while (0)
61*4882a593Smuzhiyun 
62*4882a593Smuzhiyun #ifndef pio_read16be
63*4882a593Smuzhiyun #define pio_read16be(port) swab16(inw(port))
64*4882a593Smuzhiyun #define pio_read32be(port) swab32(inl(port))
65*4882a593Smuzhiyun #endif
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun #ifndef mmio_read16be
68*4882a593Smuzhiyun #define mmio_read16be(addr) swab16(readw(addr))
69*4882a593Smuzhiyun #define mmio_read32be(addr) swab32(readl(addr))
70*4882a593Smuzhiyun #define mmio_read64be(addr) swab64(readq(addr))
71*4882a593Smuzhiyun #endif
72*4882a593Smuzhiyun 
ioread8(const void __iomem * addr)73*4882a593Smuzhiyun unsigned int ioread8(const void __iomem *addr)
74*4882a593Smuzhiyun {
75*4882a593Smuzhiyun 	IO_COND(addr, return inb(port), return readb(addr));
76*4882a593Smuzhiyun 	return 0xff;
77*4882a593Smuzhiyun }
ioread16(const void __iomem * addr)78*4882a593Smuzhiyun unsigned int ioread16(const void __iomem *addr)
79*4882a593Smuzhiyun {
80*4882a593Smuzhiyun 	IO_COND(addr, return inw(port), return readw(addr));
81*4882a593Smuzhiyun 	return 0xffff;
82*4882a593Smuzhiyun }
ioread16be(const void __iomem * addr)83*4882a593Smuzhiyun unsigned int ioread16be(const void __iomem *addr)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun 	IO_COND(addr, return pio_read16be(port), return mmio_read16be(addr));
86*4882a593Smuzhiyun 	return 0xffff;
87*4882a593Smuzhiyun }
ioread32(const void __iomem * addr)88*4882a593Smuzhiyun unsigned int ioread32(const void __iomem *addr)
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun 	IO_COND(addr, return inl(port), return readl(addr));
91*4882a593Smuzhiyun 	return 0xffffffff;
92*4882a593Smuzhiyun }
ioread32be(const void __iomem * addr)93*4882a593Smuzhiyun unsigned int ioread32be(const void __iomem *addr)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun 	IO_COND(addr, return pio_read32be(port), return mmio_read32be(addr));
96*4882a593Smuzhiyun 	return 0xffffffff;
97*4882a593Smuzhiyun }
98*4882a593Smuzhiyun EXPORT_SYMBOL(ioread8);
99*4882a593Smuzhiyun EXPORT_SYMBOL(ioread16);
100*4882a593Smuzhiyun EXPORT_SYMBOL(ioread16be);
101*4882a593Smuzhiyun EXPORT_SYMBOL(ioread32);
102*4882a593Smuzhiyun EXPORT_SYMBOL(ioread32be);
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun #ifdef readq
pio_read64_lo_hi(unsigned long port)105*4882a593Smuzhiyun static u64 pio_read64_lo_hi(unsigned long port)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun 	u64 lo, hi;
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	lo = inl(port);
110*4882a593Smuzhiyun 	hi = inl(port + sizeof(u32));
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	return lo | (hi << 32);
113*4882a593Smuzhiyun }
114*4882a593Smuzhiyun 
pio_read64_hi_lo(unsigned long port)115*4882a593Smuzhiyun static u64 pio_read64_hi_lo(unsigned long port)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun 	u64 lo, hi;
118*4882a593Smuzhiyun 
119*4882a593Smuzhiyun 	hi = inl(port + sizeof(u32));
120*4882a593Smuzhiyun 	lo = inl(port);
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	return lo | (hi << 32);
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun 
pio_read64be_lo_hi(unsigned long port)125*4882a593Smuzhiyun static u64 pio_read64be_lo_hi(unsigned long port)
126*4882a593Smuzhiyun {
127*4882a593Smuzhiyun 	u64 lo, hi;
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun 	lo = pio_read32be(port + sizeof(u32));
130*4882a593Smuzhiyun 	hi = pio_read32be(port);
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 	return lo | (hi << 32);
133*4882a593Smuzhiyun }
134*4882a593Smuzhiyun 
pio_read64be_hi_lo(unsigned long port)135*4882a593Smuzhiyun static u64 pio_read64be_hi_lo(unsigned long port)
136*4882a593Smuzhiyun {
137*4882a593Smuzhiyun 	u64 lo, hi;
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 	hi = pio_read32be(port);
140*4882a593Smuzhiyun 	lo = pio_read32be(port + sizeof(u32));
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun 	return lo | (hi << 32);
143*4882a593Smuzhiyun }
144*4882a593Smuzhiyun 
ioread64_lo_hi(const void __iomem * addr)145*4882a593Smuzhiyun u64 ioread64_lo_hi(const void __iomem *addr)
146*4882a593Smuzhiyun {
147*4882a593Smuzhiyun 	IO_COND(addr, return pio_read64_lo_hi(port), return readq(addr));
148*4882a593Smuzhiyun 	return 0xffffffffffffffffULL;
149*4882a593Smuzhiyun }
150*4882a593Smuzhiyun 
ioread64_hi_lo(const void __iomem * addr)151*4882a593Smuzhiyun u64 ioread64_hi_lo(const void __iomem *addr)
152*4882a593Smuzhiyun {
153*4882a593Smuzhiyun 	IO_COND(addr, return pio_read64_hi_lo(port), return readq(addr));
154*4882a593Smuzhiyun 	return 0xffffffffffffffffULL;
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun 
ioread64be_lo_hi(const void __iomem * addr)157*4882a593Smuzhiyun u64 ioread64be_lo_hi(const void __iomem *addr)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun 	IO_COND(addr, return pio_read64be_lo_hi(port),
160*4882a593Smuzhiyun 		return mmio_read64be(addr));
161*4882a593Smuzhiyun 	return 0xffffffffffffffffULL;
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun 
ioread64be_hi_lo(const void __iomem * addr)164*4882a593Smuzhiyun u64 ioread64be_hi_lo(const void __iomem *addr)
165*4882a593Smuzhiyun {
166*4882a593Smuzhiyun 	IO_COND(addr, return pio_read64be_hi_lo(port),
167*4882a593Smuzhiyun 		return mmio_read64be(addr));
168*4882a593Smuzhiyun 	return 0xffffffffffffffffULL;
169*4882a593Smuzhiyun }
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun EXPORT_SYMBOL(ioread64_lo_hi);
172*4882a593Smuzhiyun EXPORT_SYMBOL(ioread64_hi_lo);
173*4882a593Smuzhiyun EXPORT_SYMBOL(ioread64be_lo_hi);
174*4882a593Smuzhiyun EXPORT_SYMBOL(ioread64be_hi_lo);
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun #endif /* readq */
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun #ifndef pio_write16be
179*4882a593Smuzhiyun #define pio_write16be(val,port) outw(swab16(val),port)
180*4882a593Smuzhiyun #define pio_write32be(val,port) outl(swab32(val),port)
181*4882a593Smuzhiyun #endif
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun #ifndef mmio_write16be
184*4882a593Smuzhiyun #define mmio_write16be(val,port) writew(swab16(val),port)
185*4882a593Smuzhiyun #define mmio_write32be(val,port) writel(swab32(val),port)
186*4882a593Smuzhiyun #define mmio_write64be(val,port) writeq(swab64(val),port)
187*4882a593Smuzhiyun #endif
188*4882a593Smuzhiyun 
iowrite8(u8 val,void __iomem * addr)189*4882a593Smuzhiyun void iowrite8(u8 val, void __iomem *addr)
190*4882a593Smuzhiyun {
191*4882a593Smuzhiyun 	IO_COND(addr, outb(val,port), writeb(val, addr));
192*4882a593Smuzhiyun }
iowrite16(u16 val,void __iomem * addr)193*4882a593Smuzhiyun void iowrite16(u16 val, void __iomem *addr)
194*4882a593Smuzhiyun {
195*4882a593Smuzhiyun 	IO_COND(addr, outw(val,port), writew(val, addr));
196*4882a593Smuzhiyun }
iowrite16be(u16 val,void __iomem * addr)197*4882a593Smuzhiyun void iowrite16be(u16 val, void __iomem *addr)
198*4882a593Smuzhiyun {
199*4882a593Smuzhiyun 	IO_COND(addr, pio_write16be(val,port), mmio_write16be(val, addr));
200*4882a593Smuzhiyun }
iowrite32(u32 val,void __iomem * addr)201*4882a593Smuzhiyun void iowrite32(u32 val, void __iomem *addr)
202*4882a593Smuzhiyun {
203*4882a593Smuzhiyun 	IO_COND(addr, outl(val,port), writel(val, addr));
204*4882a593Smuzhiyun }
iowrite32be(u32 val,void __iomem * addr)205*4882a593Smuzhiyun void iowrite32be(u32 val, void __iomem *addr)
206*4882a593Smuzhiyun {
207*4882a593Smuzhiyun 	IO_COND(addr, pio_write32be(val,port), mmio_write32be(val, addr));
208*4882a593Smuzhiyun }
209*4882a593Smuzhiyun EXPORT_SYMBOL(iowrite8);
210*4882a593Smuzhiyun EXPORT_SYMBOL(iowrite16);
211*4882a593Smuzhiyun EXPORT_SYMBOL(iowrite16be);
212*4882a593Smuzhiyun EXPORT_SYMBOL(iowrite32);
213*4882a593Smuzhiyun EXPORT_SYMBOL(iowrite32be);
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun #ifdef writeq
pio_write64_lo_hi(u64 val,unsigned long port)216*4882a593Smuzhiyun static void pio_write64_lo_hi(u64 val, unsigned long port)
217*4882a593Smuzhiyun {
218*4882a593Smuzhiyun 	outl(val, port);
219*4882a593Smuzhiyun 	outl(val >> 32, port + sizeof(u32));
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun 
pio_write64_hi_lo(u64 val,unsigned long port)222*4882a593Smuzhiyun static void pio_write64_hi_lo(u64 val, unsigned long port)
223*4882a593Smuzhiyun {
224*4882a593Smuzhiyun 	outl(val >> 32, port + sizeof(u32));
225*4882a593Smuzhiyun 	outl(val, port);
226*4882a593Smuzhiyun }
227*4882a593Smuzhiyun 
pio_write64be_lo_hi(u64 val,unsigned long port)228*4882a593Smuzhiyun static void pio_write64be_lo_hi(u64 val, unsigned long port)
229*4882a593Smuzhiyun {
230*4882a593Smuzhiyun 	pio_write32be(val, port + sizeof(u32));
231*4882a593Smuzhiyun 	pio_write32be(val >> 32, port);
232*4882a593Smuzhiyun }
233*4882a593Smuzhiyun 
pio_write64be_hi_lo(u64 val,unsigned long port)234*4882a593Smuzhiyun static void pio_write64be_hi_lo(u64 val, unsigned long port)
235*4882a593Smuzhiyun {
236*4882a593Smuzhiyun 	pio_write32be(val >> 32, port);
237*4882a593Smuzhiyun 	pio_write32be(val, port + sizeof(u32));
238*4882a593Smuzhiyun }
239*4882a593Smuzhiyun 
iowrite64_lo_hi(u64 val,void __iomem * addr)240*4882a593Smuzhiyun void iowrite64_lo_hi(u64 val, void __iomem *addr)
241*4882a593Smuzhiyun {
242*4882a593Smuzhiyun 	IO_COND(addr, pio_write64_lo_hi(val, port),
243*4882a593Smuzhiyun 		writeq(val, addr));
244*4882a593Smuzhiyun }
245*4882a593Smuzhiyun 
iowrite64_hi_lo(u64 val,void __iomem * addr)246*4882a593Smuzhiyun void iowrite64_hi_lo(u64 val, void __iomem *addr)
247*4882a593Smuzhiyun {
248*4882a593Smuzhiyun 	IO_COND(addr, pio_write64_hi_lo(val, port),
249*4882a593Smuzhiyun 		writeq(val, addr));
250*4882a593Smuzhiyun }
251*4882a593Smuzhiyun 
iowrite64be_lo_hi(u64 val,void __iomem * addr)252*4882a593Smuzhiyun void iowrite64be_lo_hi(u64 val, void __iomem *addr)
253*4882a593Smuzhiyun {
254*4882a593Smuzhiyun 	IO_COND(addr, pio_write64be_lo_hi(val, port),
255*4882a593Smuzhiyun 		mmio_write64be(val, addr));
256*4882a593Smuzhiyun }
257*4882a593Smuzhiyun 
iowrite64be_hi_lo(u64 val,void __iomem * addr)258*4882a593Smuzhiyun void iowrite64be_hi_lo(u64 val, void __iomem *addr)
259*4882a593Smuzhiyun {
260*4882a593Smuzhiyun 	IO_COND(addr, pio_write64be_hi_lo(val, port),
261*4882a593Smuzhiyun 		mmio_write64be(val, addr));
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun 
264*4882a593Smuzhiyun EXPORT_SYMBOL(iowrite64_lo_hi);
265*4882a593Smuzhiyun EXPORT_SYMBOL(iowrite64_hi_lo);
266*4882a593Smuzhiyun EXPORT_SYMBOL(iowrite64be_lo_hi);
267*4882a593Smuzhiyun EXPORT_SYMBOL(iowrite64be_hi_lo);
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun #endif /* readq */
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun /*
272*4882a593Smuzhiyun  * These are the "repeat MMIO read/write" functions.
273*4882a593Smuzhiyun  * Note the "__raw" accesses, since we don't want to
274*4882a593Smuzhiyun  * convert to CPU byte order. We write in "IO byte
275*4882a593Smuzhiyun  * order" (we also don't have IO barriers).
276*4882a593Smuzhiyun  */
277*4882a593Smuzhiyun #ifndef mmio_insb
mmio_insb(const void __iomem * addr,u8 * dst,int count)278*4882a593Smuzhiyun static inline void mmio_insb(const void __iomem *addr, u8 *dst, int count)
279*4882a593Smuzhiyun {
280*4882a593Smuzhiyun 	while (--count >= 0) {
281*4882a593Smuzhiyun 		u8 data = __raw_readb(addr);
282*4882a593Smuzhiyun 		*dst = data;
283*4882a593Smuzhiyun 		dst++;
284*4882a593Smuzhiyun 	}
285*4882a593Smuzhiyun }
mmio_insw(const void __iomem * addr,u16 * dst,int count)286*4882a593Smuzhiyun static inline void mmio_insw(const void __iomem *addr, u16 *dst, int count)
287*4882a593Smuzhiyun {
288*4882a593Smuzhiyun 	while (--count >= 0) {
289*4882a593Smuzhiyun 		u16 data = __raw_readw(addr);
290*4882a593Smuzhiyun 		*dst = data;
291*4882a593Smuzhiyun 		dst++;
292*4882a593Smuzhiyun 	}
293*4882a593Smuzhiyun }
mmio_insl(const void __iomem * addr,u32 * dst,int count)294*4882a593Smuzhiyun static inline void mmio_insl(const void __iomem *addr, u32 *dst, int count)
295*4882a593Smuzhiyun {
296*4882a593Smuzhiyun 	while (--count >= 0) {
297*4882a593Smuzhiyun 		u32 data = __raw_readl(addr);
298*4882a593Smuzhiyun 		*dst = data;
299*4882a593Smuzhiyun 		dst++;
300*4882a593Smuzhiyun 	}
301*4882a593Smuzhiyun }
302*4882a593Smuzhiyun #endif
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun #ifndef mmio_outsb
mmio_outsb(void __iomem * addr,const u8 * src,int count)305*4882a593Smuzhiyun static inline void mmio_outsb(void __iomem *addr, const u8 *src, int count)
306*4882a593Smuzhiyun {
307*4882a593Smuzhiyun 	while (--count >= 0) {
308*4882a593Smuzhiyun 		__raw_writeb(*src, addr);
309*4882a593Smuzhiyun 		src++;
310*4882a593Smuzhiyun 	}
311*4882a593Smuzhiyun }
mmio_outsw(void __iomem * addr,const u16 * src,int count)312*4882a593Smuzhiyun static inline void mmio_outsw(void __iomem *addr, const u16 *src, int count)
313*4882a593Smuzhiyun {
314*4882a593Smuzhiyun 	while (--count >= 0) {
315*4882a593Smuzhiyun 		__raw_writew(*src, addr);
316*4882a593Smuzhiyun 		src++;
317*4882a593Smuzhiyun 	}
318*4882a593Smuzhiyun }
mmio_outsl(void __iomem * addr,const u32 * src,int count)319*4882a593Smuzhiyun static inline void mmio_outsl(void __iomem *addr, const u32 *src, int count)
320*4882a593Smuzhiyun {
321*4882a593Smuzhiyun 	while (--count >= 0) {
322*4882a593Smuzhiyun 		__raw_writel(*src, addr);
323*4882a593Smuzhiyun 		src++;
324*4882a593Smuzhiyun 	}
325*4882a593Smuzhiyun }
326*4882a593Smuzhiyun #endif
327*4882a593Smuzhiyun 
ioread8_rep(const void __iomem * addr,void * dst,unsigned long count)328*4882a593Smuzhiyun void ioread8_rep(const void __iomem *addr, void *dst, unsigned long count)
329*4882a593Smuzhiyun {
330*4882a593Smuzhiyun 	IO_COND(addr, insb(port,dst,count), mmio_insb(addr, dst, count));
331*4882a593Smuzhiyun }
ioread16_rep(const void __iomem * addr,void * dst,unsigned long count)332*4882a593Smuzhiyun void ioread16_rep(const void __iomem *addr, void *dst, unsigned long count)
333*4882a593Smuzhiyun {
334*4882a593Smuzhiyun 	IO_COND(addr, insw(port,dst,count), mmio_insw(addr, dst, count));
335*4882a593Smuzhiyun }
ioread32_rep(const void __iomem * addr,void * dst,unsigned long count)336*4882a593Smuzhiyun void ioread32_rep(const void __iomem *addr, void *dst, unsigned long count)
337*4882a593Smuzhiyun {
338*4882a593Smuzhiyun 	IO_COND(addr, insl(port,dst,count), mmio_insl(addr, dst, count));
339*4882a593Smuzhiyun }
340*4882a593Smuzhiyun EXPORT_SYMBOL(ioread8_rep);
341*4882a593Smuzhiyun EXPORT_SYMBOL(ioread16_rep);
342*4882a593Smuzhiyun EXPORT_SYMBOL(ioread32_rep);
343*4882a593Smuzhiyun 
iowrite8_rep(void __iomem * addr,const void * src,unsigned long count)344*4882a593Smuzhiyun void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count)
345*4882a593Smuzhiyun {
346*4882a593Smuzhiyun 	IO_COND(addr, outsb(port, src, count), mmio_outsb(addr, src, count));
347*4882a593Smuzhiyun }
iowrite16_rep(void __iomem * addr,const void * src,unsigned long count)348*4882a593Smuzhiyun void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count)
349*4882a593Smuzhiyun {
350*4882a593Smuzhiyun 	IO_COND(addr, outsw(port, src, count), mmio_outsw(addr, src, count));
351*4882a593Smuzhiyun }
iowrite32_rep(void __iomem * addr,const void * src,unsigned long count)352*4882a593Smuzhiyun void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count)
353*4882a593Smuzhiyun {
354*4882a593Smuzhiyun 	IO_COND(addr, outsl(port, src,count), mmio_outsl(addr, src, count));
355*4882a593Smuzhiyun }
356*4882a593Smuzhiyun EXPORT_SYMBOL(iowrite8_rep);
357*4882a593Smuzhiyun EXPORT_SYMBOL(iowrite16_rep);
358*4882a593Smuzhiyun EXPORT_SYMBOL(iowrite32_rep);
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun #ifdef CONFIG_HAS_IOPORT_MAP
361*4882a593Smuzhiyun /* Create a virtual mapping cookie for an IO port range */
ioport_map(unsigned long port,unsigned int nr)362*4882a593Smuzhiyun void __iomem *ioport_map(unsigned long port, unsigned int nr)
363*4882a593Smuzhiyun {
364*4882a593Smuzhiyun 	if (port > PIO_MASK)
365*4882a593Smuzhiyun 		return NULL;
366*4882a593Smuzhiyun 	return (void __iomem *) (unsigned long) (port + PIO_OFFSET);
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun 
ioport_unmap(void __iomem * addr)369*4882a593Smuzhiyun void ioport_unmap(void __iomem *addr)
370*4882a593Smuzhiyun {
371*4882a593Smuzhiyun 	/* Nothing to do */
372*4882a593Smuzhiyun }
373*4882a593Smuzhiyun EXPORT_SYMBOL(ioport_map);
374*4882a593Smuzhiyun EXPORT_SYMBOL(ioport_unmap);
375*4882a593Smuzhiyun #endif /* CONFIG_HAS_IOPORT_MAP */
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun #ifdef CONFIG_PCI
378*4882a593Smuzhiyun /* Hide the details if this is a MMIO or PIO address space and just do what
379*4882a593Smuzhiyun  * you expect in the correct way. */
pci_iounmap(struct pci_dev * dev,void __iomem * addr)380*4882a593Smuzhiyun void pci_iounmap(struct pci_dev *dev, void __iomem * addr)
381*4882a593Smuzhiyun {
382*4882a593Smuzhiyun 	IO_COND(addr, /* nothing */, iounmap(addr));
383*4882a593Smuzhiyun }
384*4882a593Smuzhiyun EXPORT_SYMBOL(pci_iounmap);
385*4882a593Smuzhiyun #endif /* CONFIG_PCI */
386