0001
0002 #ifndef _ASM_POWERPC_IO_H
0003 #define _ASM_POWERPC_IO_H
0004 #ifdef __KERNEL__
0005
0006 #define ARCH_HAS_IOREMAP_WC
0007 #ifdef CONFIG_PPC32
0008 #define ARCH_HAS_IOREMAP_WT
0009 #endif
0010
0011
0012
0013
0014
0015 extern int check_legacy_ioport(unsigned long base_port);
0016 #define I8042_DATA_REG 0x60
0017 #define FDC_BASE 0x3f0
0018
0019 #if defined(CONFIG_PPC64) && defined(CONFIG_PCI)
0020 extern struct pci_dev *isa_bridge_pcidev;
0021
0022
0023
0024 #define arch_has_dev_port() (isa_bridge_pcidev != NULL || isa_io_special)
0025 #endif
0026
0027 #include <linux/device.h>
0028 #include <linux/compiler.h>
0029 #include <linux/mm.h>
0030 #include <asm/page.h>
0031 #include <asm/byteorder.h>
0032 #include <asm/synch.h>
0033 #include <asm/delay.h>
0034 #include <asm/mmiowb.h>
0035 #include <asm/mmu.h>
0036
0037 #define SIO_CONFIG_RA 0x398
0038 #define SIO_CONFIG_RD 0x399
0039
0040
0041
0042
0043
0044 #ifndef CONFIG_PCI
0045 #define _IO_BASE 0
0046 #define _ISA_MEM_BASE 0
0047 #define PCI_DRAM_OFFSET 0
0048 #elif defined(CONFIG_PPC32)
0049 #define _IO_BASE isa_io_base
0050 #define _ISA_MEM_BASE isa_mem_base
0051 #define PCI_DRAM_OFFSET pci_dram_offset
0052 #else
0053 #define _IO_BASE pci_io_base
0054 #define _ISA_MEM_BASE isa_mem_base
0055 #define PCI_DRAM_OFFSET 0
0056 #endif
0057
0058 extern unsigned long isa_io_base;
0059 extern unsigned long pci_io_base;
0060 extern unsigned long pci_dram_offset;
0061
0062 extern resource_size_t isa_mem_base;
0063
0064
0065
0066
0067
0068
0069
0070 extern bool isa_io_special;
0071
0072 #ifdef CONFIG_PPC32
0073 #if defined(CONFIG_PPC_INDIRECT_PIO) || defined(CONFIG_PPC_INDIRECT_MMIO)
0074 #error CONFIG_PPC_INDIRECT_{PIO,MMIO} are not yet supported on 32 bits
0075 #endif
0076 #endif
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100 #define DEF_MMIO_IN_X(name, size, insn) \
0101 static inline u##size name(const volatile u##size __iomem *addr) \
0102 { \
0103 u##size ret; \
0104 __asm__ __volatile__("sync;"#insn" %0,%y1;twi 0,%0,0;isync" \
0105 : "=r" (ret) : "Z" (*addr) : "memory"); \
0106 return ret; \
0107 }
0108
0109 #define DEF_MMIO_OUT_X(name, size, insn) \
0110 static inline void name(volatile u##size __iomem *addr, u##size val) \
0111 { \
0112 __asm__ __volatile__("sync;"#insn" %1,%y0" \
0113 : "=Z" (*addr) : "r" (val) : "memory"); \
0114 mmiowb_set_pending(); \
0115 }
0116
0117 #define DEF_MMIO_IN_D(name, size, insn) \
0118 static inline u##size name(const volatile u##size __iomem *addr) \
0119 { \
0120 u##size ret; \
0121 __asm__ __volatile__("sync;"#insn"%U1%X1 %0,%1;twi 0,%0,0;isync"\
0122 : "=r" (ret) : "m<>" (*addr) : "memory"); \
0123 return ret; \
0124 }
0125
0126 #define DEF_MMIO_OUT_D(name, size, insn) \
0127 static inline void name(volatile u##size __iomem *addr, u##size val) \
0128 { \
0129 __asm__ __volatile__("sync;"#insn"%U0%X0 %1,%0" \
0130 : "=m<>" (*addr) : "r" (val) : "memory"); \
0131 mmiowb_set_pending(); \
0132 }
0133
0134 DEF_MMIO_IN_D(in_8, 8, lbz);
0135 DEF_MMIO_OUT_D(out_8, 8, stb);
0136
0137 #ifdef __BIG_ENDIAN__
0138 DEF_MMIO_IN_D(in_be16, 16, lhz);
0139 DEF_MMIO_IN_D(in_be32, 32, lwz);
0140 DEF_MMIO_IN_X(in_le16, 16, lhbrx);
0141 DEF_MMIO_IN_X(in_le32, 32, lwbrx);
0142
0143 DEF_MMIO_OUT_D(out_be16, 16, sth);
0144 DEF_MMIO_OUT_D(out_be32, 32, stw);
0145 DEF_MMIO_OUT_X(out_le16, 16, sthbrx);
0146 DEF_MMIO_OUT_X(out_le32, 32, stwbrx);
0147 #else
0148 DEF_MMIO_IN_X(in_be16, 16, lhbrx);
0149 DEF_MMIO_IN_X(in_be32, 32, lwbrx);
0150 DEF_MMIO_IN_D(in_le16, 16, lhz);
0151 DEF_MMIO_IN_D(in_le32, 32, lwz);
0152
0153 DEF_MMIO_OUT_X(out_be16, 16, sthbrx);
0154 DEF_MMIO_OUT_X(out_be32, 32, stwbrx);
0155 DEF_MMIO_OUT_D(out_le16, 16, sth);
0156 DEF_MMIO_OUT_D(out_le32, 32, stw);
0157
0158 #endif
0159
0160 #ifdef __powerpc64__
0161
0162 #ifdef __BIG_ENDIAN__
0163 DEF_MMIO_OUT_D(out_be64, 64, std);
0164 DEF_MMIO_IN_D(in_be64, 64, ld);
0165
0166
0167 static inline u64 in_le64(const volatile u64 __iomem *addr)
0168 {
0169 return swab64(in_be64(addr));
0170 }
0171
0172 static inline void out_le64(volatile u64 __iomem *addr, u64 val)
0173 {
0174 out_be64(addr, swab64(val));
0175 }
0176 #else
0177 DEF_MMIO_OUT_D(out_le64, 64, std);
0178 DEF_MMIO_IN_D(in_le64, 64, ld);
0179
0180
0181 static inline u64 in_be64(const volatile u64 __iomem *addr)
0182 {
0183 return swab64(in_le64(addr));
0184 }
0185
0186 static inline void out_be64(volatile u64 __iomem *addr, u64 val)
0187 {
0188 out_le64(addr, swab64(val));
0189 }
0190
0191 #endif
0192 #endif
0193
0194
0195
0196
0197 extern void _insb(const volatile u8 __iomem *addr, void *buf, long count);
0198 extern void _outsb(volatile u8 __iomem *addr,const void *buf,long count);
0199 extern void _insw_ns(const volatile u16 __iomem *addr, void *buf, long count);
0200 extern void _outsw_ns(volatile u16 __iomem *addr, const void *buf, long count);
0201 extern void _insl_ns(const volatile u32 __iomem *addr, void *buf, long count);
0202 extern void _outsl_ns(volatile u32 __iomem *addr, const void *buf, long count);
0203
0204
0205
0206
0207 #define _insw _insw_ns
0208 #define _insl _insl_ns
0209 #define _outsw _outsw_ns
0210 #define _outsl _outsl_ns
0211
0212
0213
0214
0215
0216
0217 extern void _memset_io(volatile void __iomem *addr, int c, unsigned long n);
0218 extern void _memcpy_fromio(void *dest, const volatile void __iomem *src,
0219 unsigned long n);
0220 extern void _memcpy_toio(volatile void __iomem *dest, const void *src,
0221 unsigned long n);
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238
0239
0240
0241 #ifdef CONFIG_EEH
0242 #include <asm/eeh.h>
0243 #endif
0244
0245
0246 #define PCI_IO_ADDR volatile void __iomem *
0247
0248
0249
0250
0251
0252
0253
0254
0255
0256
0257
0258
0259
0260
0261
0262
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274 #ifdef CONFIG_PPC_INDIRECT_MMIO
0275 #define PCI_IO_IND_TOKEN_SHIFT 52
0276 #define PCI_IO_IND_TOKEN_MASK (0xfful << PCI_IO_IND_TOKEN_SHIFT)
0277 #define PCI_FIX_ADDR(addr) \
0278 ((PCI_IO_ADDR)(((unsigned long)(addr)) & ~PCI_IO_IND_TOKEN_MASK))
0279 #define PCI_GET_ADDR_TOKEN(addr) \
0280 (((unsigned long)(addr) & PCI_IO_IND_TOKEN_MASK) >> \
0281 PCI_IO_IND_TOKEN_SHIFT)
0282 #define PCI_SET_ADDR_TOKEN(addr, token) \
0283 do { \
0284 unsigned long __a = (unsigned long)(addr); \
0285 __a &= ~PCI_IO_IND_TOKEN_MASK; \
0286 __a |= ((unsigned long)(token)) << PCI_IO_IND_TOKEN_SHIFT; \
0287 (addr) = (void __iomem *)__a; \
0288 } while(0)
0289 #else
0290 #define PCI_FIX_ADDR(addr) (addr)
0291 #endif
0292
0293
0294
0295
0296
0297
0298 static inline unsigned char __raw_readb(const volatile void __iomem *addr)
0299 {
0300 return *(volatile unsigned char __force *)PCI_FIX_ADDR(addr);
0301 }
0302 #define __raw_readb __raw_readb
0303
0304 static inline unsigned short __raw_readw(const volatile void __iomem *addr)
0305 {
0306 return *(volatile unsigned short __force *)PCI_FIX_ADDR(addr);
0307 }
0308 #define __raw_readw __raw_readw
0309
0310 static inline unsigned int __raw_readl(const volatile void __iomem *addr)
0311 {
0312 return *(volatile unsigned int __force *)PCI_FIX_ADDR(addr);
0313 }
0314 #define __raw_readl __raw_readl
0315
0316 static inline void __raw_writeb(unsigned char v, volatile void __iomem *addr)
0317 {
0318 *(volatile unsigned char __force *)PCI_FIX_ADDR(addr) = v;
0319 }
0320 #define __raw_writeb __raw_writeb
0321
0322 static inline void __raw_writew(unsigned short v, volatile void __iomem *addr)
0323 {
0324 *(volatile unsigned short __force *)PCI_FIX_ADDR(addr) = v;
0325 }
0326 #define __raw_writew __raw_writew
0327
0328 static inline void __raw_writel(unsigned int v, volatile void __iomem *addr)
0329 {
0330 *(volatile unsigned int __force *)PCI_FIX_ADDR(addr) = v;
0331 }
0332 #define __raw_writel __raw_writel
0333
0334 #ifdef __powerpc64__
0335 static inline unsigned long __raw_readq(const volatile void __iomem *addr)
0336 {
0337 return *(volatile unsigned long __force *)PCI_FIX_ADDR(addr);
0338 }
0339 #define __raw_readq __raw_readq
0340
0341 static inline void __raw_writeq(unsigned long v, volatile void __iomem *addr)
0342 {
0343 *(volatile unsigned long __force *)PCI_FIX_ADDR(addr) = v;
0344 }
0345 #define __raw_writeq __raw_writeq
0346
0347 static inline void __raw_writeq_be(unsigned long v, volatile void __iomem *addr)
0348 {
0349 __raw_writeq((__force unsigned long)cpu_to_be64(v), addr);
0350 }
0351 #define __raw_writeq_be __raw_writeq_be
0352
0353
0354
0355
0356
0357 static inline void __raw_rm_writeb(u8 val, volatile void __iomem *paddr)
0358 {
0359 __asm__ __volatile__(".machine push; \
0360 .machine power6; \
0361 stbcix %0,0,%1; \
0362 .machine pop;"
0363 : : "r" (val), "r" (paddr) : "memory");
0364 }
0365
0366 static inline void __raw_rm_writew(u16 val, volatile void __iomem *paddr)
0367 {
0368 __asm__ __volatile__(".machine push; \
0369 .machine power6; \
0370 sthcix %0,0,%1; \
0371 .machine pop;"
0372 : : "r" (val), "r" (paddr) : "memory");
0373 }
0374
0375 static inline void __raw_rm_writel(u32 val, volatile void __iomem *paddr)
0376 {
0377 __asm__ __volatile__(".machine push; \
0378 .machine power6; \
0379 stwcix %0,0,%1; \
0380 .machine pop;"
0381 : : "r" (val), "r" (paddr) : "memory");
0382 }
0383
0384 static inline void __raw_rm_writeq(u64 val, volatile void __iomem *paddr)
0385 {
0386 __asm__ __volatile__(".machine push; \
0387 .machine power6; \
0388 stdcix %0,0,%1; \
0389 .machine pop;"
0390 : : "r" (val), "r" (paddr) : "memory");
0391 }
0392
0393 static inline void __raw_rm_writeq_be(u64 val, volatile void __iomem *paddr)
0394 {
0395 __raw_rm_writeq((__force u64)cpu_to_be64(val), paddr);
0396 }
0397
0398 static inline u8 __raw_rm_readb(volatile void __iomem *paddr)
0399 {
0400 u8 ret;
0401 __asm__ __volatile__(".machine push; \
0402 .machine power6; \
0403 lbzcix %0,0, %1; \
0404 .machine pop;"
0405 : "=r" (ret) : "r" (paddr) : "memory");
0406 return ret;
0407 }
0408
0409 static inline u16 __raw_rm_readw(volatile void __iomem *paddr)
0410 {
0411 u16 ret;
0412 __asm__ __volatile__(".machine push; \
0413 .machine power6; \
0414 lhzcix %0,0, %1; \
0415 .machine pop;"
0416 : "=r" (ret) : "r" (paddr) : "memory");
0417 return ret;
0418 }
0419
0420 static inline u32 __raw_rm_readl(volatile void __iomem *paddr)
0421 {
0422 u32 ret;
0423 __asm__ __volatile__(".machine push; \
0424 .machine power6; \
0425 lwzcix %0,0, %1; \
0426 .machine pop;"
0427 : "=r" (ret) : "r" (paddr) : "memory");
0428 return ret;
0429 }
0430
0431 static inline u64 __raw_rm_readq(volatile void __iomem *paddr)
0432 {
0433 u64 ret;
0434 __asm__ __volatile__(".machine push; \
0435 .machine power6; \
0436 ldcix %0,0, %1; \
0437 .machine pop;"
0438 : "=r" (ret) : "r" (paddr) : "memory");
0439 return ret;
0440 }
0441 #endif
0442
0443
0444
0445
0446
0447
0448
0449
0450
0451
0452
0453
0454
0455
0456
0457 #ifdef CONFIG_PPC32
0458
0459 #define __do_in_asm(name, op) \
0460 static inline unsigned int name(unsigned int port) \
0461 { \
0462 unsigned int x; \
0463 __asm__ __volatile__( \
0464 "sync\n" \
0465 "0:" op " %0,0,%1\n" \
0466 "1: twi 0,%0,0\n" \
0467 "2: isync\n" \
0468 "3: nop\n" \
0469 "4:\n" \
0470 ".section .fixup,\"ax\"\n" \
0471 "5: li %0,-1\n" \
0472 " b 4b\n" \
0473 ".previous\n" \
0474 EX_TABLE(0b, 5b) \
0475 EX_TABLE(1b, 5b) \
0476 EX_TABLE(2b, 5b) \
0477 EX_TABLE(3b, 5b) \
0478 : "=&r" (x) \
0479 : "r" (port + _IO_BASE) \
0480 : "memory"); \
0481 return x; \
0482 }
0483
0484 #define __do_out_asm(name, op) \
0485 static inline void name(unsigned int val, unsigned int port) \
0486 { \
0487 __asm__ __volatile__( \
0488 "sync\n" \
0489 "0:" op " %0,0,%1\n" \
0490 "1: sync\n" \
0491 "2:\n" \
0492 EX_TABLE(0b, 2b) \
0493 EX_TABLE(1b, 2b) \
0494 : : "r" (val), "r" (port + _IO_BASE) \
0495 : "memory"); \
0496 }
0497
0498 __do_in_asm(_rec_inb, "lbzx")
0499 __do_in_asm(_rec_inw, "lhbrx")
0500 __do_in_asm(_rec_inl, "lwbrx")
0501 __do_out_asm(_rec_outb, "stbx")
0502 __do_out_asm(_rec_outw, "sthbrx")
0503 __do_out_asm(_rec_outl, "stwbrx")
0504
0505 #endif
0506
0507
0508
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522 #define __do_writeb(val, addr) out_8(PCI_FIX_ADDR(addr), val)
0523 #define __do_writew(val, addr) out_le16(PCI_FIX_ADDR(addr), val)
0524 #define __do_writel(val, addr) out_le32(PCI_FIX_ADDR(addr), val)
0525 #define __do_writeq(val, addr) out_le64(PCI_FIX_ADDR(addr), val)
0526 #define __do_writew_be(val, addr) out_be16(PCI_FIX_ADDR(addr), val)
0527 #define __do_writel_be(val, addr) out_be32(PCI_FIX_ADDR(addr), val)
0528 #define __do_writeq_be(val, addr) out_be64(PCI_FIX_ADDR(addr), val)
0529
0530 #ifdef CONFIG_EEH
0531 #define __do_readb(addr) eeh_readb(PCI_FIX_ADDR(addr))
0532 #define __do_readw(addr) eeh_readw(PCI_FIX_ADDR(addr))
0533 #define __do_readl(addr) eeh_readl(PCI_FIX_ADDR(addr))
0534 #define __do_readq(addr) eeh_readq(PCI_FIX_ADDR(addr))
0535 #define __do_readw_be(addr) eeh_readw_be(PCI_FIX_ADDR(addr))
0536 #define __do_readl_be(addr) eeh_readl_be(PCI_FIX_ADDR(addr))
0537 #define __do_readq_be(addr) eeh_readq_be(PCI_FIX_ADDR(addr))
0538 #else
0539 #define __do_readb(addr) in_8(PCI_FIX_ADDR(addr))
0540 #define __do_readw(addr) in_le16(PCI_FIX_ADDR(addr))
0541 #define __do_readl(addr) in_le32(PCI_FIX_ADDR(addr))
0542 #define __do_readq(addr) in_le64(PCI_FIX_ADDR(addr))
0543 #define __do_readw_be(addr) in_be16(PCI_FIX_ADDR(addr))
0544 #define __do_readl_be(addr) in_be32(PCI_FIX_ADDR(addr))
0545 #define __do_readq_be(addr) in_be64(PCI_FIX_ADDR(addr))
0546 #endif
0547
0548 #ifdef CONFIG_PPC32
0549 #define __do_outb(val, port) _rec_outb(val, port)
0550 #define __do_outw(val, port) _rec_outw(val, port)
0551 #define __do_outl(val, port) _rec_outl(val, port)
0552 #define __do_inb(port) _rec_inb(port)
0553 #define __do_inw(port) _rec_inw(port)
0554 #define __do_inl(port) _rec_inl(port)
0555 #else
0556 #define __do_outb(val, port) writeb(val,(PCI_IO_ADDR)_IO_BASE+port);
0557 #define __do_outw(val, port) writew(val,(PCI_IO_ADDR)_IO_BASE+port);
0558 #define __do_outl(val, port) writel(val,(PCI_IO_ADDR)_IO_BASE+port);
0559 #define __do_inb(port) readb((PCI_IO_ADDR)_IO_BASE + port);
0560 #define __do_inw(port) readw((PCI_IO_ADDR)_IO_BASE + port);
0561 #define __do_inl(port) readl((PCI_IO_ADDR)_IO_BASE + port);
0562 #endif
0563
0564 #ifdef CONFIG_EEH
0565 #define __do_readsb(a, b, n) eeh_readsb(PCI_FIX_ADDR(a), (b), (n))
0566 #define __do_readsw(a, b, n) eeh_readsw(PCI_FIX_ADDR(a), (b), (n))
0567 #define __do_readsl(a, b, n) eeh_readsl(PCI_FIX_ADDR(a), (b), (n))
0568 #else
0569 #define __do_readsb(a, b, n) _insb(PCI_FIX_ADDR(a), (b), (n))
0570 #define __do_readsw(a, b, n) _insw(PCI_FIX_ADDR(a), (b), (n))
0571 #define __do_readsl(a, b, n) _insl(PCI_FIX_ADDR(a), (b), (n))
0572 #endif
0573 #define __do_writesb(a, b, n) _outsb(PCI_FIX_ADDR(a),(b),(n))
0574 #define __do_writesw(a, b, n) _outsw(PCI_FIX_ADDR(a),(b),(n))
0575 #define __do_writesl(a, b, n) _outsl(PCI_FIX_ADDR(a),(b),(n))
0576
0577 #define __do_insb(p, b, n) readsb((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
0578 #define __do_insw(p, b, n) readsw((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
0579 #define __do_insl(p, b, n) readsl((PCI_IO_ADDR)_IO_BASE+(p), (b), (n))
0580 #define __do_outsb(p, b, n) writesb((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
0581 #define __do_outsw(p, b, n) writesw((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
0582 #define __do_outsl(p, b, n) writesl((PCI_IO_ADDR)_IO_BASE+(p),(b),(n))
0583
0584 #define __do_memset_io(addr, c, n) \
0585 _memset_io(PCI_FIX_ADDR(addr), c, n)
0586 #define __do_memcpy_toio(dst, src, n) \
0587 _memcpy_toio(PCI_FIX_ADDR(dst), src, n)
0588
0589 #ifdef CONFIG_EEH
0590 #define __do_memcpy_fromio(dst, src, n) \
0591 eeh_memcpy_fromio(dst, PCI_FIX_ADDR(src), n)
0592 #else
0593 #define __do_memcpy_fromio(dst, src, n) \
0594 _memcpy_fromio(dst,PCI_FIX_ADDR(src),n)
0595 #endif
0596
0597 #ifdef CONFIG_PPC_INDIRECT_PIO
0598 #define DEF_PCI_HOOK_pio(x) x
0599 #else
0600 #define DEF_PCI_HOOK_pio(x) NULL
0601 #endif
0602
0603 #ifdef CONFIG_PPC_INDIRECT_MMIO
0604 #define DEF_PCI_HOOK_mem(x) x
0605 #else
0606 #define DEF_PCI_HOOK_mem(x) NULL
0607 #endif
0608
0609
0610 extern struct ppc_pci_io {
0611
0612 #define DEF_PCI_AC_RET(name, ret, at, al, space, aa) ret (*name) at;
0613 #define DEF_PCI_AC_NORET(name, at, al, space, aa) void (*name) at;
0614
0615 #include <asm/io-defs.h>
0616
0617 #undef DEF_PCI_AC_RET
0618 #undef DEF_PCI_AC_NORET
0619
0620 } ppc_pci_io;
0621
0622
0623 #define DEF_PCI_AC_RET(name, ret, at, al, space, aa) \
0624 static inline ret name at \
0625 { \
0626 if (DEF_PCI_HOOK_##space(ppc_pci_io.name) != NULL) \
0627 return ppc_pci_io.name al; \
0628 return __do_##name al; \
0629 }
0630
0631 #define DEF_PCI_AC_NORET(name, at, al, space, aa) \
0632 static inline void name at \
0633 { \
0634 if (DEF_PCI_HOOK_##space(ppc_pci_io.name) != NULL) \
0635 ppc_pci_io.name al; \
0636 else \
0637 __do_##name al; \
0638 }
0639
0640 #include <asm/io-defs.h>
0641
0642 #undef DEF_PCI_AC_RET
0643 #undef DEF_PCI_AC_NORET
0644
0645
0646
0647
0648 #define readb readb
0649 #define readw readw
0650 #define readl readl
0651 #define writeb writeb
0652 #define writew writew
0653 #define writel writel
0654 #define readsb readsb
0655 #define readsw readsw
0656 #define readsl readsl
0657 #define writesb writesb
0658 #define writesw writesw
0659 #define writesl writesl
0660 #define inb inb
0661 #define inw inw
0662 #define inl inl
0663 #define outb outb
0664 #define outw outw
0665 #define outl outl
0666 #define insb insb
0667 #define insw insw
0668 #define insl insl
0669 #define outsb outsb
0670 #define outsw outsw
0671 #define outsl outsl
0672 #ifdef __powerpc64__
0673 #define readq readq
0674 #define writeq writeq
0675 #endif
0676 #define memset_io memset_io
0677 #define memcpy_fromio memcpy_fromio
0678 #define memcpy_toio memcpy_toio
0679
0680
0681
0682
0683
0684 #define xlate_dev_mem_ptr(p) __va(p)
0685
0686
0687
0688
0689 #define readb_relaxed(addr) readb(addr)
0690 #define readw_relaxed(addr) readw(addr)
0691 #define readl_relaxed(addr) readl(addr)
0692 #define readq_relaxed(addr) readq(addr)
0693 #define writeb_relaxed(v, addr) writeb(v, addr)
0694 #define writew_relaxed(v, addr) writew(v, addr)
0695 #define writel_relaxed(v, addr) writel(v, addr)
0696 #define writeq_relaxed(v, addr) writeq(v, addr)
0697
0698 #ifdef CONFIG_GENERIC_IOMAP
0699 #include <asm-generic/iomap.h>
0700 #else
0701
0702
0703
0704 static inline unsigned int ioread16be(const void __iomem *addr)
0705 {
0706 return readw_be(addr);
0707 }
0708 #define ioread16be ioread16be
0709
0710 static inline unsigned int ioread32be(const void __iomem *addr)
0711 {
0712 return readl_be(addr);
0713 }
0714 #define ioread32be ioread32be
0715
0716 #ifdef __powerpc64__
0717 static inline u64 ioread64_lo_hi(const void __iomem *addr)
0718 {
0719 return readq(addr);
0720 }
0721 #define ioread64_lo_hi ioread64_lo_hi
0722
0723 static inline u64 ioread64_hi_lo(const void __iomem *addr)
0724 {
0725 return readq(addr);
0726 }
0727 #define ioread64_hi_lo ioread64_hi_lo
0728
0729 static inline u64 ioread64be(const void __iomem *addr)
0730 {
0731 return readq_be(addr);
0732 }
0733 #define ioread64be ioread64be
0734
0735 static inline u64 ioread64be_lo_hi(const void __iomem *addr)
0736 {
0737 return readq_be(addr);
0738 }
0739 #define ioread64be_lo_hi ioread64be_lo_hi
0740
0741 static inline u64 ioread64be_hi_lo(const void __iomem *addr)
0742 {
0743 return readq_be(addr);
0744 }
0745 #define ioread64be_hi_lo ioread64be_hi_lo
0746 #endif
0747
0748 static inline void iowrite16be(u16 val, void __iomem *addr)
0749 {
0750 writew_be(val, addr);
0751 }
0752 #define iowrite16be iowrite16be
0753
0754 static inline void iowrite32be(u32 val, void __iomem *addr)
0755 {
0756 writel_be(val, addr);
0757 }
0758 #define iowrite32be iowrite32be
0759
0760 #ifdef __powerpc64__
0761 static inline void iowrite64_lo_hi(u64 val, void __iomem *addr)
0762 {
0763 writeq(val, addr);
0764 }
0765 #define iowrite64_lo_hi iowrite64_lo_hi
0766
0767 static inline void iowrite64_hi_lo(u64 val, void __iomem *addr)
0768 {
0769 writeq(val, addr);
0770 }
0771 #define iowrite64_hi_lo iowrite64_hi_lo
0772
0773 static inline void iowrite64be(u64 val, void __iomem *addr)
0774 {
0775 writeq_be(val, addr);
0776 }
0777 #define iowrite64be iowrite64be
0778
0779 static inline void iowrite64be_lo_hi(u64 val, void __iomem *addr)
0780 {
0781 writeq_be(val, addr);
0782 }
0783 #define iowrite64be_lo_hi iowrite64be_lo_hi
0784
0785 static inline void iowrite64be_hi_lo(u64 val, void __iomem *addr)
0786 {
0787 writeq_be(val, addr);
0788 }
0789 #define iowrite64be_hi_lo iowrite64be_hi_lo
0790 #endif
0791
0792 struct pci_dev;
0793 void pci_iounmap(struct pci_dev *dev, void __iomem *addr);
0794 #define pci_iounmap pci_iounmap
0795 void __iomem *ioport_map(unsigned long port, unsigned int len);
0796 #define ioport_map ioport_map
0797 #endif
0798
0799 static inline void iosync(void)
0800 {
0801 __asm__ __volatile__ ("sync" : : : "memory");
0802 }
0803
0804
0805
0806
0807
0808
0809
0810
0811 #define iobarrier_rw() eieio()
0812 #define iobarrier_r() eieio()
0813 #define iobarrier_w() eieio()
0814
0815
0816
0817
0818
0819
0820 #define inb_p(port) inb(port)
0821 #define outb_p(val, port) (udelay(1), outb((val), (port)))
0822 #define inw_p(port) inw(port)
0823 #define outw_p(val, port) (udelay(1), outw((val), (port)))
0824 #define inl_p(port) inl(port)
0825 #define outl_p(val, port) (udelay(1), outl((val), (port)))
0826
0827
0828 #define IO_SPACE_LIMIT ~(0UL)
0829
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858
0859
0860
0861 extern void __iomem *ioremap(phys_addr_t address, unsigned long size);
0862 extern void __iomem *ioremap_prot(phys_addr_t address, unsigned long size,
0863 unsigned long flags);
0864 extern void __iomem *ioremap_wc(phys_addr_t address, unsigned long size);
0865 #define ioremap_wc ioremap_wc
0866
0867 #ifdef CONFIG_PPC32
0868 void __iomem *ioremap_wt(phys_addr_t address, unsigned long size);
0869 #define ioremap_wt ioremap_wt
0870 #endif
0871
0872 void __iomem *ioremap_coherent(phys_addr_t address, unsigned long size);
0873 #define ioremap_uc(addr, size) ioremap((addr), (size))
0874 #define ioremap_cache(addr, size) \
0875 ioremap_prot((addr), (size), pgprot_val(PAGE_KERNEL))
0876
0877 extern void iounmap(volatile void __iomem *addr);
0878
0879 void __iomem *ioremap_phb(phys_addr_t paddr, unsigned long size);
0880
0881 int early_ioremap_range(unsigned long ea, phys_addr_t pa,
0882 unsigned long size, pgprot_t prot);
0883 void __iomem *do_ioremap(phys_addr_t pa, phys_addr_t offset, unsigned long size,
0884 pgprot_t prot, void *caller);
0885
0886 extern void __iomem *__ioremap_caller(phys_addr_t, unsigned long size,
0887 pgprot_t prot, void *caller);
0888
0889
0890
0891
0892
0893
0894
0895 #define HAVE_ARCH_PIO_SIZE 1
0896 #define PIO_OFFSET 0x00000000UL
0897 #define PIO_MASK (FULL_IO_SIZE - 1)
0898 #define PIO_RESERVED (FULL_IO_SIZE)
0899
0900 #define mmio_read16be(addr) readw_be(addr)
0901 #define mmio_read32be(addr) readl_be(addr)
0902 #define mmio_read64be(addr) readq_be(addr)
0903 #define mmio_write16be(val, addr) writew_be(val, addr)
0904 #define mmio_write32be(val, addr) writel_be(val, addr)
0905 #define mmio_write64be(val, addr) writeq_be(val, addr)
0906 #define mmio_insb(addr, dst, count) readsb(addr, dst, count)
0907 #define mmio_insw(addr, dst, count) readsw(addr, dst, count)
0908 #define mmio_insl(addr, dst, count) readsl(addr, dst, count)
0909 #define mmio_outsb(addr, src, count) writesb(addr, src, count)
0910 #define mmio_outsw(addr, src, count) writesw(addr, src, count)
0911 #define mmio_outsl(addr, src, count) writesl(addr, src, count)
0912
0913
0914
0915
0916
0917
0918
0919
0920
0921
0922
0923
0924
0925 static inline unsigned long virt_to_phys(volatile void * address)
0926 {
0927 WARN_ON(IS_ENABLED(CONFIG_DEBUG_VIRTUAL) && !virt_addr_valid(address));
0928
0929 return __pa((unsigned long)address);
0930 }
0931 #define virt_to_phys virt_to_phys
0932
0933
0934
0935
0936
0937
0938
0939
0940
0941
0942
0943
0944
0945 static inline void * phys_to_virt(unsigned long address)
0946 {
0947 return (void *)__va(address);
0948 }
0949 #define phys_to_virt phys_to_virt
0950
0951
0952
0953
0954 static inline phys_addr_t page_to_phys(struct page *page)
0955 {
0956 unsigned long pfn = page_to_pfn(page);
0957
0958 WARN_ON(IS_ENABLED(CONFIG_DEBUG_VIRTUAL) && !pfn_valid(pfn));
0959
0960 return PFN_PHYS(pfn);
0961 }
0962
0963
0964
0965
0966
0967
0968
0969 #ifdef CONFIG_PPC32
0970
0971 static inline unsigned long virt_to_bus(volatile void * address)
0972 {
0973 if (address == NULL)
0974 return 0;
0975 return __pa(address) + PCI_DRAM_OFFSET;
0976 }
0977 #define virt_to_bus virt_to_bus
0978
0979 static inline void * bus_to_virt(unsigned long address)
0980 {
0981 if (address == 0)
0982 return NULL;
0983 return __va(address - PCI_DRAM_OFFSET);
0984 }
0985 #define bus_to_virt bus_to_virt
0986
0987 #endif
0988
0989
0990 #define setbits32(_addr, _v) out_be32((_addr), in_be32(_addr) | (_v))
0991 #define clrbits32(_addr, _v) out_be32((_addr), in_be32(_addr) & ~(_v))
0992
0993 #define setbits16(_addr, _v) out_be16((_addr), in_be16(_addr) | (_v))
0994 #define clrbits16(_addr, _v) out_be16((_addr), in_be16(_addr) & ~(_v))
0995
0996 #define setbits8(_addr, _v) out_8((_addr), in_8(_addr) | (_v))
0997 #define clrbits8(_addr, _v) out_8((_addr), in_8(_addr) & ~(_v))
0998
0999
1000
1001
1002
1003
1004
1005
1006 #define clrsetbits(type, addr, clear, set) \
1007 out_##type((addr), (in_##type(addr) & ~(clear)) | (set))
1008
1009 #ifdef __powerpc64__
1010 #define clrsetbits_be64(addr, clear, set) clrsetbits(be64, addr, clear, set)
1011 #define clrsetbits_le64(addr, clear, set) clrsetbits(le64, addr, clear, set)
1012 #endif
1013
1014 #define clrsetbits_be32(addr, clear, set) clrsetbits(be32, addr, clear, set)
1015 #define clrsetbits_le32(addr, clear, set) clrsetbits(le32, addr, clear, set)
1016
1017 #define clrsetbits_be16(addr, clear, set) clrsetbits(be16, addr, clear, set)
1018 #define clrsetbits_le16(addr, clear, set) clrsetbits(le16, addr, clear, set)
1019
1020 #define clrsetbits_8(addr, clear, set) clrsetbits(8, addr, clear, set)
1021
1022 #include <asm-generic/io.h>
1023
1024 #endif
1025
1026 #endif