iomap.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * ppc64 "iomap" interface implementation.
  4. *
  5. * (C) Copyright 2004 Linus Torvalds
  6. */
  7. #include <linux/pci.h>
  8. #include <linux/mm.h>
  9. #include <linux/export.h>
  10. #include <asm/io.h>
  11. #include <asm/pci-bridge.h>
  12. #include <asm/isa-bridge.h>
  13. /*
  14. * Here comes the ppc64 implementation of the IOMAP
  15. * interfaces.
  16. */
  17. unsigned int ioread8(void __iomem *addr)
  18. {
  19. return readb(addr);
  20. }
  21. unsigned int ioread16(void __iomem *addr)
  22. {
  23. return readw(addr);
  24. }
  25. unsigned int ioread16be(void __iomem *addr)
  26. {
  27. return readw_be(addr);
  28. }
  29. unsigned int ioread32(void __iomem *addr)
  30. {
  31. return readl(addr);
  32. }
  33. unsigned int ioread32be(void __iomem *addr)
  34. {
  35. return readl_be(addr);
  36. }
  37. EXPORT_SYMBOL(ioread8);
  38. EXPORT_SYMBOL(ioread16);
  39. EXPORT_SYMBOL(ioread16be);
  40. EXPORT_SYMBOL(ioread32);
  41. EXPORT_SYMBOL(ioread32be);
  42. #ifdef __powerpc64__
  43. u64 ioread64(void __iomem *addr)
  44. {
  45. return readq(addr);
  46. }
  47. u64 ioread64_lo_hi(void __iomem *addr)
  48. {
  49. return readq(addr);
  50. }
  51. u64 ioread64_hi_lo(void __iomem *addr)
  52. {
  53. return readq(addr);
  54. }
  55. u64 ioread64be(void __iomem *addr)
  56. {
  57. return readq_be(addr);
  58. }
  59. u64 ioread64be_lo_hi(void __iomem *addr)
  60. {
  61. return readq_be(addr);
  62. }
  63. u64 ioread64be_hi_lo(void __iomem *addr)
  64. {
  65. return readq_be(addr);
  66. }
  67. EXPORT_SYMBOL(ioread64);
  68. EXPORT_SYMBOL(ioread64_lo_hi);
  69. EXPORT_SYMBOL(ioread64_hi_lo);
  70. EXPORT_SYMBOL(ioread64be);
  71. EXPORT_SYMBOL(ioread64be_lo_hi);
  72. EXPORT_SYMBOL(ioread64be_hi_lo);
  73. #endif /* __powerpc64__ */
  74. void iowrite8(u8 val, void __iomem *addr)
  75. {
  76. writeb(val, addr);
  77. }
  78. void iowrite16(u16 val, void __iomem *addr)
  79. {
  80. writew(val, addr);
  81. }
  82. void iowrite16be(u16 val, void __iomem *addr)
  83. {
  84. writew_be(val, addr);
  85. }
  86. void iowrite32(u32 val, void __iomem *addr)
  87. {
  88. writel(val, addr);
  89. }
  90. void iowrite32be(u32 val, void __iomem *addr)
  91. {
  92. writel_be(val, addr);
  93. }
  94. EXPORT_SYMBOL(iowrite8);
  95. EXPORT_SYMBOL(iowrite16);
  96. EXPORT_SYMBOL(iowrite16be);
  97. EXPORT_SYMBOL(iowrite32);
  98. EXPORT_SYMBOL(iowrite32be);
  99. #ifdef __powerpc64__
  100. void iowrite64(u64 val, void __iomem *addr)
  101. {
  102. writeq(val, addr);
  103. }
  104. void iowrite64_lo_hi(u64 val, void __iomem *addr)
  105. {
  106. writeq(val, addr);
  107. }
  108. void iowrite64_hi_lo(u64 val, void __iomem *addr)
  109. {
  110. writeq(val, addr);
  111. }
  112. void iowrite64be(u64 val, void __iomem *addr)
  113. {
  114. writeq_be(val, addr);
  115. }
  116. void iowrite64be_lo_hi(u64 val, void __iomem *addr)
  117. {
  118. writeq_be(val, addr);
  119. }
  120. void iowrite64be_hi_lo(u64 val, void __iomem *addr)
  121. {
  122. writeq_be(val, addr);
  123. }
  124. EXPORT_SYMBOL(iowrite64);
  125. EXPORT_SYMBOL(iowrite64_lo_hi);
  126. EXPORT_SYMBOL(iowrite64_hi_lo);
  127. EXPORT_SYMBOL(iowrite64be);
  128. EXPORT_SYMBOL(iowrite64be_lo_hi);
  129. EXPORT_SYMBOL(iowrite64be_hi_lo);
  130. #endif /* __powerpc64__ */
  131. /*
  132. * These are the "repeat read/write" functions. Note the
  133. * non-CPU byte order. We do things in "IO byteorder"
  134. * here.
  135. *
  136. * FIXME! We could make these do EEH handling if we really
  137. * wanted. Not clear if we do.
  138. */
  139. void ioread8_rep(void __iomem *addr, void *dst, unsigned long count)
  140. {
  141. readsb(addr, dst, count);
  142. }
  143. void ioread16_rep(void __iomem *addr, void *dst, unsigned long count)
  144. {
  145. readsw(addr, dst, count);
  146. }
  147. void ioread32_rep(void __iomem *addr, void *dst, unsigned long count)
  148. {
  149. readsl(addr, dst, count);
  150. }
  151. EXPORT_SYMBOL(ioread8_rep);
  152. EXPORT_SYMBOL(ioread16_rep);
  153. EXPORT_SYMBOL(ioread32_rep);
  154. void iowrite8_rep(void __iomem *addr, const void *src, unsigned long count)
  155. {
  156. writesb(addr, src, count);
  157. }
  158. void iowrite16_rep(void __iomem *addr, const void *src, unsigned long count)
  159. {
  160. writesw(addr, src, count);
  161. }
  162. void iowrite32_rep(void __iomem *addr, const void *src, unsigned long count)
  163. {
  164. writesl(addr, src, count);
  165. }
  166. EXPORT_SYMBOL(iowrite8_rep);
  167. EXPORT_SYMBOL(iowrite16_rep);
  168. EXPORT_SYMBOL(iowrite32_rep);
  169. void __iomem *ioport_map(unsigned long port, unsigned int len)
  170. {
  171. return (void __iomem *) (port + _IO_BASE);
  172. }
  173. void ioport_unmap(void __iomem *addr)
  174. {
  175. /* Nothing to do */
  176. }
  177. EXPORT_SYMBOL(ioport_map);
  178. EXPORT_SYMBOL(ioport_unmap);
  179. #ifdef CONFIG_PCI
  180. void pci_iounmap(struct pci_dev *dev, void __iomem *addr)
  181. {
  182. if (isa_vaddr_is_ioport(addr))
  183. return;
  184. if (pcibios_vaddr_is_ioport(addr))
  185. return;
  186. iounmap(addr);
  187. }
  188. EXPORT_SYMBOL(pci_iounmap);
  189. #endif /* CONFIG_PCI */