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