1 /* 2 * ppc64 "iomap" interface implementation. 3 * 4 * (C) Copyright 2004 Linus Torvalds 5 */ 6 #include <linux/init.h> 7 #include <linux/pci.h> 8 #include <linux/mm.h> 9 #include <asm/io.h> 10 11 /* 12 * Here comes the ppc64 implementation of the IOMAP 13 * interfaces. 14 */ 15 unsigned int ioread8(void __iomem *addr) 16 { 17 return readb(addr); 18 } 19 unsigned int ioread16(void __iomem *addr) 20 { 21 return readw(addr); 22 } 23 unsigned int ioread16be(void __iomem *addr) 24 { 25 return in_be16(addr); 26 } 27 unsigned int ioread32(void __iomem *addr) 28 { 29 return readl(addr); 30 } 31 unsigned int ioread32be(void __iomem *addr) 32 { 33 return in_be32(addr); 34 } 35 EXPORT_SYMBOL(ioread8); 36 EXPORT_SYMBOL(ioread16); 37 EXPORT_SYMBOL(ioread16be); 38 EXPORT_SYMBOL(ioread32); 39 EXPORT_SYMBOL(ioread32be); 40 41 void iowrite8(u8 val, void __iomem *addr) 42 { 43 writeb(val, addr); 44 } 45 void iowrite16(u16 val, void __iomem *addr) 46 { 47 writew(val, addr); 48 } 49 void iowrite16be(u16 val, void __iomem *addr) 50 { 51 out_be16(addr, val); 52 } 53 void iowrite32(u32 val, void __iomem *addr) 54 { 55 writel(val, addr); 56 } 57 void iowrite32be(u32 val, void __iomem *addr) 58 { 59 out_be32(addr, val); 60 } 61 EXPORT_SYMBOL(iowrite8); 62 EXPORT_SYMBOL(iowrite16); 63 EXPORT_SYMBOL(iowrite16be); 64 EXPORT_SYMBOL(iowrite32); 65 EXPORT_SYMBOL(iowrite32be); 66 67 /* 68 * These are the "repeat read/write" functions. Note the 69 * non-CPU byte order. We do things in "IO byteorder" 70 * here. 71 * 72 * FIXME! We could make these do EEH handling if we really 73 * wanted. Not clear if we do. 74 */ 75 void ioread8_rep(void __iomem *addr, void *dst, unsigned long count) 76 { 77 _insb((u8 __iomem *) addr, dst, count); 78 } 79 void ioread16_rep(void __iomem *addr, void *dst, unsigned long count) 80 { 81 _insw_ns((u16 __iomem *) addr, dst, count); 82 } 83 void ioread32_rep(void __iomem *addr, void *dst, unsigned long count) 84 { 85 _insl_ns((u32 __iomem *) addr, dst, count); 86 } 87 EXPORT_SYMBOL(ioread8_rep); 88 EXPORT_SYMBOL(ioread16_rep); 89 EXPORT_SYMBOL(ioread32_rep); 90 91 void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count) 92 { 93 _outsb((u8 __iomem *) addr, src, count); 94 } 95 void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count) 96 { 97 _outsw_ns((u16 __iomem *) addr, src, count); 98 } 99 void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count) 100 { 101 _outsl_ns((u32 __iomem *) addr, src, count); 102 } 103 EXPORT_SYMBOL(iowrite8_rep); 104 EXPORT_SYMBOL(iowrite16_rep); 105 EXPORT_SYMBOL(iowrite32_rep); 106 107 void __iomem *ioport_map(unsigned long port, unsigned int len) 108 { 109 return (void __iomem *) (port + _IO_BASE); 110 } 111 112 void ioport_unmap(void __iomem *addr) 113 { 114 /* Nothing to do */ 115 } 116 EXPORT_SYMBOL(ioport_map); 117 EXPORT_SYMBOL(ioport_unmap); 118 119 void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long max) 120 { 121 unsigned long start = pci_resource_start(dev, bar); 122 unsigned long len = pci_resource_len(dev, bar); 123 unsigned long flags = pci_resource_flags(dev, bar); 124 125 if (!len) 126 return NULL; 127 if (max && len > max) 128 len = max; 129 if (flags & IORESOURCE_IO) 130 return ioport_map(start, len); 131 if (flags & IORESOURCE_MEM) 132 return ioremap(start, len); 133 /* What? */ 134 return NULL; 135 } 136 137 void pci_iounmap(struct pci_dev *dev, void __iomem *addr) 138 { 139 /* Nothing to do */ 140 } 141 EXPORT_SYMBOL(pci_iomap); 142 EXPORT_SYMBOL(pci_iounmap); 143