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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef __ALPHA_IO_H
  2. #define __ALPHA_IO_H
  3. /* We don't use IO slowdowns on the Alpha, but.. */
  4. #define __SLOW_DOWN_IO do { } while (0)
  5. #define SLOW_DOWN_IO do { } while (0)
  6. /*
  7.  * Virtual -> physical identity mapping starts at this offset
  8.  */
  9. #ifdef USE_48_BIT_KSEG
  10. #define IDENT_ADDR     0xffff800000000000
  11. #else
  12. #define IDENT_ADDR     0xfffffc0000000000
  13. #endif
  14. #ifdef __KERNEL__
  15. #include <linux/config.h>
  16. #include <linux/kernel.h>
  17. #include <asm/system.h>
  18. #include <asm/machvec.h>
  19. /*
  20.  * We try to avoid hae updates (thus the cache), but when we
  21.  * do need to update the hae, we need to do it atomically, so
  22.  * that any interrupts wouldn't get confused with the hae
  23.  * register not being up-to-date with respect to the hardware
  24.  * value.
  25.  */
  26. static inline void __set_hae(unsigned long new_hae)
  27. {
  28. unsigned long flags;
  29. __save_and_cli(flags);
  30. alpha_mv.hae_cache = new_hae;
  31. *alpha_mv.hae_register = new_hae;
  32. mb();
  33. /* Re-read to make sure it was written.  */
  34. new_hae = *alpha_mv.hae_register;
  35. __restore_flags(flags);
  36. }
  37. static inline void set_hae(unsigned long new_hae)
  38. {
  39. if (new_hae != alpha_mv.hae_cache)
  40. __set_hae(new_hae);
  41. }
  42. /*
  43.  * Change virtual addresses to physical addresses and vv.
  44.  */
  45. static inline unsigned long virt_to_phys(void *address)
  46. {
  47. return (unsigned long)address - IDENT_ADDR;
  48. }
  49. static inline void * phys_to_virt(unsigned long address)
  50. {
  51. return (void *) (address + IDENT_ADDR);
  52. }
  53. #define page_to_phys(page) PAGE_TO_PA(page)
  54. /*
  55.  * Change addresses as seen by the kernel (virtual) to addresses as
  56.  * seen by a device (bus), and vice versa.
  57.  *
  58.  * Note that this only works for a limited range of kernel addresses,
  59.  * and very well may not span all memory.  Consider this interface 
  60.  * deprecated in favour of the mapping functions in <asm/pci.h>.
  61.  */
  62. extern unsigned long __direct_map_base;
  63. extern unsigned long __direct_map_size;
  64. static inline unsigned long virt_to_bus(void *address)
  65. {
  66. unsigned long phys = virt_to_phys(address);
  67. unsigned long bus = phys + __direct_map_base;
  68. return phys <= __direct_map_size ? bus : 0;
  69. }
  70. static inline void *bus_to_virt(unsigned long address)
  71. {
  72. void *virt;
  73. /* This check is a sanity check but also ensures that bus address 0
  74.    maps to virtual address 0 which is useful to detect null pointers
  75.    (the NCR driver is much simpler if NULL pointers are preserved).  */
  76. address -= __direct_map_base;
  77. virt = phys_to_virt(address);
  78. return (long)address <= 0 ? NULL : virt;
  79. }
  80. #else /* !__KERNEL__ */
  81. /*
  82.  * Define actual functions in private name-space so it's easier to
  83.  * accommodate things like XFree or svgalib that like to define their
  84.  * own versions of inb etc.
  85.  */
  86. extern void __sethae (unsigned long addr); /* syscall */
  87. extern void _sethae (unsigned long addr); /* cached version */
  88. #endif /* !__KERNEL__ */
  89. /*
  90.  * There are different chipsets to interface the Alpha CPUs to the world.
  91.  */
  92. #ifdef __KERNEL__
  93. #ifdef CONFIG_ALPHA_GENERIC
  94. /* In a generic kernel, we always go through the machine vector.  */
  95. # define __inb(p) alpha_mv.mv_inb((unsigned long)(p))
  96. # define __inw(p) alpha_mv.mv_inw((unsigned long)(p))
  97. # define __inl(p) alpha_mv.mv_inl((unsigned long)(p))
  98. # define __outb(x,p) alpha_mv.mv_outb((x),(unsigned long)(p))
  99. # define __outw(x,p) alpha_mv.mv_outw((x),(unsigned long)(p))
  100. # define __outl(x,p) alpha_mv.mv_outl((x),(unsigned long)(p))
  101. # define __readb(a) alpha_mv.mv_readb((unsigned long)(a))
  102. # define __readw(a) alpha_mv.mv_readw((unsigned long)(a))
  103. # define __readl(a) alpha_mv.mv_readl((unsigned long)(a))
  104. # define __readq(a) alpha_mv.mv_readq((unsigned long)(a))
  105. # define __writeb(v,a) alpha_mv.mv_writeb((v),(unsigned long)(a))
  106. # define __writew(v,a) alpha_mv.mv_writew((v),(unsigned long)(a))
  107. # define __writel(v,a) alpha_mv.mv_writel((v),(unsigned long)(a))
  108. # define __writeq(v,a) alpha_mv.mv_writeq((v),(unsigned long)(a))
  109. # define __ioremap(a,s) alpha_mv.mv_ioremap((unsigned long)(a),(s))
  110. # define __iounmap(a)   alpha_mv.mv_iounmap((unsigned long)(a))
  111. # define __is_ioaddr(a) alpha_mv.mv_is_ioaddr((unsigned long)(a))
  112. # define inb __inb
  113. # define inw __inw
  114. # define inl __inl
  115. # define outb __outb
  116. # define outw __outw
  117. # define outl __outl
  118. # define __raw_readb __readb
  119. # define __raw_readw __readw
  120. # define __raw_readl __readl
  121. # define __raw_readq __readq
  122. # define __raw_writeb __writeb
  123. # define __raw_writew __writew
  124. # define __raw_writel __writel
  125. # define __raw_writeq __writeq
  126. #else
  127. /* Control how and what gets defined within the core logic headers.  */
  128. #define __WANT_IO_DEF
  129. #if defined(CONFIG_ALPHA_APECS)
  130. # include <asm/core_apecs.h>
  131. #elif defined(CONFIG_ALPHA_CIA)
  132. # include <asm/core_cia.h>
  133. #elif defined(CONFIG_ALPHA_IRONGATE)
  134. # include <asm/core_irongate.h>
  135. #elif defined(CONFIG_ALPHA_JENSEN)
  136. # include <asm/jensen.h>
  137. #elif defined(CONFIG_ALPHA_LCA)
  138. # include <asm/core_lca.h>
  139. #elif defined(CONFIG_ALPHA_MCPCIA)
  140. # include <asm/core_mcpcia.h>
  141. #elif defined(CONFIG_ALPHA_POLARIS)
  142. # include <asm/core_polaris.h>
  143. #elif defined(CONFIG_ALPHA_T2)
  144. # include <asm/core_t2.h>
  145. #elif defined(CONFIG_ALPHA_TSUNAMI)
  146. # include <asm/core_tsunami.h>
  147. #elif defined(CONFIG_ALPHA_TITAN)
  148. # include <asm/core_titan.h>
  149. #elif defined(CONFIG_ALPHA_WILDFIRE)
  150. # include <asm/core_wildfire.h>
  151. #else
  152. #error "What system is this?"
  153. #endif
  154. #undef __WANT_IO_DEF
  155. #endif /* GENERIC */
  156. #endif /* __KERNEL__ */
  157. /*
  158.  * The convention used for inb/outb etc. is that names starting with
  159.  * two underscores are the inline versions, names starting with a
  160.  * single underscore are proper functions, and names starting with a
  161.  * letter are macros that map in some way to inline or proper function
  162.  * versions.  Not all that pretty, but before you change it, be sure
  163.  * to convince yourself that it won't break anything (in particular
  164.  * module support).
  165.  */
  166. extern u8 _inb (unsigned long port);
  167. extern u16 _inw (unsigned long port);
  168. extern u32 _inl (unsigned long port);
  169. extern void _outb (u8 b,unsigned long port);
  170. extern void _outw (u16 w,unsigned long port);
  171. extern void _outl (u32 l,unsigned long port);
  172. extern u8 _readb(unsigned long addr);
  173. extern u16 _readw(unsigned long addr);
  174. extern u32 _readl(unsigned long addr);
  175. extern u64 _readq(unsigned long addr);
  176. extern void _writeb(u8 b, unsigned long addr);
  177. extern void _writew(u16 b, unsigned long addr);
  178. extern void _writel(u32 b, unsigned long addr);
  179. extern void _writeq(u64 b, unsigned long addr);
  180. #ifdef __KERNEL__
  181. /*
  182.  * The platform header files may define some of these macros to use
  183.  * the inlined versions where appropriate.  These macros may also be
  184.  * redefined by userlevel programs.
  185.  */
  186. #ifndef inb
  187. # define inb(p) _inb(p)
  188. #endif
  189. #ifndef inw
  190. # define inw(p) _inw(p)
  191. #endif
  192. #ifndef inl
  193. # define inl(p) _inl(p)
  194. #endif
  195. #ifndef outb
  196. # define outb(b,p) _outb((b),(p))
  197. #endif
  198. #ifndef outw
  199. # define outw(w,p) _outw((w),(p))
  200. #endif
  201. #ifndef outl
  202. # define outl(l,p) _outl((l),(p))
  203. #endif
  204. #ifndef inb_p
  205. # define inb_p inb
  206. #endif
  207. #ifndef inw_p
  208. # define inw_p inw
  209. #endif
  210. #ifndef inl_p
  211. # define inl_p inl
  212. #endif
  213. #ifndef outb_p
  214. # define outb_p outb
  215. #endif
  216. #ifndef outw_p
  217. # define outw_p outw
  218. #endif
  219. #ifndef outl_p
  220. # define outl_p outl
  221. #endif
  222. #define IO_SPACE_LIMIT 0xffff
  223. #else 
  224. /* Userspace declarations.  Kill in 2.5. */
  225. extern unsigned int inb(unsigned long port);
  226. extern unsigned int inw(unsigned long port);
  227. extern unsigned int inl(unsigned long port);
  228. extern void outb(unsigned char b,unsigned long port);
  229. extern void outw(unsigned short w,unsigned long port);
  230. extern void outl(unsigned int l,unsigned long port);
  231. extern unsigned long readb(unsigned long addr);
  232. extern unsigned long readw(unsigned long addr);
  233. extern unsigned long readl(unsigned long addr);
  234. extern void writeb(unsigned char b, unsigned long addr);
  235. extern void writew(unsigned short b, unsigned long addr);
  236. extern void writel(unsigned int b, unsigned long addr);
  237. #endif /* __KERNEL__ */
  238. #ifdef __KERNEL__
  239. /*
  240.  * On Alpha, we have the whole of I/O space mapped at all times, but
  241.  * at odd and sometimes discontinuous addresses.  Note that the 
  242.  * discontinuities are all across busses, so we need not care for that
  243.  * for any one device.
  244.  *
  245.  * The DRM drivers need to be able to map contiguously a (potentially)
  246.  * discontiguous set of I/O pages. This set of pages is scatter-gather
  247.  * mapped contiguously from the perspective of the bus, but we can't
  248.  * directly access DMA addresses from the CPU, these addresses need to
  249.  * have a real ioremap. Therefore, iounmap and the size argument to
  250.  * ioremap are needed to give the platforms the ability to fully implement
  251.  * ioremap.
  252.  *
  253.  * Map the I/O space address into the kernel's virtual address space.
  254.  */
  255. static inline void * ioremap(unsigned long offset, unsigned long size)
  256. {
  257. return (void *) __ioremap(offset, size);
  258. static inline void iounmap(void *addr)
  259. {
  260. __iounmap(addr);
  261. }
  262. static inline void * ioremap_nocache(unsigned long offset, unsigned long size)
  263. {
  264. return ioremap(offset, size);
  265. /* Indirect back to the macros provided.  */
  266. extern u8 ___raw_readb(unsigned long addr);
  267. extern u16 ___raw_readw(unsigned long addr);
  268. extern u32 ___raw_readl(unsigned long addr);
  269. extern u64 ___raw_readq(unsigned long addr);
  270. extern void ___raw_writeb(u8 b, unsigned long addr);
  271. extern void ___raw_writew(u16 b, unsigned long addr);
  272. extern void ___raw_writel(u32 b, unsigned long addr);
  273. extern void ___raw_writeq(u64 b, unsigned long addr);
  274. #ifdef __raw_readb
  275. # define readb(a) ({ u8 r_ = __raw_readb(a); mb(); r_; })
  276. #endif
  277. #ifdef __raw_readw
  278. # define readw(a) ({ u16 r_ = __raw_readw(a); mb(); r_; })
  279. #endif
  280. #ifdef __raw_readl
  281. # define readl(a) ({ u32 r_ = __raw_readl(a); mb(); r_; })
  282. #endif
  283. #ifdef __raw_readq
  284. # define readq(a) ({ u64 r_ = __raw_readq(a); mb(); r_; })
  285. #endif
  286. #ifdef __raw_writeb
  287. # define writeb(v,a) ({ __raw_writeb((v),(a)); mb(); })
  288. #endif
  289. #ifdef __raw_writew
  290. # define writew(v,a) ({ __raw_writew((v),(a)); mb(); })
  291. #endif
  292. #ifdef __raw_writel
  293. # define writel(v,a) ({ __raw_writel((v),(a)); mb(); })
  294. #endif
  295. #ifdef __raw_writeq
  296. # define writeq(v,a) ({ __raw_writeq((v),(a)); mb(); })
  297. #endif
  298. #ifndef __raw_readb
  299. # define __raw_readb(a) ___raw_readb((unsigned long)(a))
  300. #endif
  301. #ifndef __raw_readw
  302. # define __raw_readw(a) ___raw_readw((unsigned long)(a))
  303. #endif
  304. #ifndef __raw_readl
  305. # define __raw_readl(a) ___raw_readl((unsigned long)(a))
  306. #endif
  307. #ifndef __raw_readq
  308. # define __raw_readq(a) ___raw_readq((unsigned long)(a))
  309. #endif
  310. #ifndef __raw_writeb
  311. # define __raw_writeb(v,a)  ___raw_writeb((v),(unsigned long)(a))
  312. #endif
  313. #ifndef __raw_writew
  314. # define __raw_writew(v,a)  ___raw_writew((v),(unsigned long)(a))
  315. #endif
  316. #ifndef __raw_writel
  317. # define __raw_writel(v,a)  ___raw_writel((v),(unsigned long)(a))
  318. #endif
  319. #ifndef __raw_writeq
  320. # define __raw_writeq(v,a)  ___raw_writeq((v),(unsigned long)(a))
  321. #endif
  322. #ifndef readb
  323. # define readb(a) _readb((unsigned long)(a))
  324. #endif
  325. #ifndef readw
  326. # define readw(a) _readw((unsigned long)(a))
  327. #endif
  328. #ifndef readl
  329. # define readl(a) _readl((unsigned long)(a))
  330. #endif
  331. #ifndef readq
  332. # define readq(a) _readq((unsigned long)(a))
  333. #endif
  334. #ifndef writeb
  335. # define writeb(v,a) _writeb((v),(unsigned long)(a))
  336. #endif
  337. #ifndef writew
  338. # define writew(v,a) _writew((v),(unsigned long)(a))
  339. #endif
  340. #ifndef writel
  341. # define writel(v,a) _writel((v),(unsigned long)(a))
  342. #endif
  343. #ifndef writeq
  344. # define writeq(v,a) _writeq((v),(unsigned long)(a))
  345. #endif
  346. /*
  347.  * String version of IO memory access ops:
  348.  */
  349. extern void _memcpy_fromio(void *, unsigned long, long);
  350. extern void _memcpy_toio(unsigned long, const void *, long);
  351. extern void _memset_c_io(unsigned long, unsigned long, long);
  352. #define memcpy_fromio(to,from,len) 
  353.   _memcpy_fromio((to),(unsigned long)(from),(len))
  354. #define memcpy_toio(to,from,len) 
  355.   _memcpy_toio((unsigned long)(to),(from),(len))
  356. #define memset_io(addr,c,len) 
  357.   _memset_c_io((unsigned long)(addr),0x0101010101010101UL*(u8)(c),(len))
  358. #define __HAVE_ARCH_MEMSETW_IO
  359. #define memsetw_io(addr,c,len) 
  360.   _memset_c_io((unsigned long)(addr),0x0001000100010001UL*(u16)(c),(len))
  361. /*
  362.  * String versions of in/out ops:
  363.  */
  364. extern void insb (unsigned long port, void *dst, unsigned long count);
  365. extern void insw (unsigned long port, void *dst, unsigned long count);
  366. extern void insl (unsigned long port, void *dst, unsigned long count);
  367. extern void outsb (unsigned long port, const void *src, unsigned long count);
  368. extern void outsw (unsigned long port, const void *src, unsigned long count);
  369. extern void outsl (unsigned long port, const void *src, unsigned long count);
  370. /*
  371.  * XXX - We don't have csum_partial_copy_fromio() yet, so we cheat here and 
  372.  * just copy it. The net code will then do the checksum later. Presently 
  373.  * only used by some shared memory 8390 Ethernet cards anyway.
  374.  */
  375. #define eth_io_copy_and_sum(skb,src,len,unused) 
  376.   memcpy_fromio((skb)->data,(src),(len))
  377. static inline int
  378. check_signature(unsigned long io_addr, const unsigned char *signature,
  379. int length)
  380. {
  381. int retval = 0;
  382. do {
  383. if (readb(io_addr) != *signature)
  384. goto out;
  385. io_addr++;
  386. signature++;
  387. length--;
  388. } while (length);
  389. retval = 1;
  390. out:
  391. return retval;
  392. }
  393. /*
  394.  * ISA space is mapped to some machine-specific location on Alpha.
  395.  * Call into the existing hooks to get the address translated.
  396.  */
  397. #define isa_readb(a) readb(__ioremap((a),1))
  398. #define isa_readw(a) readw(__ioremap((a),2))
  399. #define isa_readl(a) readl(__ioremap((a),4))
  400. #define isa_writeb(b,a) writeb((b),__ioremap((a),1))
  401. #define isa_writew(w,a) writew((w),__ioremap((a),2))
  402. #define isa_writel(l,a) writel((l),__ioremap((a),4))
  403. #define isa_memset_io(a,b,c) memset_io(__ioremap((a),(c)),(b),(c))
  404. #define isa_memcpy_fromio(a,b,c) memcpy_fromio((a),__ioremap((b),(c)),(c))
  405. #define isa_memcpy_toio(a,b,c) memcpy_toio(__ioremap((a),(c)),(b),(c))
  406. static inline int
  407. isa_check_signature(unsigned long io_addr, const unsigned char *signature,
  408. int length)
  409. {
  410. int retval = 0;
  411. do {
  412. if (isa_readb(io_addr) != *signature)
  413. goto out;
  414. io_addr++;
  415. signature++;
  416. length--;
  417. } while (length);
  418. retval = 1;
  419. out:
  420. return retval;
  421. }
  422. /*
  423.  * The Alpha Jensen hardware for some rather strange reason puts
  424.  * the RTC clock at 0x170 instead of 0x70. Probably due to some
  425.  * misguided idea about using 0x70 for NMI stuff.
  426.  *
  427.  * These defines will override the defaults when doing RTC queries
  428.  */
  429. #ifdef CONFIG_ALPHA_GENERIC
  430. # define RTC_PORT(x) ((x) + alpha_mv.rtc_port)
  431. #else
  432. # ifdef CONFIG_ALPHA_JENSEN
  433. #  define RTC_PORT(x) (0x170+(x))
  434. # else
  435. #  define RTC_PORT(x) (0x70 + (x))
  436. # endif
  437. #endif
  438. #define RTC_ALWAYS_BCD 0
  439. /* Nothing to do */
  440. #define dma_cache_inv(_start,_size) do { } while (0)
  441. #define dma_cache_wback(_start,_size) do { } while (0)
  442. #define dma_cache_wback_inv(_start,_size) do { } while (0)
  443. #endif /* __KERNEL__ */
  444. #endif /* __ALPHA_IO_H */