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

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