iomap.c 2.8 KB

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