io_mm.h (13198B)
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * linux/include/asm-m68k/io.h 4 * 5 * 4/1/00 RZ: - rewritten to avoid clashes between ISA/PCI and other 6 * IO access 7 * - added Q40 support 8 * - added skeleton for GG-II and Amiga PCMCIA 9 * 2/3/01 RZ: - moved a few more defs into raw_io.h 10 * 11 * inX/outX should not be used by any driver unless it does 12 * ISA access. Other drivers should use function defined in raw_io.h 13 * or define its own macros on top of these. 14 * 15 * inX(),outX() are for ISA I/O 16 * isa_readX(),isa_writeX() are for ISA memory 17 */ 18 19#ifndef _M68K_IO_MM_H 20#define _M68K_IO_MM_H 21 22#ifdef __KERNEL__ 23 24#include <linux/compiler.h> 25#include <asm/raw_io.h> 26#include <asm/virtconvert.h> 27#include <asm/kmap.h> 28 29#include <asm-generic/iomap.h> 30 31#ifdef CONFIG_ATARI 32#define atari_readb raw_inb 33#define atari_writeb raw_outb 34 35#define atari_inb_p raw_inb 36#define atari_outb_p raw_outb 37#endif 38 39 40/* 41 * IO/MEM definitions for various ISA bridges 42 */ 43 44 45#ifdef CONFIG_Q40 46 47#define q40_isa_io_base 0xff400000 48#define q40_isa_mem_base 0xff800000 49 50#define Q40_ISA_IO_B(ioaddr) (q40_isa_io_base+1+4*((unsigned long)(ioaddr))) 51#define Q40_ISA_IO_W(ioaddr) (q40_isa_io_base+ 4*((unsigned long)(ioaddr))) 52#define Q40_ISA_MEM_B(madr) (q40_isa_mem_base+1+4*((unsigned long)(madr))) 53#define Q40_ISA_MEM_W(madr) (q40_isa_mem_base+ 4*((unsigned long)(madr))) 54 55#define MULTI_ISA 0 56#endif /* Q40 */ 57 58#ifdef CONFIG_AMIGA_PCMCIA 59#include <asm/amigayle.h> 60 61#define AG_ISA_IO_B(ioaddr) ( GAYLE_IO+(ioaddr)+(((ioaddr)&1)*GAYLE_ODD) ) 62#define AG_ISA_IO_W(ioaddr) ( GAYLE_IO+(ioaddr) ) 63 64#ifndef MULTI_ISA 65#define MULTI_ISA 0 66#else 67#undef MULTI_ISA 68#define MULTI_ISA 1 69#endif 70#endif /* AMIGA_PCMCIA */ 71 72#ifdef CONFIG_ATARI_ROM_ISA 73 74#define enec_isa_read_base 0xfffa0000 75#define enec_isa_write_base 0xfffb0000 76 77#define ENEC_ISA_IO_B(ioaddr) (enec_isa_read_base+((((unsigned long)(ioaddr))&0x7F)<<9)) 78#define ENEC_ISA_IO_W(ioaddr) (enec_isa_read_base+((((unsigned long)(ioaddr))&0x7F)<<9)) 79#define ENEC_ISA_MEM_B(madr) (enec_isa_read_base+((((unsigned long)(madr))&0x7F)<<9)) 80#define ENEC_ISA_MEM_W(madr) (enec_isa_read_base+((((unsigned long)(madr))&0x7F)<<9)) 81 82#ifndef MULTI_ISA 83#define MULTI_ISA 0 84#else 85#undef MULTI_ISA 86#define MULTI_ISA 1 87#endif 88#endif /* ATARI_ROM_ISA */ 89 90 91#if defined(CONFIG_ISA) || defined(CONFIG_ATARI_ROM_ISA) 92 93#if MULTI_ISA == 0 94#undef MULTI_ISA 95#endif 96 97#define ISA_TYPE_Q40 (1) 98#define ISA_TYPE_AG (2) 99#define ISA_TYPE_ENEC (3) 100 101#if defined(CONFIG_Q40) && !defined(MULTI_ISA) 102#define ISA_TYPE ISA_TYPE_Q40 103#define ISA_SEX 0 104#endif 105#if defined(CONFIG_AMIGA_PCMCIA) && !defined(MULTI_ISA) 106#define ISA_TYPE ISA_TYPE_AG 107#define ISA_SEX 1 108#endif 109#if defined(CONFIG_ATARI_ROM_ISA) && !defined(MULTI_ISA) 110#define ISA_TYPE ISA_TYPE_ENEC 111#define ISA_SEX 0 112#endif 113 114#ifdef MULTI_ISA 115extern int isa_type; 116extern int isa_sex; 117 118#define ISA_TYPE isa_type 119#define ISA_SEX isa_sex 120#endif 121 122/* 123 * define inline addr translation functions. Normally only one variant will 124 * be compiled in so the case statement will be optimised away 125 */ 126 127static inline u8 __iomem *isa_itb(unsigned long addr) 128{ 129 switch(ISA_TYPE) 130 { 131#ifdef CONFIG_Q40 132 case ISA_TYPE_Q40: return (u8 __iomem *)Q40_ISA_IO_B(addr); 133#endif 134#ifdef CONFIG_AMIGA_PCMCIA 135 case ISA_TYPE_AG: return (u8 __iomem *)AG_ISA_IO_B(addr); 136#endif 137#ifdef CONFIG_ATARI_ROM_ISA 138 case ISA_TYPE_ENEC: return (u8 __iomem *)ENEC_ISA_IO_B(addr); 139#endif 140 default: return NULL; /* avoid warnings, just in case */ 141 } 142} 143static inline u16 __iomem *isa_itw(unsigned long addr) 144{ 145 switch(ISA_TYPE) 146 { 147#ifdef CONFIG_Q40 148 case ISA_TYPE_Q40: return (u16 __iomem *)Q40_ISA_IO_W(addr); 149#endif 150#ifdef CONFIG_AMIGA_PCMCIA 151 case ISA_TYPE_AG: return (u16 __iomem *)AG_ISA_IO_W(addr); 152#endif 153#ifdef CONFIG_ATARI_ROM_ISA 154 case ISA_TYPE_ENEC: return (u16 __iomem *)ENEC_ISA_IO_W(addr); 155#endif 156 default: return NULL; /* avoid warnings, just in case */ 157 } 158} 159static inline u32 __iomem *isa_itl(unsigned long addr) 160{ 161 switch(ISA_TYPE) 162 { 163#ifdef CONFIG_AMIGA_PCMCIA 164 case ISA_TYPE_AG: return (u32 __iomem *)AG_ISA_IO_W(addr); 165#endif 166 default: return 0; /* avoid warnings, just in case */ 167 } 168} 169static inline u8 __iomem *isa_mtb(unsigned long addr) 170{ 171 switch(ISA_TYPE) 172 { 173#ifdef CONFIG_Q40 174 case ISA_TYPE_Q40: return (u8 __iomem *)Q40_ISA_MEM_B(addr); 175#endif 176#ifdef CONFIG_AMIGA_PCMCIA 177 case ISA_TYPE_AG: return (u8 __iomem *)addr; 178#endif 179#ifdef CONFIG_ATARI_ROM_ISA 180 case ISA_TYPE_ENEC: return (u8 __iomem *)ENEC_ISA_MEM_B(addr); 181#endif 182 default: return NULL; /* avoid warnings, just in case */ 183 } 184} 185static inline u16 __iomem *isa_mtw(unsigned long addr) 186{ 187 switch(ISA_TYPE) 188 { 189#ifdef CONFIG_Q40 190 case ISA_TYPE_Q40: return (u16 __iomem *)Q40_ISA_MEM_W(addr); 191#endif 192#ifdef CONFIG_AMIGA_PCMCIA 193 case ISA_TYPE_AG: return (u16 __iomem *)addr; 194#endif 195#ifdef CONFIG_ATARI_ROM_ISA 196 case ISA_TYPE_ENEC: return (u16 __iomem *)ENEC_ISA_MEM_W(addr); 197#endif 198 default: return NULL; /* avoid warnings, just in case */ 199 } 200} 201 202 203#define isa_inb(port) in_8(isa_itb(port)) 204#define isa_inw(port) (ISA_SEX ? in_be16(isa_itw(port)) : in_le16(isa_itw(port))) 205#define isa_inl(port) (ISA_SEX ? in_be32(isa_itl(port)) : in_le32(isa_itl(port))) 206#define isa_outb(val,port) out_8(isa_itb(port),(val)) 207#define isa_outw(val,port) (ISA_SEX ? out_be16(isa_itw(port),(val)) : out_le16(isa_itw(port),(val))) 208#define isa_outl(val,port) (ISA_SEX ? out_be32(isa_itl(port),(val)) : out_le32(isa_itl(port),(val))) 209 210#define isa_readb(p) in_8(isa_mtb((unsigned long)(p))) 211#define isa_readw(p) \ 212 (ISA_SEX ? in_be16(isa_mtw((unsigned long)(p))) \ 213 : in_le16(isa_mtw((unsigned long)(p)))) 214#define isa_writeb(val,p) out_8(isa_mtb((unsigned long)(p)),(val)) 215#define isa_writew(val,p) \ 216 (ISA_SEX ? out_be16(isa_mtw((unsigned long)(p)),(val)) \ 217 : out_le16(isa_mtw((unsigned long)(p)),(val))) 218 219#ifdef CONFIG_ATARI_ROM_ISA 220#define isa_rom_inb(port) rom_in_8(isa_itb(port)) 221#define isa_rom_inw(port) \ 222 (ISA_SEX ? rom_in_be16(isa_itw(port)) \ 223 : rom_in_le16(isa_itw(port))) 224 225#define isa_rom_outb(val, port) rom_out_8(isa_itb(port), (val)) 226#define isa_rom_outw(val, port) \ 227 (ISA_SEX ? rom_out_be16(isa_itw(port), (val)) \ 228 : rom_out_le16(isa_itw(port), (val))) 229 230#define isa_rom_readb(p) rom_in_8(isa_mtb((unsigned long)(p))) 231#define isa_rom_readw(p) \ 232 (ISA_SEX ? rom_in_be16(isa_mtw((unsigned long)(p))) \ 233 : rom_in_le16(isa_mtw((unsigned long)(p)))) 234#define isa_rom_readw_swap(p) \ 235 (ISA_SEX ? rom_in_le16(isa_mtw((unsigned long)(p))) \ 236 : rom_in_be16(isa_mtw((unsigned long)(p)))) 237#define isa_rom_readw_raw(p) rom_in_be16(isa_mtw((unsigned long)(p))) 238 239#define isa_rom_writeb(val, p) rom_out_8(isa_mtb((unsigned long)(p)), (val)) 240#define isa_rom_writew(val, p) \ 241 (ISA_SEX ? rom_out_be16(isa_mtw((unsigned long)(p)), (val)) \ 242 : rom_out_le16(isa_mtw((unsigned long)(p)), (val))) 243#define isa_rom_writew_swap(val, p) \ 244 (ISA_SEX ? rom_out_le16(isa_mtw((unsigned long)(p)), (val)) \ 245 : rom_out_be16(isa_mtw((unsigned long)(p)), (val))) 246#define isa_rom_writew_raw(val, p) rom_out_be16(isa_mtw((unsigned long)(p)), (val)) 247#endif /* CONFIG_ATARI_ROM_ISA */ 248 249static inline void isa_delay(void) 250{ 251 switch(ISA_TYPE) 252 { 253#ifdef CONFIG_Q40 254 case ISA_TYPE_Q40: isa_outb(0,0x80); break; 255#endif 256#ifdef CONFIG_AMIGA_PCMCIA 257 case ISA_TYPE_AG: break; 258#endif 259#ifdef CONFIG_ATARI_ROM_ISA 260 case ISA_TYPE_ENEC: break; 261#endif 262 default: break; /* avoid warnings */ 263 } 264} 265 266#define isa_inb_p(p) ({u8 v=isa_inb(p);isa_delay();v;}) 267#define isa_outb_p(v,p) ({isa_outb((v),(p));isa_delay();}) 268#define isa_inw_p(p) ({u16 v=isa_inw(p);isa_delay();v;}) 269#define isa_outw_p(v,p) ({isa_outw((v),(p));isa_delay();}) 270#define isa_inl_p(p) ({u32 v=isa_inl(p);isa_delay();v;}) 271#define isa_outl_p(v,p) ({isa_outl((v),(p));isa_delay();}) 272 273#define isa_insb(port, buf, nr) raw_insb(isa_itb(port), (u8 *)(buf), (nr)) 274#define isa_outsb(port, buf, nr) raw_outsb(isa_itb(port), (u8 *)(buf), (nr)) 275 276#define isa_insw(port, buf, nr) \ 277 (ISA_SEX ? raw_insw(isa_itw(port), (u16 *)(buf), (nr)) : \ 278 raw_insw_swapw(isa_itw(port), (u16 *)(buf), (nr))) 279 280#define isa_outsw(port, buf, nr) \ 281 (ISA_SEX ? raw_outsw(isa_itw(port), (u16 *)(buf), (nr)) : \ 282 raw_outsw_swapw(isa_itw(port), (u16 *)(buf), (nr))) 283 284#define isa_insl(port, buf, nr) \ 285 (ISA_SEX ? raw_insl(isa_itl(port), (u32 *)(buf), (nr)) : \ 286 raw_insw_swapw(isa_itw(port), (u16 *)(buf), (nr)<<1)) 287 288#define isa_outsl(port, buf, nr) \ 289 (ISA_SEX ? raw_outsl(isa_itl(port), (u32 *)(buf), (nr)) : \ 290 raw_outsw_swapw(isa_itw(port), (u16 *)(buf), (nr)<<1)) 291 292 293#ifdef CONFIG_ATARI_ROM_ISA 294#define isa_rom_inb_p(p) ({ u8 _v = isa_rom_inb(p); isa_delay(); _v; }) 295#define isa_rom_inw_p(p) ({ u16 _v = isa_rom_inw(p); isa_delay(); _v; }) 296#define isa_rom_outb_p(v, p) ({ isa_rom_outb((v), (p)); isa_delay(); }) 297#define isa_rom_outw_p(v, p) ({ isa_rom_outw((v), (p)); isa_delay(); }) 298 299#define isa_rom_insb(port, buf, nr) raw_rom_insb(isa_itb(port), (u8 *)(buf), (nr)) 300 301#define isa_rom_insw(port, buf, nr) \ 302 (ISA_SEX ? raw_rom_insw(isa_itw(port), (u16 *)(buf), (nr)) : \ 303 raw_rom_insw_swapw(isa_itw(port), (u16 *)(buf), (nr))) 304 305#define isa_rom_outsb(port, buf, nr) raw_rom_outsb(isa_itb(port), (u8 *)(buf), (nr)) 306 307#define isa_rom_outsw(port, buf, nr) \ 308 (ISA_SEX ? raw_rom_outsw(isa_itw(port), (u16 *)(buf), (nr)) : \ 309 raw_rom_outsw_swapw(isa_itw(port), (u16 *)(buf), (nr))) 310#endif /* CONFIG_ATARI_ROM_ISA */ 311 312#endif /* CONFIG_ISA || CONFIG_ATARI_ROM_ISA */ 313 314 315#if defined(CONFIG_ISA) && !defined(CONFIG_ATARI_ROM_ISA) 316#define inb isa_inb 317#define inb_p isa_inb_p 318#define outb isa_outb 319#define outb_p isa_outb_p 320#define inw isa_inw 321#define inw_p isa_inw_p 322#define outw isa_outw 323#define outw_p isa_outw_p 324#define inl isa_inl 325#define inl_p isa_inl_p 326#define outl isa_outl 327#define outl_p isa_outl_p 328#define insb isa_insb 329#define insw isa_insw 330#define insl isa_insl 331#define outsb isa_outsb 332#define outsw isa_outsw 333#define outsl isa_outsl 334#define readb isa_readb 335#define readw isa_readw 336#define writeb isa_writeb 337#define writew isa_writew 338#endif /* CONFIG_ISA && !CONFIG_ATARI_ROM_ISA */ 339 340#ifdef CONFIG_ATARI_ROM_ISA 341/* 342 * kernel with both ROM port ISA and IDE compiled in, those have 343 * conflicting defs for in/out. Simply consider port < 1024 344 * ROM port ISA and everything else regular ISA for IDE. read,write defined 345 * below. 346 */ 347#define inb(port) ((port) < 1024 ? isa_rom_inb(port) : in_8(port)) 348#define inb_p(port) ((port) < 1024 ? isa_rom_inb_p(port) : in_8(port)) 349#define inw(port) ((port) < 1024 ? isa_rom_inw(port) : in_le16(port)) 350#define inw_p(port) ((port) < 1024 ? isa_rom_inw_p(port) : in_le16(port)) 351#define inl isa_inl 352#define inl_p isa_inl_p 353 354#define outb(val, port) ((port) < 1024 ? isa_rom_outb((val), (port)) : out_8((port), (val))) 355#define outb_p(val, port) ((port) < 1024 ? isa_rom_outb_p((val), (port)) : out_8((port), (val))) 356#define outw(val, port) ((port) < 1024 ? isa_rom_outw((val), (port)) : out_le16((port), (val))) 357#define outw_p(val, port) ((port) < 1024 ? isa_rom_outw_p((val), (port)) : out_le16((port), (val))) 358#define outl isa_outl 359#define outl_p isa_outl_p 360 361#define insb(port, buf, nr) ((port) < 1024 ? isa_rom_insb((port), (buf), (nr)) : isa_insb((port), (buf), (nr))) 362#define insw(port, buf, nr) ((port) < 1024 ? isa_rom_insw((port), (buf), (nr)) : isa_insw((port), (buf), (nr))) 363#define insl isa_insl 364#define outsb(port, buf, nr) ((port) < 1024 ? isa_rom_outsb((port), (buf), (nr)) : isa_outsb((port), (buf), (nr))) 365#define outsw(port, buf, nr) ((port) < 1024 ? isa_rom_outsw((port), (buf), (nr)) : isa_outsw((port), (buf), (nr))) 366#define outsl isa_outsl 367 368#define readb(addr) in_8(addr) 369#define writeb(val, addr) out_8((addr), (val)) 370#define readw(addr) in_le16(addr) 371#define writew(val, addr) out_le16((addr), (val)) 372#endif /* CONFIG_ATARI_ROM_ISA */ 373 374#define readl(addr) in_le32(addr) 375#define writel(val,addr) out_le32((addr),(val)) 376 377#define readsb(port, buf, nr) raw_insb((port), (u8 *)(buf), (nr)) 378#define readsw(port, buf, nr) raw_insw((port), (u16 *)(buf), (nr)) 379#define readsl(port, buf, nr) raw_insl((port), (u32 *)(buf), (nr)) 380#define writesb(port, buf, nr) raw_outsb((port), (u8 *)(buf), (nr)) 381#define writesw(port, buf, nr) raw_outsw((port), (u16 *)(buf), (nr)) 382#define writesl(port, buf, nr) raw_outsl((port), (u32 *)(buf), (nr)) 383 384#ifndef CONFIG_SUN3 385#define IO_SPACE_LIMIT 0xffff 386#else 387#define IO_SPACE_LIMIT 0x0fffffff 388#endif 389 390#endif /* __KERNEL__ */ 391 392#define __ARCH_HAS_NO_PAGE_ZERO_MAPPED 1 393 394/* 395 * Convert a physical pointer to a virtual kernel pointer for /dev/mem 396 * access 397 */ 398#define xlate_dev_mem_ptr(p) __va(p) 399 400#define readb_relaxed(addr) readb(addr) 401#define readw_relaxed(addr) readw(addr) 402#define readl_relaxed(addr) readl(addr) 403 404#define writeb_relaxed(b, addr) writeb(b, addr) 405#define writew_relaxed(b, addr) writew(b, addr) 406#define writel_relaxed(b, addr) writel(b, addr) 407 408#endif /* _M68K_IO_MM_H */