xref: /openbmc/linux/arch/alpha/include/asm/io.h (revision 75078afe)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2024b246eSLinus Torvalds #ifndef __ALPHA_IO_H
3024b246eSLinus Torvalds #define __ALPHA_IO_H
4024b246eSLinus Torvalds 
5024b246eSLinus Torvalds #ifdef __KERNEL__
6024b246eSLinus Torvalds 
7024b246eSLinus Torvalds #include <linux/kernel.h>
8024b246eSLinus Torvalds #include <linux/mm.h>
9024b246eSLinus Torvalds #include <asm/compiler.h>
10024b246eSLinus Torvalds #include <asm/machvec.h>
11024b246eSLinus Torvalds #include <asm/hwrpb.h>
12024b246eSLinus Torvalds 
13024b246eSLinus Torvalds /* The generic header contains only prototypes.  Including it ensures that
14024b246eSLinus Torvalds    the implementation we have here matches that interface.  */
15024b246eSLinus Torvalds #include <asm-generic/iomap.h>
16024b246eSLinus Torvalds 
17024b246eSLinus Torvalds /*
18024b246eSLinus Torvalds  * Virtual -> physical identity mapping starts at this offset
19024b246eSLinus Torvalds  */
20024b246eSLinus Torvalds #ifdef USE_48_BIT_KSEG
21024b246eSLinus Torvalds #define IDENT_ADDR     0xffff800000000000UL
22024b246eSLinus Torvalds #else
23024b246eSLinus Torvalds #define IDENT_ADDR     0xfffffc0000000000UL
24024b246eSLinus Torvalds #endif
25024b246eSLinus Torvalds 
26024b246eSLinus Torvalds /*
27024b246eSLinus Torvalds  * We try to avoid hae updates (thus the cache), but when we
28024b246eSLinus Torvalds  * do need to update the hae, we need to do it atomically, so
29024b246eSLinus Torvalds  * that any interrupts wouldn't get confused with the hae
30024b246eSLinus Torvalds  * register not being up-to-date with respect to the hardware
31024b246eSLinus Torvalds  * value.
32024b246eSLinus Torvalds  */
__set_hae(unsigned long new_hae)33024b246eSLinus Torvalds extern inline void __set_hae(unsigned long new_hae)
34024b246eSLinus Torvalds {
35e2609f6aSIvan Kokshaysky 	unsigned long flags = swpipl(IPL_MAX);
36e2609f6aSIvan Kokshaysky 
37e2609f6aSIvan Kokshaysky 	barrier();
38024b246eSLinus Torvalds 
39024b246eSLinus Torvalds 	alpha_mv.hae_cache = new_hae;
40024b246eSLinus Torvalds 	*alpha_mv.hae_register = new_hae;
41024b246eSLinus Torvalds 	mb();
42024b246eSLinus Torvalds 	/* Re-read to make sure it was written.  */
43024b246eSLinus Torvalds 	new_hae = *alpha_mv.hae_register;
44024b246eSLinus Torvalds 
45e2609f6aSIvan Kokshaysky 	setipl(flags);
46e2609f6aSIvan Kokshaysky 	barrier();
47024b246eSLinus Torvalds }
48024b246eSLinus Torvalds 
set_hae(unsigned long new_hae)49024b246eSLinus Torvalds extern inline void set_hae(unsigned long new_hae)
50024b246eSLinus Torvalds {
51024b246eSLinus Torvalds 	if (new_hae != alpha_mv.hae_cache)
52024b246eSLinus Torvalds 		__set_hae(new_hae);
53024b246eSLinus Torvalds }
54024b246eSLinus Torvalds 
55024b246eSLinus Torvalds /*
56024b246eSLinus Torvalds  * Change virtual addresses to physical addresses and vv.
57024b246eSLinus Torvalds  */
58024b246eSLinus Torvalds #ifdef USE_48_BIT_KSEG
virt_to_phys(volatile void * address)5935a3f4efSGuenter Roeck static inline unsigned long virt_to_phys(volatile void *address)
60024b246eSLinus Torvalds {
61024b246eSLinus Torvalds 	return (unsigned long)address - IDENT_ADDR;
62024b246eSLinus Torvalds }
63024b246eSLinus Torvalds 
phys_to_virt(unsigned long address)64024b246eSLinus Torvalds static inline void * phys_to_virt(unsigned long address)
65024b246eSLinus Torvalds {
66024b246eSLinus Torvalds 	return (void *) (address + IDENT_ADDR);
67024b246eSLinus Torvalds }
68024b246eSLinus Torvalds #else
virt_to_phys(volatile void * address)6935a3f4efSGuenter Roeck static inline unsigned long virt_to_phys(volatile void *address)
70024b246eSLinus Torvalds {
71024b246eSLinus Torvalds         unsigned long phys = (unsigned long)address;
72024b246eSLinus Torvalds 
73024b246eSLinus Torvalds 	/* Sign-extend from bit 41.  */
74024b246eSLinus Torvalds 	phys <<= (64 - 41);
75024b246eSLinus Torvalds 	phys = (long)phys >> (64 - 41);
76024b246eSLinus Torvalds 
77024b246eSLinus Torvalds 	/* Crop to the physical address width of the processor.  */
78024b246eSLinus Torvalds         phys &= (1ul << hwrpb->pa_bits) - 1;
79024b246eSLinus Torvalds 
80024b246eSLinus Torvalds         return phys;
81024b246eSLinus Torvalds }
82024b246eSLinus Torvalds 
phys_to_virt(unsigned long address)83024b246eSLinus Torvalds static inline void * phys_to_virt(unsigned long address)
84024b246eSLinus Torvalds {
85024b246eSLinus Torvalds         return (void *)(IDENT_ADDR + (address & ((1ul << 41) - 1)));
86024b246eSLinus Torvalds }
87024b246eSLinus Torvalds #endif
88024b246eSLinus Torvalds 
897e772dadSLinus Walleij #define virt_to_phys		virt_to_phys
907e772dadSLinus Walleij #define phys_to_virt		phys_to_virt
91024b246eSLinus Torvalds #define page_to_phys(page)	page_to_pa(page)
92024b246eSLinus Torvalds 
93024b246eSLinus Torvalds /* Maximum PIO space address supported?  */
94024b246eSLinus Torvalds #define IO_SPACE_LIMIT 0xffff
95024b246eSLinus Torvalds 
96024b246eSLinus Torvalds /*
97024b246eSLinus Torvalds  * Change addresses as seen by the kernel (virtual) to addresses as
98024b246eSLinus Torvalds  * seen by a device (bus), and vice versa.
99024b246eSLinus Torvalds  *
100024b246eSLinus Torvalds  * Note that this only works for a limited range of kernel addresses,
101024b246eSLinus Torvalds  * and very well may not span all memory.  Consider this interface
102024b246eSLinus Torvalds  * deprecated in favour of the DMA-mapping API.
103024b246eSLinus Torvalds  */
104024b246eSLinus Torvalds extern unsigned long __direct_map_base;
105024b246eSLinus Torvalds extern unsigned long __direct_map_size;
106024b246eSLinus Torvalds 
isa_virt_to_bus(volatile void * address)1074313a249SArnd Bergmann static inline unsigned long __deprecated isa_virt_to_bus(volatile void *address)
108024b246eSLinus Torvalds {
109024b246eSLinus Torvalds 	unsigned long phys = virt_to_phys(address);
110024b246eSLinus Torvalds 	unsigned long bus = phys + __direct_map_base;
111024b246eSLinus Torvalds 	return phys <= __direct_map_size ? bus : 0;
112024b246eSLinus Torvalds }
1134313a249SArnd Bergmann #define isa_virt_to_bus isa_virt_to_bus
114024b246eSLinus Torvalds 
isa_bus_to_virt(unsigned long address)1154313a249SArnd Bergmann static inline void * __deprecated isa_bus_to_virt(unsigned long address)
116024b246eSLinus Torvalds {
117024b246eSLinus Torvalds 	void *virt;
118024b246eSLinus Torvalds 
119024b246eSLinus Torvalds 	/* This check is a sanity check but also ensures that bus address 0
120024b246eSLinus Torvalds 	   maps to virtual address 0 which is useful to detect null pointers
121024b246eSLinus Torvalds 	   (the NCR driver is much simpler if NULL pointers are preserved).  */
122024b246eSLinus Torvalds 	address -= __direct_map_base;
123024b246eSLinus Torvalds 	virt = phys_to_virt(address);
124024b246eSLinus Torvalds 	return (long)address <= 0 ? NULL : virt;
125024b246eSLinus Torvalds }
1264313a249SArnd Bergmann #define isa_bus_to_virt isa_bus_to_virt
127024b246eSLinus Torvalds 
128024b246eSLinus Torvalds /*
129024b246eSLinus Torvalds  * There are different chipsets to interface the Alpha CPUs to the world.
130024b246eSLinus Torvalds  */
131024b246eSLinus Torvalds 
132024b246eSLinus Torvalds #define IO_CONCAT(a,b)	_IO_CONCAT(a,b)
133024b246eSLinus Torvalds #define _IO_CONCAT(a,b)	a ## _ ## b
134024b246eSLinus Torvalds 
135024b246eSLinus Torvalds #ifdef CONFIG_ALPHA_GENERIC
136024b246eSLinus Torvalds 
137024b246eSLinus Torvalds /* In a generic kernel, we always go through the machine vector.  */
138024b246eSLinus Torvalds 
139024b246eSLinus Torvalds #define REMAP1(TYPE, NAME, QUAL)					\
140024b246eSLinus Torvalds static inline TYPE generic_##NAME(QUAL void __iomem *addr)		\
141024b246eSLinus Torvalds {									\
142024b246eSLinus Torvalds 	return alpha_mv.mv_##NAME(addr);				\
143024b246eSLinus Torvalds }
144024b246eSLinus Torvalds 
145024b246eSLinus Torvalds #define REMAP2(TYPE, NAME, QUAL)					\
146024b246eSLinus Torvalds static inline void generic_##NAME(TYPE b, QUAL void __iomem *addr)	\
147024b246eSLinus Torvalds {									\
148024b246eSLinus Torvalds 	alpha_mv.mv_##NAME(b, addr);					\
149024b246eSLinus Torvalds }
150024b246eSLinus Torvalds 
REMAP1(unsigned int,ioread8,const)1518f28ca6bSKrzysztof Kozlowski REMAP1(unsigned int, ioread8, const)
1528f28ca6bSKrzysztof Kozlowski REMAP1(unsigned int, ioread16, const)
1538f28ca6bSKrzysztof Kozlowski REMAP1(unsigned int, ioread32, const)
154*e19d4ebcSArnd Bergmann REMAP1(u64, ioread64, const)
155024b246eSLinus Torvalds REMAP1(u8, readb, const volatile)
156024b246eSLinus Torvalds REMAP1(u16, readw, const volatile)
157024b246eSLinus Torvalds REMAP1(u32, readl, const volatile)
158024b246eSLinus Torvalds REMAP1(u64, readq, const volatile)
159024b246eSLinus Torvalds 
160024b246eSLinus Torvalds REMAP2(u8, iowrite8, /**/)
161024b246eSLinus Torvalds REMAP2(u16, iowrite16, /**/)
162024b246eSLinus Torvalds REMAP2(u32, iowrite32, /**/)
163*e19d4ebcSArnd Bergmann REMAP2(u64, iowrite64, /**/)
164024b246eSLinus Torvalds REMAP2(u8, writeb, volatile)
165024b246eSLinus Torvalds REMAP2(u16, writew, volatile)
166024b246eSLinus Torvalds REMAP2(u32, writel, volatile)
167024b246eSLinus Torvalds REMAP2(u64, writeq, volatile)
168024b246eSLinus Torvalds 
169024b246eSLinus Torvalds #undef REMAP1
170024b246eSLinus Torvalds #undef REMAP2
171024b246eSLinus Torvalds 
172024b246eSLinus Torvalds extern inline void __iomem *generic_ioportmap(unsigned long a)
173024b246eSLinus Torvalds {
174024b246eSLinus Torvalds 	return alpha_mv.mv_ioportmap(a);
175024b246eSLinus Torvalds }
176024b246eSLinus Torvalds 
generic_ioremap(unsigned long a,unsigned long s)177024b246eSLinus Torvalds static inline void __iomem *generic_ioremap(unsigned long a, unsigned long s)
178024b246eSLinus Torvalds {
179024b246eSLinus Torvalds 	return alpha_mv.mv_ioremap(a, s);
180024b246eSLinus Torvalds }
181024b246eSLinus Torvalds 
generic_iounmap(volatile void __iomem * a)182024b246eSLinus Torvalds static inline void generic_iounmap(volatile void __iomem *a)
183024b246eSLinus Torvalds {
184024b246eSLinus Torvalds 	return alpha_mv.mv_iounmap(a);
185024b246eSLinus Torvalds }
186024b246eSLinus Torvalds 
generic_is_ioaddr(unsigned long a)187024b246eSLinus Torvalds static inline int generic_is_ioaddr(unsigned long a)
188024b246eSLinus Torvalds {
189024b246eSLinus Torvalds 	return alpha_mv.mv_is_ioaddr(a);
190024b246eSLinus Torvalds }
191024b246eSLinus Torvalds 
generic_is_mmio(const volatile void __iomem * a)192024b246eSLinus Torvalds static inline int generic_is_mmio(const volatile void __iomem *a)
193024b246eSLinus Torvalds {
194024b246eSLinus Torvalds 	return alpha_mv.mv_is_mmio(a);
195024b246eSLinus Torvalds }
196024b246eSLinus Torvalds 
197024b246eSLinus Torvalds #define __IO_PREFIX		generic
198024b246eSLinus Torvalds #define generic_trivial_rw_bw	0
199024b246eSLinus Torvalds #define generic_trivial_rw_lq	0
200024b246eSLinus Torvalds #define generic_trivial_io_bw	0
201024b246eSLinus Torvalds #define generic_trivial_io_lq	0
202024b246eSLinus Torvalds #define generic_trivial_iounmap	0
203024b246eSLinus Torvalds 
204024b246eSLinus Torvalds #else
205024b246eSLinus Torvalds 
206024b246eSLinus Torvalds #if defined(CONFIG_ALPHA_APECS)
207024b246eSLinus Torvalds # include <asm/core_apecs.h>
208024b246eSLinus Torvalds #elif defined(CONFIG_ALPHA_CIA)
209024b246eSLinus Torvalds # include <asm/core_cia.h>
210024b246eSLinus Torvalds #elif defined(CONFIG_ALPHA_IRONGATE)
211024b246eSLinus Torvalds # include <asm/core_irongate.h>
212024b246eSLinus Torvalds #elif defined(CONFIG_ALPHA_JENSEN)
213024b246eSLinus Torvalds # include <asm/jensen.h>
214024b246eSLinus Torvalds #elif defined(CONFIG_ALPHA_LCA)
215024b246eSLinus Torvalds # include <asm/core_lca.h>
216024b246eSLinus Torvalds #elif defined(CONFIG_ALPHA_MARVEL)
217024b246eSLinus Torvalds # include <asm/core_marvel.h>
218024b246eSLinus Torvalds #elif defined(CONFIG_ALPHA_MCPCIA)
219024b246eSLinus Torvalds # include <asm/core_mcpcia.h>
220024b246eSLinus Torvalds #elif defined(CONFIG_ALPHA_POLARIS)
221024b246eSLinus Torvalds # include <asm/core_polaris.h>
222024b246eSLinus Torvalds #elif defined(CONFIG_ALPHA_T2)
223024b246eSLinus Torvalds # include <asm/core_t2.h>
224024b246eSLinus Torvalds #elif defined(CONFIG_ALPHA_TSUNAMI)
225024b246eSLinus Torvalds # include <asm/core_tsunami.h>
226024b246eSLinus Torvalds #elif defined(CONFIG_ALPHA_TITAN)
227024b246eSLinus Torvalds # include <asm/core_titan.h>
228024b246eSLinus Torvalds #elif defined(CONFIG_ALPHA_WILDFIRE)
229024b246eSLinus Torvalds # include <asm/core_wildfire.h>
230024b246eSLinus Torvalds #else
231024b246eSLinus Torvalds #error "What system is this?"
232024b246eSLinus Torvalds #endif
233024b246eSLinus Torvalds 
234024b246eSLinus Torvalds #endif /* GENERIC */
235024b246eSLinus Torvalds 
236024b246eSLinus Torvalds /*
237024b246eSLinus Torvalds  * We always have external versions of these routines.
238024b246eSLinus Torvalds  */
239024b246eSLinus Torvalds extern u8		inb(unsigned long port);
240024b246eSLinus Torvalds extern u16		inw(unsigned long port);
241024b246eSLinus Torvalds extern u32		inl(unsigned long port);
242024b246eSLinus Torvalds extern void		outb(u8 b, unsigned long port);
243024b246eSLinus Torvalds extern void		outw(u16 b, unsigned long port);
244024b246eSLinus Torvalds extern void		outl(u32 b, unsigned long port);
2457e772dadSLinus Walleij #define inb inb
2467e772dadSLinus Walleij #define inw inw
2477e772dadSLinus Walleij #define inl inl
2487e772dadSLinus Walleij #define outb outb
2497e772dadSLinus Walleij #define outw outw
2507e772dadSLinus Walleij #define outl outl
251024b246eSLinus Torvalds 
252024b246eSLinus Torvalds extern u8		readb(const volatile void __iomem *addr);
253024b246eSLinus Torvalds extern u16		readw(const volatile void __iomem *addr);
254024b246eSLinus Torvalds extern u32		readl(const volatile void __iomem *addr);
255024b246eSLinus Torvalds extern u64		readq(const volatile void __iomem *addr);
256024b246eSLinus Torvalds extern void		writeb(u8 b, volatile void __iomem *addr);
257024b246eSLinus Torvalds extern void		writew(u16 b, volatile void __iomem *addr);
258024b246eSLinus Torvalds extern void		writel(u32 b, volatile void __iomem *addr);
259024b246eSLinus Torvalds extern void		writeq(u64 b, volatile void __iomem *addr);
2607e772dadSLinus Walleij #define readb readb
2617e772dadSLinus Walleij #define readw readw
2627e772dadSLinus Walleij #define readl readl
2637e772dadSLinus Walleij #define readq readq
2647e772dadSLinus Walleij #define writeb writeb
2657e772dadSLinus Walleij #define writew writew
2667e772dadSLinus Walleij #define writel writel
2677e772dadSLinus Walleij #define writeq writeq
268024b246eSLinus Torvalds 
269024b246eSLinus Torvalds extern u8		__raw_readb(const volatile void __iomem *addr);
270024b246eSLinus Torvalds extern u16		__raw_readw(const volatile void __iomem *addr);
271024b246eSLinus Torvalds extern u32		__raw_readl(const volatile void __iomem *addr);
272024b246eSLinus Torvalds extern u64		__raw_readq(const volatile void __iomem *addr);
273024b246eSLinus Torvalds extern void		__raw_writeb(u8 b, volatile void __iomem *addr);
274024b246eSLinus Torvalds extern void		__raw_writew(u16 b, volatile void __iomem *addr);
275024b246eSLinus Torvalds extern void		__raw_writel(u32 b, volatile void __iomem *addr);
276024b246eSLinus Torvalds extern void		__raw_writeq(u64 b, volatile void __iomem *addr);
2777e772dadSLinus Walleij #define __raw_readb __raw_readb
2787e772dadSLinus Walleij #define __raw_readw __raw_readw
2797e772dadSLinus Walleij #define __raw_readl __raw_readl
2807e772dadSLinus Walleij #define __raw_readq __raw_readq
2817e772dadSLinus Walleij #define __raw_writeb __raw_writeb
2827e772dadSLinus Walleij #define __raw_writew __raw_writew
2837e772dadSLinus Walleij #define __raw_writel __raw_writel
2847e772dadSLinus Walleij #define __raw_writeq __raw_writeq
285024b246eSLinus Torvalds 
286024b246eSLinus Torvalds /*
287024b246eSLinus Torvalds  * Mapping from port numbers to __iomem space is pretty easy.
288024b246eSLinus Torvalds  */
289024b246eSLinus Torvalds 
290024b246eSLinus Torvalds /* These two have to be extern inline because of the extern prototype from
291024b246eSLinus Torvalds    <asm-generic/iomap.h>.  It is not legal to mix "extern" and "static" for
292024b246eSLinus Torvalds    the same declaration.  */
ioport_map(unsigned long port,unsigned int size)293024b246eSLinus Torvalds extern inline void __iomem *ioport_map(unsigned long port, unsigned int size)
294024b246eSLinus Torvalds {
295024b246eSLinus Torvalds 	return IO_CONCAT(__IO_PREFIX,ioportmap) (port);
296024b246eSLinus Torvalds }
297024b246eSLinus Torvalds 
ioport_unmap(void __iomem * addr)298024b246eSLinus Torvalds extern inline void ioport_unmap(void __iomem *addr)
299024b246eSLinus Torvalds {
300024b246eSLinus Torvalds }
301024b246eSLinus Torvalds 
3027e772dadSLinus Walleij #define ioport_map ioport_map
3037e772dadSLinus Walleij #define ioport_unmap ioport_unmap
3047e772dadSLinus Walleij 
ioremap(unsigned long port,unsigned long size)305024b246eSLinus Torvalds static inline void __iomem *ioremap(unsigned long port, unsigned long size)
306024b246eSLinus Torvalds {
307024b246eSLinus Torvalds 	return IO_CONCAT(__IO_PREFIX,ioremap) (port, size);
308024b246eSLinus Torvalds }
309024b246eSLinus Torvalds 
3104bdc0d67SChristoph Hellwig #define ioremap_wc ioremap
3114bdc0d67SChristoph Hellwig #define ioremap_uc ioremap
312024b246eSLinus Torvalds 
iounmap(volatile void __iomem * addr)313024b246eSLinus Torvalds static inline void iounmap(volatile void __iomem *addr)
314024b246eSLinus Torvalds {
315024b246eSLinus Torvalds 	IO_CONCAT(__IO_PREFIX,iounmap)(addr);
316024b246eSLinus Torvalds }
317024b246eSLinus Torvalds 
__is_ioaddr(unsigned long addr)318024b246eSLinus Torvalds static inline int __is_ioaddr(unsigned long addr)
319024b246eSLinus Torvalds {
320024b246eSLinus Torvalds 	return IO_CONCAT(__IO_PREFIX,is_ioaddr)(addr);
321024b246eSLinus Torvalds }
322024b246eSLinus Torvalds #define __is_ioaddr(a)		__is_ioaddr((unsigned long)(a))
323024b246eSLinus Torvalds 
__is_mmio(const volatile void __iomem * addr)324024b246eSLinus Torvalds static inline int __is_mmio(const volatile void __iomem *addr)
325024b246eSLinus Torvalds {
326024b246eSLinus Torvalds 	return IO_CONCAT(__IO_PREFIX,is_mmio)(addr);
327024b246eSLinus Torvalds }
328024b246eSLinus Torvalds 
329024b246eSLinus Torvalds 
330024b246eSLinus Torvalds /*
331024b246eSLinus Torvalds  * If the actual I/O bits are sufficiently trivial, then expand inline.
332024b246eSLinus Torvalds  */
333024b246eSLinus Torvalds 
334024b246eSLinus Torvalds #if IO_CONCAT(__IO_PREFIX,trivial_io_bw)
ioread8(const void __iomem * addr)3358f28ca6bSKrzysztof Kozlowski extern inline unsigned int ioread8(const void __iomem *addr)
336024b246eSLinus Torvalds {
33754505a1eSMikulas Patocka 	unsigned int ret;
33854505a1eSMikulas Patocka 	mb();
33954505a1eSMikulas Patocka 	ret = IO_CONCAT(__IO_PREFIX,ioread8)(addr);
340024b246eSLinus Torvalds 	mb();
341024b246eSLinus Torvalds 	return ret;
342024b246eSLinus Torvalds }
343024b246eSLinus Torvalds 
ioread16(const void __iomem * addr)3448f28ca6bSKrzysztof Kozlowski extern inline unsigned int ioread16(const void __iomem *addr)
345024b246eSLinus Torvalds {
34654505a1eSMikulas Patocka 	unsigned int ret;
34754505a1eSMikulas Patocka 	mb();
34854505a1eSMikulas Patocka 	ret = IO_CONCAT(__IO_PREFIX,ioread16)(addr);
349024b246eSLinus Torvalds 	mb();
350024b246eSLinus Torvalds 	return ret;
351024b246eSLinus Torvalds }
352024b246eSLinus Torvalds 
iowrite8(u8 b,void __iomem * addr)353024b246eSLinus Torvalds extern inline void iowrite8(u8 b, void __iomem *addr)
354024b246eSLinus Torvalds {
355024b246eSLinus Torvalds 	mb();
356cd0e00c1SSinan Kaya 	IO_CONCAT(__IO_PREFIX, iowrite8)(b, addr);
357024b246eSLinus Torvalds }
358024b246eSLinus Torvalds 
iowrite16(u16 b,void __iomem * addr)359024b246eSLinus Torvalds extern inline void iowrite16(u16 b, void __iomem *addr)
360024b246eSLinus Torvalds {
361024b246eSLinus Torvalds 	mb();
362cd0e00c1SSinan Kaya 	IO_CONCAT(__IO_PREFIX, iowrite16)(b, addr);
363024b246eSLinus Torvalds }
364024b246eSLinus Torvalds 
inb(unsigned long port)365024b246eSLinus Torvalds extern inline u8 inb(unsigned long port)
366024b246eSLinus Torvalds {
367024b246eSLinus Torvalds 	return ioread8(ioport_map(port, 1));
368024b246eSLinus Torvalds }
369024b246eSLinus Torvalds 
inw(unsigned long port)370024b246eSLinus Torvalds extern inline u16 inw(unsigned long port)
371024b246eSLinus Torvalds {
372024b246eSLinus Torvalds 	return ioread16(ioport_map(port, 2));
373024b246eSLinus Torvalds }
374024b246eSLinus Torvalds 
outb(u8 b,unsigned long port)375024b246eSLinus Torvalds extern inline void outb(u8 b, unsigned long port)
376024b246eSLinus Torvalds {
377024b246eSLinus Torvalds 	iowrite8(b, ioport_map(port, 1));
378024b246eSLinus Torvalds }
379024b246eSLinus Torvalds 
outw(u16 b,unsigned long port)380024b246eSLinus Torvalds extern inline void outw(u16 b, unsigned long port)
381024b246eSLinus Torvalds {
382024b246eSLinus Torvalds 	iowrite16(b, ioport_map(port, 2));
383024b246eSLinus Torvalds }
384024b246eSLinus Torvalds #endif
385024b246eSLinus Torvalds 
3867e772dadSLinus Walleij #define ioread8 ioread8
3877e772dadSLinus Walleij #define ioread16 ioread16
3887e772dadSLinus Walleij #define iowrite8 iowrite8
3897e772dadSLinus Walleij #define iowrite16 iowrite16
3907e772dadSLinus Walleij 
391024b246eSLinus Torvalds #if IO_CONCAT(__IO_PREFIX,trivial_io_lq)
ioread32(const void __iomem * addr)3928f28ca6bSKrzysztof Kozlowski extern inline unsigned int ioread32(const void __iomem *addr)
393024b246eSLinus Torvalds {
39454505a1eSMikulas Patocka 	unsigned int ret;
39554505a1eSMikulas Patocka 	mb();
39654505a1eSMikulas Patocka 	ret = IO_CONCAT(__IO_PREFIX,ioread32)(addr);
397024b246eSLinus Torvalds 	mb();
398024b246eSLinus Torvalds 	return ret;
399024b246eSLinus Torvalds }
400024b246eSLinus Torvalds 
ioread64(const void __iomem * addr)401*e19d4ebcSArnd Bergmann extern inline u64 ioread64(const void __iomem *addr)
402*e19d4ebcSArnd Bergmann {
403*e19d4ebcSArnd Bergmann 	unsigned int ret;
404*e19d4ebcSArnd Bergmann 	mb();
405*e19d4ebcSArnd Bergmann 	ret = IO_CONCAT(__IO_PREFIX,ioread64)(addr);
406*e19d4ebcSArnd Bergmann 	mb();
407*e19d4ebcSArnd Bergmann 	return ret;
408*e19d4ebcSArnd Bergmann }
409*e19d4ebcSArnd Bergmann 
iowrite32(u32 b,void __iomem * addr)410024b246eSLinus Torvalds extern inline void iowrite32(u32 b, void __iomem *addr)
411024b246eSLinus Torvalds {
412024b246eSLinus Torvalds 	mb();
413cd0e00c1SSinan Kaya 	IO_CONCAT(__IO_PREFIX, iowrite32)(b, addr);
414024b246eSLinus Torvalds }
415024b246eSLinus Torvalds 
iowrite64(u64 b,void __iomem * addr)416*e19d4ebcSArnd Bergmann extern inline void iowrite64(u64 b, void __iomem *addr)
417*e19d4ebcSArnd Bergmann {
418*e19d4ebcSArnd Bergmann 	mb();
419*e19d4ebcSArnd Bergmann 	IO_CONCAT(__IO_PREFIX, iowrite64)(b, addr);
420*e19d4ebcSArnd Bergmann }
421*e19d4ebcSArnd Bergmann 
inl(unsigned long port)422024b246eSLinus Torvalds extern inline u32 inl(unsigned long port)
423024b246eSLinus Torvalds {
424024b246eSLinus Torvalds 	return ioread32(ioport_map(port, 4));
425024b246eSLinus Torvalds }
426024b246eSLinus Torvalds 
outl(u32 b,unsigned long port)427024b246eSLinus Torvalds extern inline void outl(u32 b, unsigned long port)
428024b246eSLinus Torvalds {
429024b246eSLinus Torvalds 	iowrite32(b, ioport_map(port, 4));
430024b246eSLinus Torvalds }
431024b246eSLinus Torvalds #endif
432024b246eSLinus Torvalds 
4337e772dadSLinus Walleij #define ioread32 ioread32
434*e19d4ebcSArnd Bergmann #define ioread64 ioread64
4357e772dadSLinus Walleij #define iowrite32 iowrite32
436*e19d4ebcSArnd Bergmann #define iowrite64 iowrite64
4377e772dadSLinus Walleij 
438024b246eSLinus Torvalds #if IO_CONCAT(__IO_PREFIX,trivial_rw_bw) == 1
__raw_readb(const volatile void __iomem * addr)439024b246eSLinus Torvalds extern inline u8 __raw_readb(const volatile void __iomem *addr)
440024b246eSLinus Torvalds {
441024b246eSLinus Torvalds 	return IO_CONCAT(__IO_PREFIX,readb)(addr);
442024b246eSLinus Torvalds }
443024b246eSLinus Torvalds 
__raw_readw(const volatile void __iomem * addr)444024b246eSLinus Torvalds extern inline u16 __raw_readw(const volatile void __iomem *addr)
445024b246eSLinus Torvalds {
446024b246eSLinus Torvalds 	return IO_CONCAT(__IO_PREFIX,readw)(addr);
447024b246eSLinus Torvalds }
448024b246eSLinus Torvalds 
__raw_writeb(u8 b,volatile void __iomem * addr)449024b246eSLinus Torvalds extern inline void __raw_writeb(u8 b, volatile void __iomem *addr)
450024b246eSLinus Torvalds {
451024b246eSLinus Torvalds 	IO_CONCAT(__IO_PREFIX,writeb)(b, addr);
452024b246eSLinus Torvalds }
453024b246eSLinus Torvalds 
__raw_writew(u16 b,volatile void __iomem * addr)454024b246eSLinus Torvalds extern inline void __raw_writew(u16 b, volatile void __iomem *addr)
455024b246eSLinus Torvalds {
456024b246eSLinus Torvalds 	IO_CONCAT(__IO_PREFIX,writew)(b, addr);
457024b246eSLinus Torvalds }
458024b246eSLinus Torvalds 
readb(const volatile void __iomem * addr)459024b246eSLinus Torvalds extern inline u8 readb(const volatile void __iomem *addr)
460024b246eSLinus Torvalds {
46154505a1eSMikulas Patocka 	u8 ret;
46254505a1eSMikulas Patocka 	mb();
46354505a1eSMikulas Patocka 	ret = __raw_readb(addr);
464024b246eSLinus Torvalds 	mb();
465024b246eSLinus Torvalds 	return ret;
466024b246eSLinus Torvalds }
467024b246eSLinus Torvalds 
readw(const volatile void __iomem * addr)468024b246eSLinus Torvalds extern inline u16 readw(const volatile void __iomem *addr)
469024b246eSLinus Torvalds {
47054505a1eSMikulas Patocka 	u16 ret;
47154505a1eSMikulas Patocka 	mb();
47254505a1eSMikulas Patocka 	ret = __raw_readw(addr);
473024b246eSLinus Torvalds 	mb();
474024b246eSLinus Torvalds 	return ret;
475024b246eSLinus Torvalds }
476024b246eSLinus Torvalds 
writeb(u8 b,volatile void __iomem * addr)477024b246eSLinus Torvalds extern inline void writeb(u8 b, volatile void __iomem *addr)
478024b246eSLinus Torvalds {
479024b246eSLinus Torvalds 	mb();
480cd0e00c1SSinan Kaya 	__raw_writeb(b, addr);
481024b246eSLinus Torvalds }
482024b246eSLinus Torvalds 
writew(u16 b,volatile void __iomem * addr)483024b246eSLinus Torvalds extern inline void writew(u16 b, volatile void __iomem *addr)
484024b246eSLinus Torvalds {
485024b246eSLinus Torvalds 	mb();
486cd0e00c1SSinan Kaya 	__raw_writew(b, addr);
487024b246eSLinus Torvalds }
488024b246eSLinus Torvalds #endif
489024b246eSLinus Torvalds 
490024b246eSLinus Torvalds #if IO_CONCAT(__IO_PREFIX,trivial_rw_lq) == 1
__raw_readl(const volatile void __iomem * addr)491024b246eSLinus Torvalds extern inline u32 __raw_readl(const volatile void __iomem *addr)
492024b246eSLinus Torvalds {
493024b246eSLinus Torvalds 	return IO_CONCAT(__IO_PREFIX,readl)(addr);
494024b246eSLinus Torvalds }
495024b246eSLinus Torvalds 
__raw_readq(const volatile void __iomem * addr)496024b246eSLinus Torvalds extern inline u64 __raw_readq(const volatile void __iomem *addr)
497024b246eSLinus Torvalds {
498024b246eSLinus Torvalds 	return IO_CONCAT(__IO_PREFIX,readq)(addr);
499024b246eSLinus Torvalds }
500024b246eSLinus Torvalds 
__raw_writel(u32 b,volatile void __iomem * addr)501024b246eSLinus Torvalds extern inline void __raw_writel(u32 b, volatile void __iomem *addr)
502024b246eSLinus Torvalds {
503024b246eSLinus Torvalds 	IO_CONCAT(__IO_PREFIX,writel)(b, addr);
504024b246eSLinus Torvalds }
505024b246eSLinus Torvalds 
__raw_writeq(u64 b,volatile void __iomem * addr)506024b246eSLinus Torvalds extern inline void __raw_writeq(u64 b, volatile void __iomem *addr)
507024b246eSLinus Torvalds {
508024b246eSLinus Torvalds 	IO_CONCAT(__IO_PREFIX,writeq)(b, addr);
509024b246eSLinus Torvalds }
510024b246eSLinus Torvalds 
readl(const volatile void __iomem * addr)511024b246eSLinus Torvalds extern inline u32 readl(const volatile void __iomem *addr)
512024b246eSLinus Torvalds {
51354505a1eSMikulas Patocka 	u32 ret;
51454505a1eSMikulas Patocka 	mb();
51554505a1eSMikulas Patocka 	ret = __raw_readl(addr);
516024b246eSLinus Torvalds 	mb();
517024b246eSLinus Torvalds 	return ret;
518024b246eSLinus Torvalds }
519024b246eSLinus Torvalds 
readq(const volatile void __iomem * addr)520024b246eSLinus Torvalds extern inline u64 readq(const volatile void __iomem *addr)
521024b246eSLinus Torvalds {
52254505a1eSMikulas Patocka 	u64 ret;
52354505a1eSMikulas Patocka 	mb();
52454505a1eSMikulas Patocka 	ret = __raw_readq(addr);
525024b246eSLinus Torvalds 	mb();
526024b246eSLinus Torvalds 	return ret;
527024b246eSLinus Torvalds }
528024b246eSLinus Torvalds 
writel(u32 b,volatile void __iomem * addr)529024b246eSLinus Torvalds extern inline void writel(u32 b, volatile void __iomem *addr)
530024b246eSLinus Torvalds {
531024b246eSLinus Torvalds 	mb();
532cd0e00c1SSinan Kaya 	__raw_writel(b, addr);
533024b246eSLinus Torvalds }
534024b246eSLinus Torvalds 
writeq(u64 b,volatile void __iomem * addr)535024b246eSLinus Torvalds extern inline void writeq(u64 b, volatile void __iomem *addr)
536024b246eSLinus Torvalds {
537024b246eSLinus Torvalds 	mb();
538cd0e00c1SSinan Kaya 	__raw_writeq(b, addr);
539024b246eSLinus Torvalds }
540024b246eSLinus Torvalds #endif
541024b246eSLinus Torvalds 
542bd72866bSLuc Van Oostenryck #define ioread16be(p) swab16(ioread16(p))
543bd72866bSLuc Van Oostenryck #define ioread32be(p) swab32(ioread32(p))
544bd72866bSLuc Van Oostenryck #define iowrite16be(v,p) iowrite16(swab16(v), (p))
545bd72866bSLuc Van Oostenryck #define iowrite32be(v,p) iowrite32(swab32(v), (p))
54625534eb7SMichael Cree 
547024b246eSLinus Torvalds #define inb_p		inb
548024b246eSLinus Torvalds #define inw_p		inw
549024b246eSLinus Torvalds #define inl_p		inl
550024b246eSLinus Torvalds #define outb_p		outb
551024b246eSLinus Torvalds #define outw_p		outw
552024b246eSLinus Torvalds #define outl_p		outl
55354505a1eSMikulas Patocka 
55454505a1eSMikulas Patocka extern u8 readb_relaxed(const volatile void __iomem *addr);
55554505a1eSMikulas Patocka extern u16 readw_relaxed(const volatile void __iomem *addr);
55654505a1eSMikulas Patocka extern u32 readl_relaxed(const volatile void __iomem *addr);
55754505a1eSMikulas Patocka extern u64 readq_relaxed(const volatile void __iomem *addr);
5587e772dadSLinus Walleij #define readb_relaxed readb_relaxed
5597e772dadSLinus Walleij #define readw_relaxed readw_relaxed
5607e772dadSLinus Walleij #define readl_relaxed readl_relaxed
5617e772dadSLinus Walleij #define readq_relaxed readq_relaxed
56254505a1eSMikulas Patocka 
56354505a1eSMikulas Patocka #if IO_CONCAT(__IO_PREFIX,trivial_io_bw)
readb_relaxed(const volatile void __iomem * addr)56454505a1eSMikulas Patocka extern inline u8 readb_relaxed(const volatile void __iomem *addr)
56554505a1eSMikulas Patocka {
56654505a1eSMikulas Patocka 	mb();
56754505a1eSMikulas Patocka 	return __raw_readb(addr);
56854505a1eSMikulas Patocka }
56954505a1eSMikulas Patocka 
readw_relaxed(const volatile void __iomem * addr)57054505a1eSMikulas Patocka extern inline u16 readw_relaxed(const volatile void __iomem *addr)
57154505a1eSMikulas Patocka {
57254505a1eSMikulas Patocka 	mb();
57354505a1eSMikulas Patocka 	return __raw_readw(addr);
57454505a1eSMikulas Patocka }
57554505a1eSMikulas Patocka #endif
57654505a1eSMikulas Patocka 
57754505a1eSMikulas Patocka #if IO_CONCAT(__IO_PREFIX,trivial_io_lq)
readl_relaxed(const volatile void __iomem * addr)57854505a1eSMikulas Patocka extern inline u32 readl_relaxed(const volatile void __iomem *addr)
57954505a1eSMikulas Patocka {
58054505a1eSMikulas Patocka 	mb();
58154505a1eSMikulas Patocka 	return __raw_readl(addr);
58254505a1eSMikulas Patocka }
58354505a1eSMikulas Patocka 
readq_relaxed(const volatile void __iomem * addr)58454505a1eSMikulas Patocka extern inline u64 readq_relaxed(const volatile void __iomem *addr)
58554505a1eSMikulas Patocka {
58654505a1eSMikulas Patocka 	mb();
58754505a1eSMikulas Patocka 	return __raw_readq(addr);
58854505a1eSMikulas Patocka }
58954505a1eSMikulas Patocka #endif
59054505a1eSMikulas Patocka 
59154505a1eSMikulas Patocka #define writeb_relaxed	writeb
59254505a1eSMikulas Patocka #define writew_relaxed	writew
59354505a1eSMikulas Patocka #define writel_relaxed	writel
59454505a1eSMikulas Patocka #define writeq_relaxed	writeq
595024b246eSLinus Torvalds 
596024b246eSLinus Torvalds /*
597024b246eSLinus Torvalds  * String version of IO memory access ops:
598024b246eSLinus Torvalds  */
599024b246eSLinus Torvalds extern void memcpy_fromio(void *, const volatile void __iomem *, long);
600024b246eSLinus Torvalds extern void memcpy_toio(volatile void __iomem *, const void *, long);
601024b246eSLinus Torvalds extern void _memset_c_io(volatile void __iomem *, unsigned long, long);
602024b246eSLinus Torvalds 
memset_io(volatile void __iomem * addr,u8 c,long len)603024b246eSLinus Torvalds static inline void memset_io(volatile void __iomem *addr, u8 c, long len)
604024b246eSLinus Torvalds {
605024b246eSLinus Torvalds 	_memset_c_io(addr, 0x0101010101010101UL * c, len);
606024b246eSLinus Torvalds }
607024b246eSLinus Torvalds 
608024b246eSLinus Torvalds #define __HAVE_ARCH_MEMSETW_IO
memsetw_io(volatile void __iomem * addr,u16 c,long len)609024b246eSLinus Torvalds static inline void memsetw_io(volatile void __iomem *addr, u16 c, long len)
610024b246eSLinus Torvalds {
611024b246eSLinus Torvalds 	_memset_c_io(addr, 0x0001000100010001UL * c, len);
612024b246eSLinus Torvalds }
613024b246eSLinus Torvalds 
6147e772dadSLinus Walleij #define memset_io memset_io
6157e772dadSLinus Walleij #define memcpy_fromio memcpy_fromio
6167e772dadSLinus Walleij #define memcpy_toio memcpy_toio
6177e772dadSLinus Walleij 
618024b246eSLinus Torvalds /*
619024b246eSLinus Torvalds  * String versions of in/out ops:
620024b246eSLinus Torvalds  */
621024b246eSLinus Torvalds extern void insb (unsigned long port, void *dst, unsigned long count);
622024b246eSLinus Torvalds extern void insw (unsigned long port, void *dst, unsigned long count);
623024b246eSLinus Torvalds extern void insl (unsigned long port, void *dst, unsigned long count);
624024b246eSLinus Torvalds extern void outsb (unsigned long port, const void *src, unsigned long count);
625024b246eSLinus Torvalds extern void outsw (unsigned long port, const void *src, unsigned long count);
626024b246eSLinus Torvalds extern void outsl (unsigned long port, const void *src, unsigned long count);
627024b246eSLinus Torvalds 
6287e772dadSLinus Walleij #define insb insb
6297e772dadSLinus Walleij #define insw insw
6307e772dadSLinus Walleij #define insl insl
6317e772dadSLinus Walleij #define outsb outsb
6327e772dadSLinus Walleij #define outsw outsw
6337e772dadSLinus Walleij #define outsl outsl
6347e772dadSLinus Walleij 
635024b246eSLinus Torvalds /*
636024b246eSLinus Torvalds  * The Alpha Jensen hardware for some rather strange reason puts
637024b246eSLinus Torvalds  * the RTC clock at 0x170 instead of 0x70. Probably due to some
638024b246eSLinus Torvalds  * misguided idea about using 0x70 for NMI stuff.
639024b246eSLinus Torvalds  *
640024b246eSLinus Torvalds  * These defines will override the defaults when doing RTC queries
641024b246eSLinus Torvalds  */
642024b246eSLinus Torvalds 
643024b246eSLinus Torvalds #ifdef CONFIG_ALPHA_GENERIC
644024b246eSLinus Torvalds # define RTC_PORT(x)	((x) + alpha_mv.rtc_port)
645024b246eSLinus Torvalds #else
646024b246eSLinus Torvalds # ifdef CONFIG_ALPHA_JENSEN
647024b246eSLinus Torvalds #  define RTC_PORT(x)	(0x170+(x))
648024b246eSLinus Torvalds # else
649024b246eSLinus Torvalds #  define RTC_PORT(x)	(0x70 + (x))
650024b246eSLinus Torvalds # endif
651024b246eSLinus Torvalds #endif
652024b246eSLinus Torvalds #define RTC_ALWAYS_BCD	0
653024b246eSLinus Torvalds 
654024b246eSLinus Torvalds /*
655024b246eSLinus Torvalds  * Convert a physical pointer to a virtual kernel pointer for /dev/mem
656024b246eSLinus Torvalds  * access
657024b246eSLinus Torvalds  */
658024b246eSLinus Torvalds #define xlate_dev_mem_ptr(p)	__va(p)
659024b246eSLinus Torvalds 
6607e772dadSLinus Walleij /*
6617e772dadSLinus Walleij  * These get provided from <asm-generic/iomap.h> since alpha does not
6627e772dadSLinus Walleij  * select GENERIC_IOMAP.
6637e772dadSLinus Walleij  */
6647e772dadSLinus Walleij #define ioread64 ioread64
6657e772dadSLinus Walleij #define iowrite64 iowrite64
6667e772dadSLinus Walleij #define ioread64be ioread64be
6677e772dadSLinus Walleij #define iowrite64be iowrite64be
6687e772dadSLinus Walleij #define ioread8_rep ioread8_rep
6697e772dadSLinus Walleij #define ioread16_rep ioread16_rep
6707e772dadSLinus Walleij #define ioread32_rep ioread32_rep
6717e772dadSLinus Walleij #define iowrite8_rep iowrite8_rep
6727e772dadSLinus Walleij #define iowrite16_rep iowrite16_rep
6737e772dadSLinus Walleij #define iowrite32_rep iowrite32_rep
6747e772dadSLinus Walleij #define pci_iounmap pci_iounmap
6757e772dadSLinus Walleij 
6767e772dadSLinus Walleij #include <asm-generic/io.h>
6777e772dadSLinus Walleij 
678024b246eSLinus Torvalds #endif /* __KERNEL__ */
679024b246eSLinus Torvalds 
680024b246eSLinus Torvalds #endif /* __ALPHA_IO_H */
681