io.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:14k
源码类别:

嵌入式Linux

开发平台:

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