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

嵌入式Linux

开发平台:

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. static __inline__ int ide_request_irq(unsigned int irq, void (*handler)(int,void *, struct pt_regs *),
  82. unsigned long flags, const char *device, void *dev_id)
  83. {
  84. return ide_ops->ide_request_irq(irq, handler, flags, device, dev_id);
  85. }
  86. static __inline__ void ide_free_irq(unsigned int irq, void *dev_id)
  87. {
  88. ide_ops->ide_free_irq(irq, dev_id);
  89. }
  90. static __inline__ int ide_check_region (ide_ioreg_t from, unsigned int extent)
  91. {
  92. return ide_ops->ide_check_region(from, extent);
  93. }
  94. static __inline__ void ide_request_region(ide_ioreg_t from,
  95.                                           unsigned int extent, const char *name)
  96. {
  97. ide_ops->ide_request_region(from, extent, name);
  98. }
  99. static __inline__ void ide_release_region(ide_ioreg_t from,
  100.                                           unsigned int extent)
  101. {
  102. ide_ops->ide_release_region(from, extent);
  103. }
  104. #undef  SUPPORT_VLB_SYNC
  105. #define SUPPORT_VLB_SYNC 0
  106. #if defined(__MIPSEB__)
  107. #define T_CHAR          (0x0000)        /* char:  don't touch  */
  108. #define T_SHORT         (0x4000)        /* short: 12 -> 21     */
  109. #define T_INT           (0x8000)        /* int:   1234 -> 4321 */
  110. #define T_TEXT          (0xc000)        /* text:  12 -> 21     */
  111. #define T_MASK_TYPE     (0xc000)
  112. #define T_MASK_COUNT    (0x3fff)
  113. #define D_CHAR(cnt)     (T_CHAR  | (cnt))
  114. #define D_SHORT(cnt)    (T_SHORT | (cnt))
  115. #define D_INT(cnt)      (T_INT   | (cnt))
  116. #define D_TEXT(cnt)     (T_TEXT  | (cnt))
  117. static u_short driveid_types[] = {
  118. D_SHORT(10), /* config - vendor2 */
  119. D_TEXT(20), /* serial_no */
  120. D_SHORT(3), /* buf_type - ecc_bytes */
  121. D_TEXT(48), /* fw_rev - model */
  122. D_CHAR(2), /* max_multsect - vendor3 */
  123. D_SHORT(1), /* dword_io */
  124. D_CHAR(2), /* vendor4 - capability */
  125. D_SHORT(1), /* reserved50 */
  126. D_CHAR(4), /* vendor5 - tDMA */
  127. D_SHORT(4), /* field_valid - cur_sectors */
  128. D_INT(1), /* cur_capacity */
  129. D_CHAR(2), /* multsect - multsect_valid */
  130. D_INT(1), /* lba_capacity */
  131. D_SHORT(194) /* dma_1word - reservedyy */
  132. };
  133. #define num_driveid_types       (sizeof(driveid_types)/sizeof(*driveid_types))
  134. static __inline__ void ide_fix_driveid(struct hd_driveid *id)
  135. {
  136. u_char *p = (u_char *)id;
  137. int i, j, cnt;
  138. u_char t;
  139. for (i = 0; i < num_driveid_types; i++) {
  140. cnt = driveid_types[i] & T_MASK_COUNT;
  141. switch (driveid_types[i] & T_MASK_TYPE) {
  142. case T_CHAR:
  143. p += cnt;
  144. break;
  145. case T_SHORT:
  146. for (j = 0; j < cnt; j++) {
  147. t = p[0];
  148. p[0] = p[1];
  149. p[1] = t;
  150. p += 2;
  151. }
  152. break;
  153. case T_INT:
  154. for (j = 0; j < cnt; j++) {
  155. t = p[0];
  156. p[0] = p[3];
  157. p[3] = t;
  158. t = p[1];
  159. p[1] = p[2];
  160. p[2] = t;
  161. p += 4;
  162. }
  163. break;
  164. case T_TEXT:
  165. for (j = 0; j < cnt; j += 2) {
  166. t = p[0];
  167. p[0] = p[1];
  168. p[1] = t;
  169. p += 2;
  170. }
  171. break;
  172. };
  173. }
  174. }
  175. #else /* defined(CONFIG_SWAP_IO_SPACE) && defined(__MIPSEB__)  */
  176. #define ide_fix_driveid(id) do {} while (0)
  177. #endif
  178. /*
  179.  * The following are not needed for the non-m68k ports
  180.  */
  181. #define ide_ack_intr(hwif) (1)
  182. #define ide_release_lock(lock) do {} while (0)
  183. #define ide_get_lock(lock, hdlr, data) do {} while (0)
  184. #endif /* __KERNEL__ */
  185. #endif /* __ASM_IDE_H */