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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _PPC64_IO_H
  2. #define _PPC64_IO_H
  3. /* 
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version
  7.  * 2 of the License, or (at your option) any later version.
  8.  */
  9. #include <linux/config.h>
  10. #include <asm/page.h>
  11. #include <asm/byteorder.h>
  12. #ifdef CONFIG_PPC_ISERIES 
  13. #include <asm/iSeries/iSeries_io.h>
  14. #endif  
  15. #include <asm/memory.h>
  16. #include <asm/delay.h>
  17. #define SIO_CONFIG_RA 0x398
  18. #define SIO_CONFIG_RD 0x399
  19. #define SLOW_DOWN_IO
  20. /* Define this if you want to see virt_to_* messages */
  21. #undef __IO_DEBUG
  22. extern unsigned long isa_io_base;
  23. extern unsigned long isa_mem_base;
  24. extern unsigned long pci_io_base;
  25. extern unsigned long pci_dram_offset;
  26. extern int have_print;
  27. #define _IO_BASE isa_io_base
  28. #define _ISA_MEM_BASE isa_mem_base
  29. #define PCI_DRAM_OFFSET pci_dram_offset
  30. #ifdef CONFIG_PPC_ISERIES
  31. #define readb(addr) iSeries_Read_Byte((void*)(addr))  
  32. #define readw(addr) iSeries_Read_Word((void*)(addr))  
  33. #define readl(addr) iSeries_Read_Long((void*)(addr))
  34. #define writeb(data, addr) iSeries_Write_Byte(data,((void*)(addr)))
  35. #define writew(data, addr) iSeries_Write_Word(data,((void*)(addr)))
  36. #define writel(data, addr) iSeries_Write_Long(data,((void*)(addr)))
  37. #define memset_io(a,b,c) iSeries_memset_io((void *)(a),(b),(c))
  38. #define memcpy_fromio(a,b,c) iSeries_memcpy_fromio((void *)(a), (void *)(b), (c))
  39. #define memcpy_toio(a,b,c) iSeries_memcpy_toio((void *)(a), (void *)(b), (c))
  40. #define inb(addr) readb(((unsigned long)(addr)))  
  41. #define inw(addr) readw(((unsigned long)(addr)))  
  42. #define inl(addr) readl(((unsigned long)(addr)))
  43. #define outb(data,addr) writeb(data,((unsigned long)(addr)))  
  44. #define outw(data,addr) writew(data,((unsigned long)(addr)))  
  45. #define outl(data,addr) writel(data,((unsigned long)(addr)))
  46. #else
  47. #define IS_MAPPED_VADDR(port) ((unsigned long)(port) >> 60UL)
  48. #define readb(addr) eeh_readb((void*)(addr))  
  49. #define readw(addr) eeh_readw((void*)(addr))  
  50. #define readl(addr) eeh_readl((void*)(addr))
  51. #define writeb(data, addr) eeh_writeb((data), ((void*)(addr)))
  52. #define writew(data, addr) eeh_writew((data), ((void*)(addr)))
  53. #define writel(data, addr) eeh_writel((data), ((void*)(addr)))
  54. #define memset_io(a,b,c) eeh_memset_io((void *)(a),(b),(c))
  55. #define memcpy_fromio(a,b,c) eeh_memcpy_fromio((a),(void *)(b),(c))
  56. #define memcpy_toio(a,b,c) eeh_memcpy_toio((void *)(a),(b),(c))
  57. #define inb(port) _inb((unsigned long)port)
  58. #define outb(val, port) _outb(val, (unsigned long)port)
  59. #define inw(port) _inw((unsigned long)port)
  60. #define outw(val, port) _outw(val, (unsigned long)port)
  61. #define inl(port) _inl((unsigned long)port)
  62. #define outl(val, port) _outl(val, (unsigned long)port)
  63. /*
  64.  * The insw/outsw/insl/outsl macros don't do byte-swapping.
  65.  * They are only used in practice for transferring buffers which
  66.  * are arrays of bytes, and byte-swapping is not appropriate in
  67.  * that case.  - paulus */
  68. #define insb(port, buf, ns) eeh_insb((u8 *)(port), (buf), (ns))
  69. #define outsb(port, buf, ns) eeh_outsb((u8 *)(port), (buf), (ns))
  70. #define insw(port, buf, ns) eeh_insw_ns((u16 *)(port), (buf), (ns))
  71. #define outsw(port, buf, ns) eeh_outsw_ns((u16 *)(port), (buf), (ns))
  72. #define insl(port, buf, nl) eeh_insl_ns((u32 *)(port), (buf), (nl))
  73. #define outsl(port, buf, nl) eeh_outsl_ns((u32 *)(port), (buf), (nl))
  74. #endif
  75. /*
  76.  * output pause versions need a delay at least for the
  77.  * w83c105 ide controller in a p610.
  78.  */
  79. #define inb_p(port)             inb(port)
  80. #define outb_p(val, port)       (udelay(1), outb((val), (port)))
  81. #define inw_p(port)             inw(port)
  82. #define outw_p(val, port)       (udelay(1), outw((val), (port)))
  83. #define inl_p(port)             inl(port)
  84. #define outl_p(val, port)       (udelay(1), outl((val, (port)))
  85. extern void _insb(volatile u8 *port, void *buf, int ns);
  86. extern void _outsb(volatile u8 *port, const void *buf, int ns);
  87. extern void _insw(volatile u16 *port, void *buf, int ns);
  88. extern void _outsw(volatile u16 *port, const void *buf, int ns);
  89. extern void _insl(volatile u32 *port, void *buf, int nl);
  90. extern void _outsl(volatile u32 *port, const void *buf, int nl);
  91. extern void _insw_ns(volatile u16 *port, void *buf, int ns);
  92. extern void _outsw_ns(volatile u16 *port, const void *buf, int ns);
  93. extern void _insl_ns(volatile u32 *port, void *buf, int nl);
  94. extern void _outsl_ns(volatile u32 *port, const void *buf, int nl);
  95. /*
  96.  * The *_ns versions below don't do byte-swapping.
  97.  * Neither do the standard versions now, these are just here
  98.  * for older code.
  99.  */
  100. #define insw_ns(port, buf, ns) insw(port, buf, ns)
  101. #define outsw_ns(port, buf, ns) outsw(port, buf, ns)
  102. #define insl_ns(port, buf, nl) insl(port, buf, nl)
  103. #define outsl_ns(port, buf, nl) outsl(port, buf, nl)
  104. #define IO_SPACE_LIMIT ~(0UL)
  105. #define MEM_SPACE_LIMIT ~(0UL)
  106. #ifdef __KERNEL__
  107. /*
  108.  * Map in an area of physical address space, for accessing
  109.  * I/O devices etc.
  110.  */
  111. extern void *__ioremap(unsigned long address, unsigned long size,
  112.        unsigned long flags);
  113. extern void *ioremap(unsigned long address, unsigned long size);
  114. #define ioremap_nocache(addr, size) ioremap((addr), (size))
  115. extern void iounmap(void *addr);
  116. /*
  117.  * Change virtual addresses to physical addresses and vv, for
  118.  * addresses in the area where the kernel has the RAM mapped.
  119.  */
  120. static inline unsigned long virt_to_phys(volatile void * address)
  121. {
  122. #ifdef __IO_DEBUG
  123. printk("virt_to_phys: 0x%08lx -> 0x%08lxn", 
  124. (unsigned long) address,
  125. __pa((unsigned long)address));
  126. #endif
  127. return __pa((unsigned long)address);
  128. }
  129. static inline void * phys_to_virt(unsigned long address)
  130. {
  131. #ifdef __IO_DEBUG
  132. printk("phys_to_virt: 0x%08lx -> 0x%08lxn", address, __va(address));
  133. #endif
  134. return (void *) __va(address);
  135. }
  136.  
  137. /*
  138.  * Change "struct page" to physical address.
  139.  */
  140. #define page_to_phys(page) ((page - mem_map) << PAGE_SHIFT)
  141. #endif /* __KERNEL__ */
  142. static inline void iosync(void)
  143. {
  144.         __asm__ __volatile__ ("sync" : : : "memory");
  145. }
  146. /* Enforce in-order execution of data I/O. 
  147.  * No distinction between read/write on PPC; use eieio for all three.
  148.  */
  149. #define iobarrier_rw() eieio()
  150. #define iobarrier_r()  eieio()
  151. #define iobarrier_w()  eieio()
  152. /*
  153.  * 8, 16 and 32 bit, big and little endian I/O operations, with barrier.
  154.  * Until we can validate all required device drivers are weakc safe, an
  155.  * excess of syncs before the MMIO operations will make things work.  On 
  156.  * sstar, sync time is << than mmio time, so this should not be a big impact.
  157.  */
  158. static inline int in_8(volatile unsigned char *addr)
  159. {
  160. int ret;
  161. __asm__ __volatile__("sync; lbz%U1%X1 %0,%1; sync" : "=r" (ret) : "m" (*addr));
  162. return ret;
  163. }
  164. static inline void out_8(volatile unsigned char *addr, int val)
  165. {
  166. __asm__ __volatile__("sync; stb%U0%X0 %1,%0; sync" : "=m" (*addr) : "r" (val));
  167. }
  168. static inline int in_le16(volatile unsigned short *addr)
  169. {
  170. int ret;
  171. __asm__ __volatile__("sync; lhbrx %0,0,%1; sync" : "=r" (ret) :
  172.       "r" (addr), "m" (*addr));
  173. return ret;
  174. }
  175. static inline int in_be16(volatile unsigned short *addr)
  176. {
  177. int ret;
  178. __asm__ __volatile__("sync; lhz%U1%X1 %0,%1; sync" : "=r" (ret) : "m" (*addr));
  179. return ret;
  180. }
  181. static inline void out_le16(volatile unsigned short *addr, int val)
  182. {
  183. __asm__ __volatile__("sync; sthbrx %1,0,%2; sync" : "=m" (*addr) :
  184.       "r" (val), "r" (addr));
  185. }
  186. static inline void out_be16(volatile unsigned short *addr, int val)
  187. {
  188. __asm__ __volatile__("sync; sth%U0%X0 %1,%0; sync" : "=m" (*addr) : "r" (val));
  189. }
  190. static inline unsigned in_le32(volatile unsigned *addr)
  191. {
  192. unsigned ret;
  193. __asm__ __volatile__("sync; lwbrx %0,0,%1; sync" : "=r" (ret) :
  194.      "r" (addr), "m" (*addr));
  195. return ret;
  196. }
  197. static inline unsigned in_be32(volatile unsigned *addr)
  198. {
  199. unsigned ret;
  200. __asm__ __volatile__("sync; lwz%U1%X1 %0,%1; sync" : "=r" (ret) : "m" (*addr));
  201. return ret;
  202. }
  203. static inline void out_le32(volatile unsigned *addr, int val)
  204. {
  205. __asm__ __volatile__("sync; stwbrx %1,0,%2; sync" : "=m" (*addr) :
  206.      "r" (val), "r" (addr));
  207. }
  208. static inline void out_be32(volatile unsigned *addr, int val)
  209. {
  210. __asm__ __volatile__("sync; stw%U0%X0 %1,%0; sync" : "=m" (*addr) : "r" (val));
  211. }
  212. #ifndef CONFIG_PPC_ISERIES 
  213. #include <asm/eeh.h>
  214. static inline u8 _inb(unsigned long port) {
  215. if (IS_MAPPED_VADDR(port))
  216. return readb((void *)port);
  217. else if (_IO_BASE)
  218. return in_8((u8 *)((port)+_IO_BASE));
  219. else
  220. return 0xff;
  221. }
  222. static inline void _outb(u8 val, unsigned long port) {
  223. if (IS_MAPPED_VADDR(port))
  224. return writeb(val, (void *)port);
  225. else if (_IO_BASE)
  226. out_8((u8 *)((port)+_IO_BASE), val);
  227. }
  228. static inline u16 _inw(unsigned long port) {
  229. if (IS_MAPPED_VADDR(port))
  230. return readw((void *)port);
  231. else if (_IO_BASE)
  232. return in_le16((u16 *)((port)+_IO_BASE));
  233. else
  234. return 0xffff;
  235. }
  236. static inline void _outw(u16 val, unsigned long port) {
  237. if (IS_MAPPED_VADDR(port))
  238. return writew(val, (void *)port);
  239. else if (_IO_BASE)
  240. out_le16((u16 *)((port)+_IO_BASE), val);
  241. }
  242. static inline u32 _inl(unsigned long port) {
  243. if (IS_MAPPED_VADDR(port))
  244. return readl((void *)port);
  245. else if (_IO_BASE)
  246. return in_le32((u32 *)((port)+_IO_BASE));
  247. else
  248. return 0xffffffff;
  249. }
  250. static inline void _outl(u32 val, unsigned long port) {
  251. if (IS_MAPPED_VADDR(port))
  252. return writel(val, (void *)port);
  253. else if (_IO_BASE)
  254. out_le32((u32 *)((port)+_IO_BASE), val);
  255. }
  256. #endif
  257. #ifdef __KERNEL__
  258. static inline int check_signature(unsigned long io_addr,
  259. const unsigned char *signature, int length)
  260. {
  261. int retval = 0;
  262. #ifndef CONFIG_PPC_ISERIES 
  263. do {
  264. if (readb(io_addr) != *signature)
  265. goto out;
  266. io_addr++;
  267. signature++;
  268. length--;
  269. } while (length);
  270. retval = 1;
  271. out:
  272. #endif
  273. return retval;
  274. }
  275. /* Nothing to do */
  276. #define dma_cache_inv(_start,_size) do { } while (0)
  277. #define dma_cache_wback(_start,_size) do { } while (0)
  278. #define dma_cache_wback_inv(_start,_size) do { } while (0)
  279. #endif /* __KERNEL__ */
  280. #endif /* _PPC64_IO_H */