io.h 3.5 KB

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