io.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  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__ (
  25. #ifndef __s390x__
  26. " lra %0,0(%1)\n"
  27. " jz 0f\n"
  28. " sr %0,%0\n"
  29. #else /* __s390x__ */
  30. " lrag %0,0(%1)\n"
  31. " jz 0f\n"
  32. " slgr %0,%0\n"
  33. #endif /* __s390x__ */
  34. "0:"
  35. : "=a" (real_address) : "a" (address) : "cc" );
  36. return real_address;
  37. }
  38. static inline void * phys_to_virt(unsigned long address)
  39. {
  40. return __io_virt(address);
  41. }
  42. /*
  43. * Change "struct page" to physical address.
  44. */
  45. #define page_to_phys(page) ((page - mem_map) << PAGE_SHIFT)
  46. extern void * __ioremap(unsigned long offset, unsigned long size, unsigned long flags);
  47. static inline void * ioremap (unsigned long offset, unsigned long size)
  48. {
  49. return __ioremap(offset, size, 0);
  50. }
  51. /*
  52. * This one maps high address device memory and turns off caching for that area.
  53. * it's useful if some control registers are in such an area and write combining
  54. * or read caching is not desirable:
  55. */
  56. static inline void * ioremap_nocache (unsigned long offset, unsigned long size)
  57. {
  58. return __ioremap(offset, size, 0);
  59. }
  60. extern void iounmap(void *addr);
  61. /*
  62. * IO bus memory addresses are also 1:1 with the physical address
  63. */
  64. #define virt_to_bus virt_to_phys
  65. #define bus_to_virt phys_to_virt
  66. /*
  67. * readX/writeX() are used to access memory mapped devices. On some
  68. * architectures the memory mapped IO stuff needs to be accessed
  69. * differently.
  70. */
  71. #define readb(addr) (*(volatile unsigned char *) __io_virt(addr))
  72. #define readw(addr) (*(volatile unsigned short *) __io_virt(addr))
  73. #define readl(addr) (*(volatile unsigned int *) __io_virt(addr))
  74. #define readq(addr) (*(volatile unsigned long long *) __io_virt(addr))
  75. #define readb_relaxed(addr) readb(addr)
  76. #define readw_relaxed(addr) readw(addr)
  77. #define readl_relaxed(addr) readl(addr)
  78. #define readq_relaxed(addr) readq(addr)
  79. #define __raw_readb readb
  80. #define __raw_readw readw
  81. #define __raw_readl readl
  82. #define __raw_readq readq
  83. #define writeb(b,addr) (*(volatile unsigned char *) __io_virt(addr) = (b))
  84. #define writew(b,addr) (*(volatile unsigned short *) __io_virt(addr) = (b))
  85. #define writel(b,addr) (*(volatile unsigned int *) __io_virt(addr) = (b))
  86. #define writeq(b,addr) (*(volatile unsigned long long *) __io_virt(addr) = (b))
  87. #define __raw_writeb writeb
  88. #define __raw_writew writew
  89. #define __raw_writel writel
  90. #define __raw_writeq writeq
  91. #define memset_io(a,b,c) memset(__io_virt(a),(b),(c))
  92. #define memcpy_fromio(a,b,c) memcpy((a),__io_virt(b),(c))
  93. #define memcpy_toio(a,b,c) memcpy(__io_virt(a),(b),(c))
  94. #define inb_p(addr) readb(addr)
  95. #define inb(addr) readb(addr)
  96. #define outb(x,addr) ((void) writeb(x,addr))
  97. #define outb_p(x,addr) outb(x,addr)
  98. #define mmiowb() do { } while (0)
  99. /*
  100. * Convert a physical pointer to a virtual kernel pointer for /dev/mem
  101. * access
  102. */
  103. #define xlate_dev_mem_ptr(p) __va(p)
  104. /*
  105. * Convert a virtual cached pointer to an uncached pointer
  106. */
  107. #define xlate_dev_kmem_ptr(p) p
  108. #endif /* __KERNEL__ */
  109. #endif