1 // SPDX-License-Identifier: GPL-2.0
3 * Implement the default iomap interfaces
5 * (C) Copyright 2004 Linus Torvalds
6 * (C) Copyright 2006 Ralf Baechle <ralf@linux-mips.org>
7 * (C) Copyright 2007 MIPS Technologies, Inc.
8 * written by Ralf Baechle <ralf@linux-mips.org>
10 #include <linux/export.h>
14 * Read/write from/to an (offsettable) iomem cookie. It might be a PIO
15 * access or a MMIO access, these functions don't care. The info is
16 * encoded in the hardware mapping set up by the mapping functions
17 * (or the cookie itself, depending on implementation and hw).
19 * The generic routines don't assume any hardware mappings, and just
20 * encode the PIO/MMIO as part of the cookie. They coldly assume that
21 * the MMIO IO mappings are not in the low address range.
23 * Architectures for which this is not true can't use this generic
24 * implementation and should do their own copy.
27 #define PIO_MASK 0x0ffffUL
29 unsigned int ioread8(void __iomem
*addr
)
34 EXPORT_SYMBOL(ioread8
);
36 unsigned int ioread16(void __iomem
*addr
)
41 EXPORT_SYMBOL(ioread16
);
43 unsigned int ioread16be(void __iomem
*addr
)
45 return be16_to_cpu(__raw_readw(addr
));
48 EXPORT_SYMBOL(ioread16be
);
50 unsigned int ioread32(void __iomem
*addr
)
55 EXPORT_SYMBOL(ioread32
);
57 unsigned int ioread32be(void __iomem
*addr
)
59 return be32_to_cpu(__raw_readl(addr
));
62 EXPORT_SYMBOL(ioread32be
);
64 void iowrite8(u8 val
, void __iomem
*addr
)
69 EXPORT_SYMBOL(iowrite8
);
71 void iowrite16(u16 val
, void __iomem
*addr
)
76 EXPORT_SYMBOL(iowrite16
);
78 void iowrite16be(u16 val
, void __iomem
*addr
)
80 __raw_writew(cpu_to_be16(val
), addr
);
83 EXPORT_SYMBOL(iowrite16be
);
85 void iowrite32(u32 val
, void __iomem
*addr
)
90 EXPORT_SYMBOL(iowrite32
);
92 void iowrite32be(u32 val
, void __iomem
*addr
)
94 __raw_writel(cpu_to_be32(val
), addr
);
97 EXPORT_SYMBOL(iowrite32be
);
100 * These are the "repeat MMIO read/write" functions.
101 * Note the "__mem" accesses, since we want to convert
102 * to CPU byte order if the host bus happens to not match the
103 * endianness of PCI/ISA (see mach-generic/mangle-port.h).
105 static inline void mmio_insb(void __iomem
*addr
, u8
*dst
, int count
)
107 while (--count
>= 0) {
108 u8 data
= __mem_readb(addr
);
114 static inline void mmio_insw(void __iomem
*addr
, u16
*dst
, int count
)
116 while (--count
>= 0) {
117 u16 data
= __mem_readw(addr
);
123 static inline void mmio_insl(void __iomem
*addr
, u32
*dst
, int count
)
125 while (--count
>= 0) {
126 u32 data
= __mem_readl(addr
);
132 static inline void mmio_outsb(void __iomem
*addr
, const u8
*src
, int count
)
134 while (--count
>= 0) {
135 __mem_writeb(*src
, addr
);
140 static inline void mmio_outsw(void __iomem
*addr
, const u16
*src
, int count
)
142 while (--count
>= 0) {
143 __mem_writew(*src
, addr
);
148 static inline void mmio_outsl(void __iomem
*addr
, const u32
*src
, int count
)
150 while (--count
>= 0) {
151 __mem_writel(*src
, addr
);
156 void ioread8_rep(void __iomem
*addr
, void *dst
, unsigned long count
)
158 mmio_insb(addr
, dst
, count
);
161 EXPORT_SYMBOL(ioread8_rep
);
163 void ioread16_rep(void __iomem
*addr
, void *dst
, unsigned long count
)
165 mmio_insw(addr
, dst
, count
);
168 EXPORT_SYMBOL(ioread16_rep
);
170 void ioread32_rep(void __iomem
*addr
, void *dst
, unsigned long count
)
172 mmio_insl(addr
, dst
, count
);
175 EXPORT_SYMBOL(ioread32_rep
);
177 void iowrite8_rep(void __iomem
*addr
, const void *src
, unsigned long count
)
179 mmio_outsb(addr
, src
, count
);
182 EXPORT_SYMBOL(iowrite8_rep
);
184 void iowrite16_rep(void __iomem
*addr
, const void *src
, unsigned long count
)
186 mmio_outsw(addr
, src
, count
);
189 EXPORT_SYMBOL(iowrite16_rep
);
191 void iowrite32_rep(void __iomem
*addr
, const void *src
, unsigned long count
)
193 mmio_outsl(addr
, src
, count
);
196 EXPORT_SYMBOL(iowrite32_rep
);
199 * Create a virtual mapping cookie for an IO port range
201 * This uses the same mapping are as the in/out family which has to be setup
202 * by the platform initialization code.
204 * Just to make matters somewhat more interesting on MIPS systems with
205 * multiple host bridge each will have it's own ioport address space.
207 static void __iomem
*ioport_map_legacy(unsigned long port
, unsigned int nr
)
209 return (void __iomem
*) (mips_io_port_base
+ port
);
212 void __iomem
*ioport_map(unsigned long port
, unsigned int nr
)
217 return ioport_map_legacy(port
, nr
);
220 EXPORT_SYMBOL(ioport_map
);
222 void ioport_unmap(void __iomem
*addr
)
227 EXPORT_SYMBOL(ioport_unmap
);