io.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:8k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _ASM_IO_H
  2. #define _ASM_IO_H
  3. /* USE_HPPA_IOREMAP IS THE MAGIC FLAG TO ENABLE OR DISABLE REAL IOREMAP() FUNCTIONALITY */
  4. /* FOR 712 or 715 MACHINES THIS SHOULD BE ENABLED, 
  5.    NEWER MACHINES STILL HAVE SOME ISSUES IN THE SCSI AND/OR NETWORK DRIVERS AND 
  6.    BECAUSE OF THAT I WILL LEAVE IT DISABLED FOR NOW <deller@gmx.de> */
  7. /* WHEN THOSE ISSUES ARE SOLVED, USE_HPPA_IOREMAP WILL GO AWAY */
  8. #define USE_HPPA_IOREMAP 0
  9. #include <linux/config.h>
  10. #include <linux/types.h>
  11. #include <asm/pgtable.h>
  12. #define virt_to_phys(a) ((unsigned long)__pa(a))
  13. #define phys_to_virt(a) __va(a)
  14. #define virt_to_bus virt_to_phys
  15. #define bus_to_virt phys_to_virt
  16. /* Memory mapped IO */
  17. extern void * __ioremap(unsigned long offset, unsigned long size, unsigned long flags);
  18. extern inline void * ioremap(unsigned long offset, unsigned long size)
  19. {
  20. return __ioremap(offset, size, 0);
  21. }
  22. /*
  23.  * This one maps high address device memory and turns off caching for that area.
  24.  * it's useful if some control registers are in such an area and write combining
  25.  * or read caching is not desirable:
  26.  */
  27. extern inline void * ioremap_nocache (unsigned long offset, unsigned long size)
  28. {
  29.         return __ioremap(offset, size, _PAGE_NO_CACHE /* _PAGE_PCD */);
  30. }
  31. extern void iounmap(void *addr);
  32. /*
  33.  * __raw_ variants have no defined meaning.  on hppa, it means `i was
  34.  * too lazy to ioremap first'.  kind of like isa_, except that there's
  35.  * no additional base address to add on.
  36.  */
  37. extern __inline__ unsigned char __raw_readb(unsigned long addr)
  38. {
  39. long flags;
  40. unsigned char ret;
  41. __asm__ __volatile__(
  42. " rsm 2,%0n"
  43. " ldbx 0(%2),%1n"
  44. " mtsm %0n"
  45. : "=&r" (flags), "=r" (ret) : "r" (addr) );
  46. return ret;
  47. }
  48. extern __inline__ unsigned short __raw_readw(unsigned long addr)
  49. {
  50. long flags;
  51. unsigned short ret;
  52. __asm__ __volatile__(
  53. " rsm 2,%0n"
  54. " ldhx 0(%2),%1n"
  55. " mtsm %0n"
  56. : "=&r" (flags), "=r" (ret) : "r" (addr) );
  57. return ret;
  58. }
  59. extern __inline__ unsigned int __raw_readl(unsigned long addr)
  60. {
  61. u32 ret;
  62. __asm__ __volatile__(
  63. " ldwax 0(%1),%0n"
  64. : "=r" (ret) : "r" (addr) );
  65. return ret;
  66. }
  67. extern __inline__ unsigned long long __raw_readq(unsigned long addr)
  68. {
  69. unsigned long long ret;
  70. #ifdef __LP64__
  71. __asm__ __volatile__(
  72. " ldda 0(%1),%0n"
  73. :  "=r" (ret) : "r" (addr) );
  74. #else
  75. /* two reads may have side effects.. */
  76. ret = ((u64) __raw_readl(addr)) << 32;
  77. ret |= __raw_readl(addr+4);
  78. #endif
  79. return ret;
  80. }
  81. extern __inline__ void __raw_writeb(unsigned char val, unsigned long addr)
  82. {
  83. long flags;
  84. __asm__ __volatile__(
  85. " rsm 2,%0n"
  86. " stbs %1,0(%2)n"
  87. " mtsm %0n"
  88. : "=&r" (flags) :  "r" (val), "r" (addr) );
  89. }
  90. extern __inline__ void __raw_writew(unsigned short val, unsigned long addr)
  91. {
  92. long flags;
  93. __asm__ __volatile__(
  94. " rsm 2,%0n"
  95. " sths %1,0(%2)n"
  96. " mtsm %0n"
  97. : "=&r" (flags) :  "r" (val), "r" (addr) );
  98. }
  99. extern __inline__ void __raw_writel(unsigned int val, unsigned long addr)
  100. {
  101. __asm__ __volatile__(
  102. " stwas %0,0(%1)n"
  103. : :  "r" (val), "r" (addr) );
  104. }
  105. extern __inline__ void __raw_writeq(unsigned long long val, unsigned long addr)
  106. {
  107. #ifdef __LP64__
  108. __asm__ __volatile__(
  109. " stda %0,0(%1)n"
  110. : :  "r" (val), "r" (addr) );
  111. #else
  112. /* two writes may have side effects.. */
  113. __raw_writel(val >> 32, addr);
  114. __raw_writel(val, addr+4);
  115. #endif
  116. }
  117. #if USE_HPPA_IOREMAP
  118. #define readb(addr) (*(volatile unsigned char *) (addr))
  119. #define readw(addr) (*(volatile unsigned short *) (addr))
  120. #define readl(addr) (*(volatile unsigned int *) (addr))
  121. #define readq(addr) (*(volatile u64 *) (addr))
  122. #define writeb(b,addr) (*(volatile unsigned char *) (addr) = (b))
  123. #define writew(b,addr) (*(volatile unsigned short *) (addr) = (b))
  124. #define writel(b,addr) (*(volatile unsigned int *) (addr) = (b))
  125. #define writeq(b,addr) (*(volatile u64 *) (addr) = (b))
  126. #else /* !USE_HPPA_IOREMAP */
  127. #define readb(addr) __raw_readb((unsigned long)(addr))
  128. #define readw(addr) le16_to_cpu(__raw_readw((unsigned long)(addr)))
  129. #define readl(addr) le32_to_cpu(__raw_readl((unsigned long)(addr)))
  130. #define readq(addr) le64_to_cpu(__raw_readq((unsigned long)(addr)))
  131. #define writeb(b,addr) __raw_writeb(b,(unsigned long)(addr))
  132. #define writew(b,addr) __raw_writew(cpu_to_le16(b),(unsigned long)(addr))
  133. #define writel(b,addr) __raw_writel(cpu_to_le32(b),(unsigned long)(addr))
  134. #define writeq(b,addr) __raw_writeq(cpu_to_le64(b),(unsigned long)(addr))
  135. #endif /* !USE_HPPA_IOREMAP */
  136. extern void memcpy_fromio(void *dest, unsigned long src, int count);
  137. extern void memcpy_toio(unsigned long dest, const void *src, int count);
  138. extern void memset_io(unsigned long dest, char fill, int count);
  139. /* Support old drivers which don't ioremap.
  140.  * NB this interface is scheduled to disappear in 2.5
  141.  */
  142. #define EISA_BASE 0xfffffffffc000000UL
  143. #define isa_readb(a) readb(EISA_BASE | (a))
  144. #define isa_readw(a) readw(EISA_BASE | (a))
  145. #define isa_readl(a) readl(EISA_BASE | (a))
  146. #define isa_writeb(b,a) writeb((b), EISA_BASE | (a))
  147. #define isa_writew(b,a) writew((b), EISA_BASE | (a))
  148. #define isa_writel(b,a) writel((b), EISA_BASE | (a))
  149. #define isa_memset_io(a,b,c) memset_io(EISA_BASE | (a), (b), (c))
  150. #define isa_memcpy_fromio(a,b,c) memcpy_fromio((a), EISA_BASE | (b), (c))
  151. #define isa_memcpy_toio(a,b,c) memcpy_toio(EISA_BASE | (a), (b), (c))
  152. /*
  153.  * XXX - We don't have csum_partial_copy_fromio() yet, so we cheat here and 
  154.  * just copy it. The net code will then do the checksum later. Presently 
  155.  * only used by some shared memory 8390 Ethernet cards anyway.
  156.  */
  157. #define eth_io_copy_and_sum(skb,src,len,unused) 
  158.   memcpy_fromio((skb)->data,(src),(len))
  159. #define isa_eth_io_copy_and_sum(skb,src,len,unused) 
  160.   isa_memcpy_fromio((skb)->data,(src),(len))
  161. /* Port-space IO */
  162. #define inb_p inb
  163. #define inw_p inw
  164. #define inl_p inl
  165. #define outb_p outb
  166. #define outw_p outw
  167. #define outl_p outl
  168. extern unsigned char eisa_in8(unsigned short port);
  169. extern unsigned short eisa_in16(unsigned short port);
  170. extern unsigned int eisa_in32(unsigned short port);
  171. extern void eisa_out8(unsigned char data, unsigned short port);
  172. extern void eisa_out16(unsigned short data, unsigned short port);
  173. extern void eisa_out32(unsigned int data, unsigned short port);
  174. #if defined(CONFIG_PCI)
  175. extern unsigned char inb(int addr);
  176. extern unsigned short inw(int addr);
  177. extern unsigned int inl(int addr);
  178. extern void outb(unsigned char b, int addr);
  179. extern void outw(unsigned short b, int addr);
  180. extern void outl(unsigned int b, int addr);
  181. #elif defined(CONFIG_EISA)
  182. #define inb eisa_in8
  183. #define inw eisa_in16
  184. #define inl eisa_in32
  185. #define outb eisa_out8
  186. #define outw eisa_out16
  187. #define outl eisa_out32
  188. #else
  189. static inline char inb(unsigned long addr)
  190. {
  191. BUG();
  192. return -1;
  193. }
  194. static inline short inw(unsigned long addr)
  195. {
  196. BUG();
  197. return -1;
  198. }
  199. static inline int inl(unsigned long addr)
  200. {
  201. BUG();
  202. return -1;
  203. }
  204. #define outb(x, y) BUG()
  205. #define outw(x, y) BUG()
  206. #define outl(x, y) BUG()
  207. #endif
  208. /*
  209.  * String versions of in/out ops:
  210.  */
  211. extern void insb (unsigned long port, void *dst, unsigned long count);
  212. extern void insw (unsigned long port, void *dst, unsigned long count);
  213. extern void insl (unsigned long port, void *dst, unsigned long count);
  214. extern void outsb (unsigned long port, const void *src, unsigned long count);
  215. extern void outsw (unsigned long port, const void *src, unsigned long count);
  216. extern void outsl (unsigned long port, const void *src, unsigned long count);
  217. /* IO Port space is :      BBiiii   where BB is HBA number. */
  218. #define IO_SPACE_LIMIT 0x00ffffff
  219. #define dma_cache_inv(_start,_size) do { flush_kernel_dcache_range(_start,_size); } while(0)
  220. #define dma_cache_wback(_start,_size) do { flush_kernel_dcache_range(_start,_size); } while (0)
  221. #define dma_cache_wback_inv(_start,_size) do { flush_kernel_dcache_range(_start,_size); } while (0)
  222. #endif