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 125ce816fa88cca083c47ab9000b2138a83043a78beUwe Kleine-König#ifdef CONFIG_HAS_IOPORT_MAP 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 */ 137666e81fdca5486cad644ee3fb64bb7d83e2f3723Andi Kleenextern 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 221ce816fa88cca083c47ab9000b2138a83043a78beUwe Kleine-König#else /* !CONFIG_HAS_IOPORT_MAP */ 222c5e50fa90ce42b1689692f587d4881308881b73dPaul Mundt 223c5e50fa90ce42b1689692f587d4881308881b73dPaul Mundt#include <asm/io_noioport.h> 224c5e50fa90ce42b1689692f587d4881308881b73dPaul Mundt 22537b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#endif 22686e4dd5add77ab809f5427391dfabb8f78cbcb58Paul Mundt 227c5e50fa90ce42b1689692f587d4881308881b73dPaul Mundt 22837b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define IO_SPACE_LIMIT 0xffffffff 22937b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt 23037b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt/* synco on SH-4A, otherwise a nop */ 23137b7a97884ba64bf7d403351ac2a9476ab4f1bbaPaul Mundt#define mmiowb() wmb() 23286e4dd5add77ab809f5427391dfabb8f78cbcb58Paul Mundt 2331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* We really want to try and get these to memcpy etc */ 23414866543ad22014a0b12e10657a917eb6b487248Paul Mundtvoid memcpy_fromio(void *, const volatile void __iomem *, unsigned long); 23514866543ad22014a0b12e10657a917eb6b487248Paul Mundtvoid memcpy_toio(volatile void __iomem *, const void *, unsigned long); 23614866543ad22014a0b12e10657a917eb6b487248Paul Mundtvoid memset_io(volatile void __iomem *, int, unsigned long); 237959f85f8a3223c116bbe95dd8a9b207790b5d4d3Paul Mundt 238ac490a4893d37279f704876d430c3683071398b2Paul Mundt/* Quad-word real-mode I/O, don't ask.. */ 239ac490a4893d37279f704876d430c3683071398b2Paul Mundtunsigned long long peek_real_address_q(unsigned long long addr); 240ac490a4893d37279f704876d430c3683071398b2Paul Mundtunsigned long long poke_real_address_q(unsigned long long addr, 241ac490a4893d37279f704876d430c3683071398b2Paul Mundt unsigned long long val); 242ac490a4893d37279f704876d430c3683071398b2Paul Mundt 243da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt#if !defined(CONFIG_MMU) 244da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt#define virt_to_phys(address) ((unsigned long)(address)) 245da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt#define phys_to_virt(address) ((void *)(address)) 246d02b08f6e8b184ffef349e395210a5e82ff4f4bcStuart Menefy#else 247da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt#define virt_to_phys(address) (__pa(address)) 248da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt#define phys_to_virt(address) (__va(address)) 249a2d1a5fae6296c2a3ac1aaa982c95464c46c0585Yoshinori Sato#endif 2501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 2511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 252da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * On 32-bit SH, we traditionally have the whole physical address space 253da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * mapped at all times (as MIPS does), so "ioremap()" and "iounmap()" do 254da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * not need to do anything but place the address in the proper segment. 255da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * This is true for P1 and P2 addresses, as well as some P3 ones. 256da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * However, most of the P3 addresses and newer cores using extended 257da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * addressing need to map through page tables, so the ioremap() 258da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * implementation becomes a bit more complicated. 2591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 260da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * See arch/sh/mm/ioremap.c for additional notes on this. 2611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 2621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * We cheat a bit and always return uncachable areas until we've fixed 263b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt * the drivers to handle caching properly. 264da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * 265da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * On the SH-5 the concept of segmentation in the 1:1 PXSEG sense simply 266da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt * doesn't exist, so everything must go through page tables. 2671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 268b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt#ifdef CONFIG_MMU 26990e7d649d86f21d478dc134f74c88e19dd472393Paul Mundtvoid __iomem *__ioremap_caller(phys_addr_t offset, unsigned long size, 270d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt pgprot_t prot, void *caller); 271b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundtvoid __iounmap(void __iomem *addr); 272ccd805874198c248498b5f269656ec14397eeedePaul Mundt 273b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundtstatic inline void __iomem * 27490e7d649d86f21d478dc134f74c88e19dd472393Paul Mundt__ioremap(phys_addr_t offset, unsigned long size, pgprot_t prot) 275bf3cdeda901c7f42de3cddc8c5aa19f6b8d8f9dfPaul Mundt{ 276d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt return __ioremap_caller(offset, size, prot, __builtin_return_address(0)); 277bf3cdeda901c7f42de3cddc8c5aa19f6b8d8f9dfPaul Mundt} 278bf3cdeda901c7f42de3cddc8c5aa19f6b8d8f9dfPaul Mundt 279bf3cdeda901c7f42de3cddc8c5aa19f6b8d8f9dfPaul Mundtstatic inline void __iomem * 28090e7d649d86f21d478dc134f74c88e19dd472393Paul Mundt__ioremap_29bit(phys_addr_t offset, unsigned long size, pgprot_t prot) 2811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 282a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt#ifdef CONFIG_29BIT 28390e7d649d86f21d478dc134f74c88e19dd472393Paul Mundt phys_addr_t last_addr = offset + size - 1; 284b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt 285b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt /* 286b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt * For P1 and P2 space this is trivial, as everything is already 287b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt * mapped. Uncached access for P1 addresses are done through P2. 288b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt * In the P3 case or for addresses outside of the 29-bit space, 289b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt * mapping must be done by the PMB or by using page tables. 290b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt */ 291b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt if (likely(PXSEG(offset) < P3SEG && PXSEG(last_addr) < P3SEG)) { 292efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt u64 flags = pgprot_val(prot); 293efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt 294efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt /* 295efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt * Anything using the legacy PTEA space attributes needs 296efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt * to be kicked down to page table mappings. 297efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt */ 298efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt if (unlikely(flags & _PAGE_PCC_MASK)) 299efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt return NULL; 300efb3e34b6176d30c4fe8635fa8e1beb6280cc2cdPaul Mundt if (unlikely(flags & _PAGE_CACHABLE)) 301b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt return (void __iomem *)P1SEGADDR(offset); 302b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt 303b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt return (void __iomem *)P2SEGADDR(offset); 304b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt } 305716777db7270255f1f7210fd87a7188b08c9a267Magnus Damm 306716777db7270255f1f7210fd87a7188b08c9a267Magnus Damm /* P4 above the store queues are always mapped. */ 307716777db7270255f1f7210fd87a7188b08c9a267Magnus Damm if (unlikely(offset >= P3_ADDR_MAX)) 308716777db7270255f1f7210fd87a7188b08c9a267Magnus Damm return (void __iomem *)P4SEGADDR(offset); 309da06b8d0545a1bf95b9060bf301d6de3400fafd6Paul Mundt#endif 310b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt 311a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt return NULL; 312a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt} 313a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt 314a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundtstatic inline void __iomem * 31590e7d649d86f21d478dc134f74c88e19dd472393Paul Mundt__ioremap_mode(phys_addr_t offset, unsigned long size, pgprot_t prot) 316a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt{ 317a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt void __iomem *ret; 318a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt 319a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt ret = __ioremap_trapped(offset, size); 320a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt if (ret) 321a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt return ret; 322a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt 323d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt ret = __ioremap_29bit(offset, size, prot); 324a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt if (ret) 325a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt return ret; 326a0ab36689a36e583b6e736f1c99ac8c9aebdad59Paul Mundt 327d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt return __ioremap(offset, size, prot); 3281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 329e6be3a25861429166f945499c7ee616875bc3db9Magnus Damm#else 330d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt#define __ioremap(offset, size, prot) ((void __iomem *)(offset)) 331d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt#define __ioremap_mode(offset, size, prot) ((void __iomem *)(offset)) 332e6be3a25861429166f945499c7ee616875bc3db9Magnus Damm#define __iounmap(addr) do { } while (0) 333e6be3a25861429166f945499c7ee616875bc3db9Magnus Damm#endif /* CONFIG_MMU */ 3341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 33590e7d649d86f21d478dc134f74c88e19dd472393Paul Mundtstatic inline void __iomem *ioremap(phys_addr_t offset, unsigned long size) 336d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt{ 337d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt return __ioremap_mode(offset, size, PAGE_KERNEL_NOCACHE); 338d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt} 339d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt 340d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundtstatic inline void __iomem * 34190e7d649d86f21d478dc134f74c88e19dd472393Paul Mundtioremap_cache(phys_addr_t offset, unsigned long size) 342d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt{ 343d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt return __ioremap_mode(offset, size, PAGE_KERNEL); 344d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt} 345d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt 3466d63e73d520b690e4378cef3003eb5f01f7d128cPaul Mundt#ifdef CONFIG_HAVE_IOREMAP_PROT 347d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundtstatic inline void __iomem * 34890e7d649d86f21d478dc134f74c88e19dd472393Paul Mundtioremap_prot(phys_addr_t offset, unsigned long size, unsigned long flags) 349d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt{ 350d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt return __ioremap_mode(offset, size, __pgprot(flags)); 351d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt} 3526d63e73d520b690e4378cef3003eb5f01f7d128cPaul Mundt#endif 353d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt 354d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt#ifdef CONFIG_IOREMAP_FIXED 35590e7d649d86f21d478dc134f74c88e19dd472393Paul Mundtextern void __iomem *ioremap_fixed(phys_addr_t, unsigned long, pgprot_t); 356d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundtextern int iounmap_fixed(void __iomem *); 357d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundtextern void ioremap_fixed_init(void); 358d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt#else 359d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundtstatic inline void __iomem * 36090e7d649d86f21d478dc134f74c88e19dd472393Paul Mundtioremap_fixed(phys_addr_t phys_addr, unsigned long size, pgprot_t prot) 361d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt{ 362d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt BUG(); 363d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt return NULL; 364d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt} 365d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt 366d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundtstatic inline void ioremap_fixed_init(void) { } 367d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundtstatic inline int iounmap_fixed(void __iomem *addr) { return -EINVAL; } 368d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt#endif 369d627a2ebd1a303aa4ac1962c553d1e8738735d01Paul Mundt 370d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt#define ioremap_nocache ioremap 371d57d64080ddc0ff13fcffc898b6251074a482ba1Paul Mundt#define iounmap __iounmap 372b66c1a3919abb40f9bd8fb92a0d9fd77eb899c54Paul Mundt 3731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 3741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Convert a physical pointer to a virtual kernel pointer for /dev/mem 3751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * access 3761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define xlate_dev_mem_ptr(p) __va(p) 3781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 3801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Convert a virtual cached pointer to an uncached pointer 3811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 3821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define xlate_dev_kmem_ptr(p) p 3831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 384185aed75570fb4f78ef283dfa26cd9da5fa06a91Paul Mundt#define ARCH_HAS_VALID_PHYS_ADDR_RANGE 3857e6735c3578e76c270a2797225a4214176ba13efCyril Chemparathyint valid_phys_addr_range(phys_addr_t addr, size_t size); 386185aed75570fb4f78ef283dfa26cd9da5fa06a91Paul Mundtint valid_mmap_phys_addr_range(unsigned long pfn, size_t size); 387185aed75570fb4f78ef283dfa26cd9da5fa06a91Paul Mundt 3881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* __KERNEL__ */ 3891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 3901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* __ASM_SH_IO_H */ 391