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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * This file contains the MIPS architecture specific IDE code.
  7.  *
  8.  * Copyright (C) 1994-1996  Linus Torvalds & authors
  9.  */
  10. /*
  11.  *  This file contains the MIPS architecture specific IDE code.
  12.  */
  13. #ifndef __ASM_IDE_H
  14. #define __ASM_IDE_H
  15. #ifdef __KERNEL__
  16. #include <linux/config.h>
  17. #include <asm/io.h>
  18. #ifndef MAX_HWIFS
  19. # ifdef CONFIG_BLK_DEV_IDEPCI
  20. #define MAX_HWIFS 10
  21. # else
  22. #define MAX_HWIFS 6
  23. # endif
  24. #endif
  25. #define ide__sti() __sti()
  26. struct ide_ops {
  27. int (*ide_default_irq)(ide_ioreg_t base);
  28. ide_ioreg_t (*ide_default_io_base)(int index);
  29. void (*ide_init_hwif_ports)(hw_regs_t *hw, ide_ioreg_t data_port,
  30.                             ide_ioreg_t ctrl_port, int *irq);
  31. int (*ide_request_irq)(unsigned int irq, void (*handler)(int, void *,
  32.                        struct pt_regs *), unsigned long flags,
  33.                        const char *device, void *dev_id);
  34. void (*ide_free_irq)(unsigned int irq, void *dev_id);
  35. int (*ide_check_region) (ide_ioreg_t from, unsigned int extent);
  36. void (*ide_request_region)(ide_ioreg_t from, unsigned int extent,
  37.                         const char *name);
  38. void (*ide_release_region)(ide_ioreg_t from, unsigned int extent);
  39. };
  40. extern struct ide_ops *ide_ops;
  41. static __inline__ int ide_default_irq(ide_ioreg_t base)
  42. {
  43. return ide_ops->ide_default_irq(base);
  44. }
  45. static __inline__ ide_ioreg_t ide_default_io_base(int index)
  46. {
  47. return ide_ops->ide_default_io_base(index);
  48. }
  49. static inline void ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port,
  50.                                        ide_ioreg_t ctrl_port, int *irq)
  51. {
  52. ide_ops->ide_init_hwif_ports(hw, data_port, ctrl_port, irq);
  53. }
  54. static __inline__ void ide_init_default_hwifs(void)
  55. {
  56. #ifndef CONFIG_BLK_DEV_IDEPCI
  57. hw_regs_t hw;
  58. int index;
  59. for(index = 0; index < MAX_HWIFS; index++) {
  60. ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
  61. hw.irq = ide_default_irq(ide_default_io_base(index));
  62. ide_register_hw(&hw, NULL);
  63. }
  64. #endif /* CONFIG_BLK_DEV_IDEPCI */
  65. }
  66. typedef union {
  67. unsigned all : 8; /* all of the bits together */
  68. struct {
  69. #ifdef __MIPSEB__
  70. unsigned bit7           : 1;    /* always 1 */
  71. unsigned lba            : 1;    /* using LBA instead of CHS */
  72. unsigned bit5           : 1;    /* always 1 */
  73. unsigned unit           : 1;    /* drive select number, 0 or 1 */
  74. unsigned head           : 4;    /* always zeros here */
  75. #else
  76. unsigned head : 4; /* always zeros here */
  77. unsigned unit : 1; /* drive select number, 0 or 1 */
  78. unsigned bit5 : 1; /* always 1 */
  79. unsigned lba : 1; /* using LBA instead of CHS */
  80. unsigned bit7 : 1; /* always 1 */
  81. #endif
  82. } b;
  83. } select_t;
  84. typedef union {
  85. unsigned all : 8; /* all of the bits together */
  86. struct {
  87. #ifdef __MIPSEB__
  88. unsigned HOB : 1; /* 48-bit address ordering */
  89. unsigned reserved456 : 3;
  90. unsigned bit3 : 1; /* ATA-2 thingy */
  91. unsigned SRST : 1; /* host soft reset bit */
  92. unsigned nIEN : 1; /* device INTRQ to host */
  93. unsigned bit0 : 1;
  94. #else
  95. unsigned bit0 : 1;
  96. unsigned nIEN : 1; /* device INTRQ to host */
  97. unsigned SRST : 1; /* host soft reset bit */
  98. unsigned bit3 : 1; /* ATA-2 thingy */
  99. unsigned reserved456 : 3;
  100. unsigned HOB : 1; /* 48-bit address ordering */
  101. #endif
  102. } b;
  103. } control_t;
  104. static __inline__ int ide_request_irq(unsigned int irq, void (*handler)(int,void *, struct pt_regs *),
  105. unsigned long flags, const char *device, void *dev_id)
  106. {
  107. return ide_ops->ide_request_irq(irq, handler, flags, device, dev_id);
  108. }
  109. static __inline__ void ide_free_irq(unsigned int irq, void *dev_id)
  110. {
  111. ide_ops->ide_free_irq(irq, dev_id);
  112. }
  113. static __inline__ int ide_check_region (ide_ioreg_t from, unsigned int extent)
  114. {
  115. return ide_ops->ide_check_region(from, extent);
  116. }
  117. static __inline__ void ide_request_region(ide_ioreg_t from,
  118.                                           unsigned int extent, const char *name)
  119. {
  120. ide_ops->ide_request_region(from, extent, name);
  121. }
  122. static __inline__ void ide_release_region(ide_ioreg_t from,
  123.                                           unsigned int extent)
  124. {
  125. ide_ops->ide_release_region(from, extent);
  126. }
  127. #if defined(CONFIG_SWAP_IO_SPACE) && defined(__MIPSEB__)
  128. /* get rid of defs from io.h - ide has its private and conflicting versions */
  129. #ifdef insw
  130. #undef insw
  131. #endif
  132. #ifdef outsw
  133. #undef outsw
  134. #endif
  135. #ifdef insl
  136. #undef insl
  137. #endif
  138. #ifdef outsl
  139. #undef outsl
  140. #endif
  141. #define insw(port, addr, count) ide_insw(port, addr, count)
  142. #define insl(port, addr, count) ide_insl(port, addr, count)
  143. #define outsw(port, addr, count) ide_outsw(port, addr, count)
  144. #define outsl(port, addr, count) ide_outsl(port, addr, count)
  145. static inline void ide_insw(unsigned long port, void *addr, unsigned int count)
  146. {
  147.        while (count--) {
  148.                *(u16 *)addr = *(volatile u16 *)(mips_io_port_base + port);
  149.                addr += 2;
  150.        }
  151. }
  152. static inline void ide_outsw(unsigned long port, void *addr, unsigned int count)
  153. {
  154.        while (count--) {
  155.                *(volatile u16 *)(mips_io_port_base + (port)) = *(u16 *)addr;
  156.                addr += 2;
  157.        }
  158. }
  159. static inline void ide_insl(unsigned long port, void *addr, unsigned int count)
  160. {
  161.        while (count--) {
  162.                *(u32 *)addr = *(volatile u32 *)(mips_io_port_base + port);
  163.                addr += 4;
  164.        }
  165. }
  166. static inline void ide_outsl(unsigned long port, void *addr, unsigned int count)
  167. {
  168.        while (count--) {
  169.                *(volatile u32 *)(mips_io_port_base + (port)) = *(u32 *)addr;
  170.                addr += 4;
  171.        }
  172. }
  173. #define T_CHAR          (0x0000)        /* char:  don't touch  */
  174. #define T_SHORT         (0x4000)        /* short: 12 -> 21     */
  175. #define T_INT           (0x8000)        /* int:   1234 -> 4321 */
  176. #define T_TEXT          (0xc000)        /* text:  12 -> 21     */
  177. #define T_MASK_TYPE     (0xc000)
  178. #define T_MASK_COUNT    (0x3fff)
  179. #define D_CHAR(cnt)     (T_CHAR  | (cnt))
  180. #define D_SHORT(cnt)    (T_SHORT | (cnt))
  181. #define D_INT(cnt)      (T_INT   | (cnt))
  182. #define D_TEXT(cnt)     (T_TEXT  | (cnt))
  183. static u_short driveid_types[] = {
  184. D_SHORT(10), /* config - vendor2 */
  185. D_TEXT(20), /* serial_no */
  186. D_SHORT(3), /* buf_type - ecc_bytes */
  187. D_TEXT(48), /* fw_rev - model */
  188. D_CHAR(2), /* max_multsect - vendor3 */
  189. D_SHORT(1), /* dword_io */
  190. D_CHAR(2), /* vendor4 - capability */
  191. D_SHORT(1), /* reserved50 */
  192. D_CHAR(4), /* vendor5 - tDMA */
  193. D_SHORT(4), /* field_valid - cur_sectors */
  194. D_INT(1), /* cur_capacity */
  195. D_CHAR(2), /* multsect - multsect_valid */
  196. D_INT(1), /* lba_capacity */
  197. D_SHORT(194) /* dma_1word - reservedyy */
  198. };
  199. #define num_driveid_types       (sizeof(driveid_types)/sizeof(*driveid_types))
  200. static __inline__ void ide_fix_driveid(struct hd_driveid *id)
  201. {
  202. u_char *p = (u_char *)id;
  203. int i, j, cnt;
  204. u_char t;
  205. for (i = 0; i < num_driveid_types; i++) {
  206. cnt = driveid_types[i] & T_MASK_COUNT;
  207. switch (driveid_types[i] & T_MASK_TYPE) {
  208. case T_CHAR:
  209. p += cnt;
  210. break;
  211. case T_SHORT:
  212. for (j = 0; j < cnt; j++) {
  213. t = p[0];
  214. p[0] = p[1];
  215. p[1] = t;
  216. p += 2;
  217. }
  218. break;
  219. case T_INT:
  220. for (j = 0; j < cnt; j++) {
  221. t = p[0];
  222. p[0] = p[3];
  223. p[3] = t;
  224. t = p[1];
  225. p[1] = p[2];
  226. p[2] = t;
  227. p += 4;
  228. }
  229. break;
  230. case T_TEXT:
  231. for (j = 0; j < cnt; j += 2) {
  232. t = p[0];
  233. p[0] = p[1];
  234. p[1] = t;
  235. p += 2;
  236. }
  237. break;
  238. };
  239. }
  240. }
  241. #else /* defined(CONFIG_SWAP_IO_SPACE) && defined(__MIPSEB__)  */
  242. #define ide_fix_driveid(id) do {} while (0)
  243. #endif
  244. /*
  245.  * The following are not needed for the non-m68k ports
  246.  */
  247. #define ide_ack_intr(hwif) (1)
  248. #define ide_release_lock(lock) do {} while (0)
  249. #define ide_get_lock(lock, hdlr, data) do {} while (0)
  250. #endif /* __KERNEL__ */
  251. #endif /* __ASM_IDE_H */