io.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. /*
  2. * include/asm-s390/io.h
  3. *
  4. * S390 version
  5. * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
  6. * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
  7. *
  8. * Derived from "include/asm-i386/io.h"
  9. */
  10. #ifndef _S390_IO_H
  11. #define _S390_IO_H
  12. #ifdef __KERNEL__
  13. #include <linux/vmalloc.h>
  14. #include <asm/page.h>
  15. #define IO_SPACE_LIMIT 0xffffffff
  16. #define __io_virt(x) ((void *)(PAGE_OFFSET | (unsigned long)(x)))
  17. /*
  18. * Change virtual addresses to physical addresses and vv.
  19. * These are pretty trivial
  20. */
  21. static inline unsigned long virt_to_phys(volatile void * address)
  22. {
  23. unsigned long real_address;
  24. asm volatile(
  25. #ifndef __s390x__
  26. " lra %0,0(%1)\n"
  27. #else /* __s390x__ */
  28. " lrag %0,0(%1)\n"
  29. #endif /* __s390x__ */
  30. " jz 0f\n"
  31. " la %0,0\n"
  32. "0:"
  33. : "=a" (real_address) : "a" (address) : "cc");
  34. return real_address;
  35. }
  36. static inline void * phys_to_virt(unsigned long address)
  37. {
  38. return __io_virt(address);
  39. }
  40. extern void * __ioremap(unsigned long offset, unsigned long size, unsigned long flags);
  41. static inline void * ioremap (unsigned long offset, unsigned long size)
  42. {
  43. return __ioremap(offset, size, 0);
  44. }
  45. /*
  46. * This one maps high address device memory and turns off caching for that area.
  47. * it's useful if some control registers are in such an area and write combining
  48. * or read caching is not desirable:
  49. */
  50. static inline void * ioremap_nocache (unsigned long offset, unsigned long size)
  51. {
  52. return __ioremap(offset, size, 0);
  53. }
  54. extern void iounmap(void *addr);
  55. /*
  56. * IO bus memory addresses are also 1:1 with the physical address
  57. */
  58. #define virt_to_bus virt_to_phys
  59. #define bus_to_virt phys_to_virt
  60. /*
  61. * readX/writeX() are used to access memory mapped devices. On some
  62. * architectures the memory mapped IO stuff needs to be accessed
  63. * differently.
  64. */
  65. #define readb(addr) (*(volatile unsigned char *) __io_virt(addr))
  66. #define readw(addr) (*(volatile unsigned short *) __io_virt(addr))
  67. #define readl(addr) (*(volatile unsigned int *) __io_virt(addr))
  68. #define readq(addr) (*(volatile unsigned long long *) __io_virt(addr))
  69. #define readb_relaxed(addr) readb(addr)
  70. #define readw_relaxed(addr) readw(addr)
  71. #define readl_relaxed(addr) readl(addr)
  72. #define readq_relaxed(addr) readq(addr)
  73. #define __raw_readb readb
  74. #define __raw_readw readw
  75. #define __raw_readl readl
  76. #define __raw_readq readq
  77. #define writeb(b,addr) (*(volatile unsigned char *) __io_virt(addr) = (b))
  78. #define writew(b,addr) (*(volatile unsigned short *) __io_virt(addr) = (b))
  79. #define writel(b,addr) (*(volatile unsigned int *) __io_virt(addr) = (b))
  80. #define writeq(b,addr) (*(volatile unsigned long long *) __io_virt(addr) = (b))
  81. #define __raw_writeb writeb
  82. #define __raw_writew writew
  83. #define __raw_writel writel
  84. #define __raw_writeq writeq
  85. #define memset_io(a,b,c) memset(__io_virt(a),(b),(c))
  86. #define memcpy_fromio(a,b,c) memcpy((a),__io_virt(b),(c))
  87. #define memcpy_toio(a,b,c) memcpy(__io_virt(a),(b),(c))
  88. #define inb_p(addr) readb(addr)
  89. #define inb(addr) readb(addr)
  90. #define outb(x,addr) ((void) writeb(x,addr))
  91. #define outb_p(x,addr) outb(x,addr)
  92. #define mmiowb() do { } while (0)
  93. /*
  94. * Convert a physical pointer to a virtual kernel pointer for /dev/mem
  95. * access
  96. */
  97. #define xlate_dev_mem_ptr(p) __va(p)
  98. /*
  99. * Convert a virtual cached pointer to an uncached pointer
  100. */
  101. #define xlate_dev_kmem_ptr(p) p
  102. #endif /* __KERNEL__ */
  103. #endif