11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef __ASM_SH_IO_H
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define __ASM_SH_IO_H
337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Convention:
614866543ad22014a0b12e10657a917eb6b487248Paul Mundt *    read{b,w,l,q}/write{b,w,l,q} are for PCI,
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *    while in{b,w,l}/out{b,w,l} are for ISA
814866543ad22014a0b12e10657a917eb6b487248Paul Mundt *
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * In addition we have 'pausing' versions: in{b,w,l}_p/out{b,w,l}_p
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * and 'string' versions: ins{b,w,l}/outs{b,w,l}
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
1214866543ad22014a0b12e10657a917eb6b487248Paul Mundt * While read{b,w,l,q} and write{b,w,l,q} contain memory barriers
1314866543ad22014a0b12e10657a917eb6b487248Paul Mundt * automatically, there are also __raw versions, which do not.
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
154f744affc345f8b158615e0cdd01d1f4985837c3Paul Mundt#include <linux/errno.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/cache.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/addrspace.h>
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/machvec.h>
19b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt#include <asm/pgtable.h>
20b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt#include <asm-generic/iomap.h>
21b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt
22b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt#ifdef __KERNEL__
2337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define __IO_PREFIX     generic
24b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt#include <asm/io_generic.h>
25e7cc9a7340b8ec018caa9eb1d035fdaef1f2fc51Magnus Damm#include <asm/io_trapped.h>
26b7e68d6876dfbab087bc3859211a9efc74cbe30cPaul Mundt#include <mach/mangle-port.h>
27b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt
2814866543ad22014a0b12e10657a917eb6b487248Paul Mundt#define __raw_writeb(v,a)	(__chk_io_ptr(a), *(volatile u8  __force *)(a) = (v))
2914866543ad22014a0b12e10657a917eb6b487248Paul Mundt#define __raw_writew(v,a)	(__chk_io_ptr(a), *(volatile u16 __force *)(a) = (v))
3014866543ad22014a0b12e10657a917eb6b487248Paul Mundt#define __raw_writel(v,a)	(__chk_io_ptr(a), *(volatile u32 __force *)(a) = (v))
3114866543ad22014a0b12e10657a917eb6b487248Paul Mundt#define __raw_writeq(v,a)	(__chk_io_ptr(a), *(volatile u64 __force *)(a) = (v))
3214866543ad22014a0b12e10657a917eb6b487248Paul Mundt
3314866543ad22014a0b12e10657a917eb6b487248Paul Mundt#define __raw_readb(a)		(__chk_io_ptr(a), *(volatile u8  __force *)(a))
3414866543ad22014a0b12e10657a917eb6b487248Paul Mundt#define __raw_readw(a)		(__chk_io_ptr(a), *(volatile u16 __force *)(a))
3514866543ad22014a0b12e10657a917eb6b487248Paul Mundt#define __raw_readl(a)		(__chk_io_ptr(a), *(volatile u32 __force *)(a))
3614866543ad22014a0b12e10657a917eb6b487248Paul Mundt#define __raw_readq(a)		(__chk_io_ptr(a), *(volatile u64 __force *)(a))
3714866543ad22014a0b12e10657a917eb6b487248Paul Mundt
38b7e68d6876dfbab087bc3859211a9efc74cbe30cPaul Mundt#define readb_relaxed(c)	({ u8  __v = ioswabb(__raw_readb(c)); __v; })
39b7e68d6876dfbab087bc3859211a9efc74cbe30cPaul Mundt#define readw_relaxed(c)	({ u16 __v = ioswabw(__raw_readw(c)); __v; })
40b7e68d6876dfbab087bc3859211a9efc74cbe30cPaul Mundt#define readl_relaxed(c)	({ u32 __v = ioswabl(__raw_readl(c)); __v; })
41b7e68d6876dfbab087bc3859211a9efc74cbe30cPaul Mundt#define readq_relaxed(c)	({ u64 __v = ioswabq(__raw_readq(c)); __v; })
42b7e68d6876dfbab087bc3859211a9efc74cbe30cPaul Mundt
43b7e68d6876dfbab087bc3859211a9efc74cbe30cPaul Mundt#define writeb_relaxed(v,c)	((void)__raw_writeb((__force  u8)ioswabb(v),c))
44b7e68d6876dfbab087bc3859211a9efc74cbe30cPaul Mundt#define writew_relaxed(v,c)	((void)__raw_writew((__force u16)ioswabw(v),c))
45b7e68d6876dfbab087bc3859211a9efc74cbe30cPaul Mundt#define writel_relaxed(v,c)	((void)__raw_writel((__force u32)ioswabl(v),c))
46b7e68d6876dfbab087bc3859211a9efc74cbe30cPaul Mundt#define writeq_relaxed(v,c)	((void)__raw_writeq((__force u64)ioswabq(v),c))
4737b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
4837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define readb(a)		({ u8  r_ = readb_relaxed(a); rmb(); r_; })
4937b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define readw(a)		({ u16 r_ = readw_relaxed(a); rmb(); r_; })
5037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define readl(a)		({ u32 r_ = readl_relaxed(a); rmb(); r_; })
5137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define readq(a)		({ u64 r_ = readq_relaxed(a); rmb(); r_; })
5237b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
5337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define writeb(v,a)		({ wmb(); writeb_relaxed((v),(a)); })
5437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define writew(v,a)		({ wmb(); writew_relaxed((v),(a)); })
5537b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define writel(v,a)		({ wmb(); writel_relaxed((v),(a)); })
5637b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define writeq(v,a)		({ wmb(); writeq_relaxed((v),(a)); })
5737b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
5837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define readsb(p,d,l)		__raw_readsb(p,d,l)
5937b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define readsw(p,d,l)		__raw_readsw(p,d,l)
6037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define readsl(p,d,l)		__raw_readsl(p,d,l)
6137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
6237b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define writesb(p,d,l)		__raw_writesb(p,d,l)
6337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define writesw(p,d,l)		__raw_writesw(p,d,l)
6437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define writesl(p,d,l)		__raw_writesl(p,d,l)
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
66b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt#define __BUILD_UNCACHED_IO(bwlq, type)					\
67b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundtstatic inline type read##bwlq##_uncached(unsigned long addr)		\
68b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt{									\
69b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt	type ret;							\
70b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt	jump_to_uncached();						\
71b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt	ret = __raw_read##bwlq(addr);					\
72b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt	back_to_cached();						\
73b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt	return ret;							\
74b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt}									\
75b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt									\
76b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundtstatic inline void write##bwlq##_uncached(type v, unsigned long addr)	\
77b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt{									\
78b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt	jump_to_uncached();						\
79b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt	__raw_write##bwlq(v, addr);					\
80b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt	back_to_cached();						\
81b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt}
82b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt
83b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt__BUILD_UNCACHED_IO(b, u8)
84b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt__BUILD_UNCACHED_IO(w, u16)
85b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt__BUILD_UNCACHED_IO(l, u32)
86b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt__BUILD_UNCACHED_IO(q, u64)
87b8f7918f332873a79e4c820e90e7a245ce4d3042Paul Mundt
8837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define __BUILD_MEMORY_STRING(pfx, bwlq, type)				\
89da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm									\
9037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundtstatic inline void							\
9137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundtpfx##writes##bwlq(volatile void __iomem *mem, const void *addr,		\
9237b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt		  unsigned int count)					\
93da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm{									\
94da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm	const volatile type *__addr = addr;				\
95da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm									\
96da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm	while (count--) {						\
97da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm		__raw_write##bwlq(*__addr, mem);			\
98da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm		__addr++;						\
99da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm	}								\
100da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm}									\
101da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm									\
10237b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundtstatic inline void pfx##reads##bwlq(volatile void __iomem *mem,		\
10337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt				    void *addr, unsigned int count)	\
104da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm{									\
105da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm	volatile type *__addr = addr;					\
106da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm									\
107da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm	while (count--) {						\
108da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm		*__addr = __raw_read##bwlq(mem);			\
109da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm		__addr++;						\
110da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm	}								\
111da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm}
112da6b003adc73011fd441a89c30d4f896667e24baMagnus Damm
11337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt__BUILD_MEMORY_STRING(__raw_, b, u8)
11437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt__BUILD_MEMORY_STRING(__raw_, w, u16)
11514866543ad22014a0b12e10657a917eb6b487248Paul Mundt
1166dbe47a170f80159f23c856ad4e02f2685c6f6cbPaul Mundt#ifdef CONFIG_SUPERH32
11714866543ad22014a0b12e10657a917eb6b487248Paul Mundtvoid __raw_writesl(void __iomem *addr, const void *data, int longlen);
11814866543ad22014a0b12e10657a917eb6b487248Paul Mundtvoid __raw_readsl(const void __iomem *addr, void *data, int longlen);
1196dbe47a170f80159f23c856ad4e02f2685c6f6cbPaul Mundt#else
12037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt__BUILD_MEMORY_STRING(__raw_, l, u32)
1216dbe47a170f80159f23c856ad4e02f2685c6f6cbPaul Mundt#endif
1226dbe47a170f80159f23c856ad4e02f2685c6f6cbPaul Mundt
12337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt__BUILD_MEMORY_STRING(__raw_, q, u64)
12437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
12537b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#ifdef CONFIG_HAS_IOPORT
12637b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
12737b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt/*
12837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt * Slowdown I/O port space accesses for antique hardware.
12937b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt */
13037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#undef CONF_SLOWDOWN_IO
13137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
13237b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt/*
13337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt * On SuperH I/O ports are memory mapped, so we access them using normal
13437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt * load/store instructions. sh_io_port_base is the virtual address to
13537b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt * which all ports are being mapped.
13637b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt */
13737b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundtextern const unsigned long sh_io_port_base;
13837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
13937b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundtstatic inline void __set_io_port_base(unsigned long pbase)
14037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt{
14137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	*(unsigned long *)&sh_io_port_base = pbase;
14237b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	barrier();
14337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt}
14437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
14537b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#ifdef CONFIG_GENERIC_IOMAP
14637b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define __ioport_map ioport_map
14737b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#else
14837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundtextern void __iomem *__ioport_map(unsigned long addr, unsigned int size);
14915444a8973dcfbd286b3e638cbadac2446a9271aDavid McKay#endif
15015444a8973dcfbd286b3e638cbadac2446a9271aDavid McKay
15137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#ifdef CONF_SLOWDOWN_IO
15237b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define SLOW_DOWN_IO __raw_readw(sh_io_port_base)
15337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#else
15437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define SLOW_DOWN_IO
15537b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#endif
15615444a8973dcfbd286b3e638cbadac2446a9271aDavid McKay
15737b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define __BUILD_IOPORT_SINGLE(pfx, bwlq, type, p, slow)			\
15837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt									\
15937b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundtstatic inline void pfx##out##bwlq##p(type val, unsigned long port)	\
16037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt{									\
16137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	volatile type *__addr;						\
16237b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt									\
16337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	__addr = __ioport_map(port, sizeof(type));			\
16437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	*__addr = val;							\
16537b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	slow;								\
16637b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt}									\
16737b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt									\
16837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundtstatic inline type pfx##in##bwlq##p(unsigned long port)			\
16937b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt{									\
17037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	volatile type *__addr;						\
17137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	type __val;							\
17237b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt									\
17337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	__addr = __ioport_map(port, sizeof(type));			\
17437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	__val = *__addr;						\
17537b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	slow;								\
17637b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt									\
17737b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	return __val;							\
17837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt}
179b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt
18037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define __BUILD_IOPORT_PFX(bus, bwlq, type)				\
18137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	__BUILD_IOPORT_SINGLE(bus, bwlq, type, ,)			\
18237b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	__BUILD_IOPORT_SINGLE(bus, bwlq, type, _p, SLOW_DOWN_IO)
1831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
18437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define BUILDIO_IOPORT(bwlq, type)					\
18537b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	__BUILD_IOPORT_PFX(, bwlq, type)
1860f2c15cecee0ff00e4bfa91dd20b33ccd9285360Paul Mundt
18737b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul MundtBUILDIO_IOPORT(b, u8)
18837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul MundtBUILDIO_IOPORT(w, u16)
18937b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul MundtBUILDIO_IOPORT(l, u32)
19037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul MundtBUILDIO_IOPORT(q, u64)
19137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
19237b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define __BUILD_IOPORT_STRING(bwlq, type)				\
19337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt									\
19437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundtstatic inline void outs##bwlq(unsigned long port, const void *addr,	\
19537b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt			      unsigned int count)			\
19637b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt{									\
19737b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	const volatile type *__addr = addr;				\
19837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt									\
19937b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	while (count--) {						\
20037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt		out##bwlq(*__addr, port);				\
20137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt		__addr++;						\
20237b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	}								\
20337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt}									\
20437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt									\
20537b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundtstatic inline void ins##bwlq(unsigned long port, void *addr,		\
20637b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt			     unsigned int count)			\
20737b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt{									\
20837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	volatile type *__addr = addr;					\
20937b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt									\
21037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	while (count--) {						\
21137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt		*__addr = in##bwlq(port);				\
21237b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt		__addr++;						\
21337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt	}								\
21437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt}
21537b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
21637b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt__BUILD_IOPORT_STRING(b, u8)
21737b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt__BUILD_IOPORT_STRING(w, u16)
21837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt__BUILD_IOPORT_STRING(l, u32)
21937b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt__BUILD_IOPORT_STRING(q, u64)
22037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
22137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#endif
22286e4dd5add77ab809f5427391dfabb8f78cbcb58Paul Mundt
22337b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define IO_SPACE_LIMIT 0xffffffff
22437b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt
22537b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt/* synco on SH-4A, otherwise a nop */
22637b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define mmiowb()		wmb()
22786e4dd5add77ab809f5427391dfabb8f78cbcb58Paul Mundt
2281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* We really want to try and get these to memcpy etc */
22914866543ad22014a0b12e10657a917eb6b487248Paul Mundtvoid memcpy_fromio(void *, const volatile void __iomem *, unsigned long);
23014866543ad22014a0b12e10657a917eb6b487248Paul Mundtvoid memcpy_toio(volatile void __iomem *, const void *, unsigned long);
23114866543ad22014a0b12e10657a917eb6b487248Paul Mundtvoid memset_io(volatile void __iomem *, int, unsigned long);
232959f85f8a3223c116bbe95dd8a9b207790b5d4d3Paul Mundt
233ac490a4893d37279f704876d430c3683071398b2Paul Mundt/* Quad-word real-mode I/O, don't ask.. */
234ac490a4893d37279f704876d430c3683071398b2Paul Mundtunsigned long long peek_real_address_q(unsigned long long addr);
235ac490a4893d37279f704876d430c3683071398b2Paul Mundtunsigned long long poke_real_address_q(unsigned long long addr,
236ac490a4893d37279f704876d430c3683071398b2Paul Mundt				       unsigned long long val);
237ac490a4893d37279f704876d430c3683071398b2Paul Mundt
238da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt#if !defined(CONFIG_MMU)
239da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt#define virt_to_phys(address)	((unsigned long)(address))
240da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt#define phys_to_virt(address)	((void *)(address))
241d02b08f6e8b184ffef349e395210a5e82ff4f4bcStuart Menefy#else
242da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt#define virt_to_phys(address)	(__pa(address))
243da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt#define phys_to_virt(address)	(__va(address))
244a2d1a5fae6296c2a3ac1aaa982c95464c46c0585Yoshinori Sato#endif
2451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
2461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
247da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * On 32-bit SH, we traditionally have the whole physical address space
248da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * mapped at all times (as MIPS does), so "ioremap()" and "iounmap()" do
249da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * not need to do anything but place the address in the proper segment.
250da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * This is true for P1 and P2 addresses, as well as some P3 ones.
251da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * However, most of the P3 addresses and newer cores using extended
252da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * addressing need to map through page tables, so the ioremap()
253da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * implementation becomes a bit more complicated.
2541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
255da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * See arch/sh/mm/ioremap.c for additional notes on this.
2561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
2571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We cheat a bit and always return uncachable areas until we've fixed
258b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt * the drivers to handle caching properly.
259da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt *
260da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * On the SH-5 the concept of segmentation in the 1:1 PXSEG sense simply
261da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * doesn't exist, so everything must go through page tables.
2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
263b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt#ifdef CONFIG_MMU
26490e7d649d86f21d478dc134f74c88e19dd472393Paul Mundtvoid __iomem *__ioremap_caller(phys_addr_t offset, unsigned long size,
265d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt			       pgprot_t prot, void *caller);
266b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundtvoid __iounmap(void __iomem *addr);
267ccd805874198c248498b5f269656ec14397eeedePaul Mundt
268b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundtstatic inline void __iomem *
26990e7d649d86f21d478dc134f74c88e19dd472393Paul Mundt__ioremap(phys_addr_t offset, unsigned long size, pgprot_t prot)
270bf3cdeda901c7f42de3cddc8c5aa19f6b8d8f9dfPaul Mundt{
271d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt	return __ioremap_caller(offset, size, prot, __builtin_return_address(0));
272bf3cdeda901c7f42de3cddc8c5aa19f6b8d8f9dfPaul Mundt}
273bf3cdeda901c7f42de3cddc8c5aa19f6b8d8f9dfPaul Mundt
274bf3cdeda901c7f42de3cddc8c5aa19f6b8d8f9dfPaul Mundtstatic inline void __iomem *
27590e7d649d86f21d478dc134f74c88e19dd472393Paul Mundt__ioremap_29bit(phys_addr_t offset, unsigned long size, pgprot_t prot)
2761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
277a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt#ifdef CONFIG_29BIT
27890e7d649d86f21d478dc134f74c88e19dd472393Paul Mundt	phys_addr_t last_addr = offset + size - 1;
279b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt
280b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt	/*
281b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt	 * For P1 and P2 space this is trivial, as everything is already
282b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt	 * mapped. Uncached access for P1 addresses are done through P2.
283b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt	 * In the P3 case or for addresses outside of the 29-bit space,
284b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt	 * mapping must be done by the PMB or by using page tables.
285b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt	 */
286b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt	if (likely(PXSEG(offset) < P3SEG && PXSEG(last_addr) < P3SEG)) {
287efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt		u64 flags = pgprot_val(prot);
288efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt
289efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt		/*
290efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt		 * Anything using the legacy PTEA space attributes needs
291efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt		 * to be kicked down to page table mappings.
292efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt		 */
293efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt		if (unlikely(flags & _PAGE_PCC_MASK))
294efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt			return NULL;
295efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt		if (unlikely(flags & _PAGE_CACHABLE))
296b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt			return (void __iomem *)P1SEGADDR(offset);
297b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt
298b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt		return (void __iomem *)P2SEGADDR(offset);
299b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt	}
300716777db7270255f1f7210fd87a7188b08c9a267Magnus Damm
301716777db7270255f1f7210fd87a7188b08c9a267Magnus Damm	/* P4 above the store queues are always mapped. */
302716777db7270255f1f7210fd87a7188b08c9a267Magnus Damm	if (unlikely(offset >= P3_ADDR_MAX))
303716777db7270255f1f7210fd87a7188b08c9a267Magnus Damm		return (void __iomem *)P4SEGADDR(offset);
304da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt#endif
305b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt
306a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt	return NULL;
307a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt}
308a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt
309a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundtstatic inline void __iomem *
31090e7d649d86f21d478dc134f74c88e19dd472393Paul Mundt__ioremap_mode(phys_addr_t offset, unsigned long size, pgprot_t prot)
311a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt{
312a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt	void __iomem *ret;
313a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt
314a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt	ret = __ioremap_trapped(offset, size);
315a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt	if (ret)
316a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt		return ret;
317a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt
318d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt	ret = __ioremap_29bit(offset, size, prot);
319a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt	if (ret)
320a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt		return ret;
321a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt
322d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt	return __ioremap(offset, size, prot);
3231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
324e6be3a25861429166f945499c7ee616875bc3db9Magnus Damm#else
325d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt#define __ioremap(offset, size, prot)		((void __iomem *)(offset))
326d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt#define __ioremap_mode(offset, size, prot)	((void __iomem *)(offset))
327e6be3a25861429166f945499c7ee616875bc3db9Magnus Damm#define __iounmap(addr)				do { } while (0)
328e6be3a25861429166f945499c7ee616875bc3db9Magnus Damm#endif /* CONFIG_MMU */
3291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
33090e7d649d86f21d478dc134f74c88e19dd472393Paul Mundtstatic inline void __iomem *ioremap(phys_addr_t offset, unsigned long size)
331d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt{
332d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt	return __ioremap_mode(offset, size, PAGE_KERNEL_NOCACHE);
333d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt}
334d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt
335d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundtstatic inline void __iomem *
33690e7d649d86f21d478dc134f74c88e19dd472393Paul Mundtioremap_cache(phys_addr_t offset, unsigned long size)
337d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt{
338d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt	return __ioremap_mode(offset, size, PAGE_KERNEL);
339d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt}
340d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt
3416d63e73d520b690e4378cef3003eb5f01f7d128cPaul Mundt#ifdef CONFIG_HAVE_IOREMAP_PROT
342d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundtstatic inline void __iomem *
34390e7d649d86f21d478dc134f74c88e19dd472393Paul Mundtioremap_prot(phys_addr_t offset, unsigned long size, unsigned long flags)
344d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt{
345d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt	return __ioremap_mode(offset, size, __pgprot(flags));
346d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt}
3476d63e73d520b690e4378cef3003eb5f01f7d128cPaul Mundt#endif
348d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt
349d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt#ifdef CONFIG_IOREMAP_FIXED
35090e7d649d86f21d478dc134f74c88e19dd472393Paul Mundtextern void __iomem *ioremap_fixed(phys_addr_t, unsigned long, pgprot_t);
351d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundtextern int iounmap_fixed(void __iomem *);
352d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundtextern void ioremap_fixed_init(void);
353d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt#else
354d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundtstatic inline void __iomem *
35590e7d649d86f21d478dc134f74c88e19dd472393Paul Mundtioremap_fixed(phys_addr_t phys_addr, unsigned long size, pgprot_t prot)
356d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt{
357d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt	BUG();
358d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt	return NULL;
359d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt}
360d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt
361d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundtstatic inline void ioremap_fixed_init(void) { }
362d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundtstatic inline int iounmap_fixed(void __iomem *addr) { return -EINVAL; }
363d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt#endif
364d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt
365d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt#define ioremap_nocache	ioremap
366d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt#define iounmap		__iounmap
367b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt
3681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Convert a physical pointer to a virtual kernel pointer for /dev/mem
3701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * access
3711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define xlate_dev_mem_ptr(p)	__va(p)
3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Convert a virtual cached pointer to an uncached pointer
3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define xlate_dev_kmem_ptr(p)	p
3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
379185aed75570fb4f78ef283dfa26cd9da5fa06a91Paul Mundt#define ARCH_HAS_VALID_PHYS_ADDR_RANGE
380185aed75570fb4f78ef283dfa26cd9da5fa06a91Paul Mundtint valid_phys_addr_range(unsigned long addr, size_t size);
381185aed75570fb4f78ef283dfa26cd9da5fa06a91Paul Mundtint valid_mmap_phys_addr_range(unsigned long pfn, size_t size);
382185aed75570fb4f78ef283dfa26cd9da5fa06a91Paul Mundt
3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* __KERNEL__ */
3841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
3851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* __ASM_SH_IO_H */
386