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

嵌入式Linux

开发平台:

Unix_Linux

  1. /* $Id: cmd64x.c,v 1.21 2000/01/30 23:23:16
  2.  *
  3.  * linux/drivers/ide/cmd64x.c Version 1.22 June 9, 2000
  4.  *
  5.  * cmd64x.c: Enable interrupts at initialization time on Ultra/PCI machines.
  6.  *           Note, this driver is not used at all on other systems because
  7.  *           there the "BIOS" has done all of the following already.
  8.  *           Due to massive hardware bugs, UltraDMA is only supported
  9.  *           on the 646U2 and not on the 646U.
  10.  *
  11.  * Copyright (C) 1998       Eddie C. Dost  (ecd@skynet.be)
  12.  * Copyright (C) 1998       David S. Miller (davem@redhat.com)
  13.  * Copyright (C) 1999-2000  Andre Hedrick <andre@linux-ide.org>
  14.  */
  15. #include <linux/config.h>
  16. #include <linux/types.h>
  17. #include <linux/pci.h>
  18. #include <linux/delay.h>
  19. #include <linux/hdreg.h>
  20. #include <linux/ide.h>
  21. #include <linux/init.h>
  22. #include <asm/io.h>
  23. #include "ide_modes.h"
  24. #ifndef SPLIT_BYTE
  25. #define SPLIT_BYTE(B,H,L) ((H)=(B>>4), (L)=(B-((B>>4)<<4)))
  26. #endif
  27. #define CMD_DEBUG 0
  28. #if CMD_DEBUG
  29. #define cmdprintk(x...) printk(##x)
  30. #else
  31. #define cmdprintk(x...)
  32. #endif
  33. /*
  34.  * CMD64x specific registers definition.
  35.  */
  36. #define CFR 0x50
  37. #define   CFR_INTR_CH0 0x02
  38. #define CNTRL 0x51
  39. #define   CNTRL_DIS_RA0 0x40
  40. #define   CNTRL_DIS_RA1 0x80
  41. #define   CNTRL_ENA_2ND 0x08
  42. #define CMDTIM 0x52
  43. #define ARTTIM0 0x53
  44. #define DRWTIM0 0x54
  45. #define ARTTIM1  0x55
  46. #define DRWTIM1 0x56
  47. #define ARTTIM23 0x57
  48. #define   ARTTIM23_DIS_RA2 0x04
  49. #define   ARTTIM23_DIS_RA3 0x08
  50. #define   ARTTIM23_INTR_CH1 0x10
  51. #define ARTTIM2 0x57
  52. #define ARTTIM3 0x57
  53. #define DRWTIM23 0x58
  54. #define DRWTIM2 0x58
  55. #define BRST 0x59
  56. #define DRWTIM3 0x5b
  57. #define BMIDECR0 0x70
  58. #define MRDMODE 0x71
  59. #define   MRDMODE_INTR_CH0 0x04
  60. #define   MRDMODE_INTR_CH1 0x08
  61. #define   MRDMODE_BLK_CH0 0x10
  62. #define   MRDMODE_BLK_CH1 0x20
  63. #define BMIDESR0 0x72
  64. #define UDIDETCR0 0x73
  65. #define DTPR0 0x74
  66. #define BMIDECR1 0x78
  67. #define BMIDECSR 0x79
  68. #define BMIDESR1 0x7A
  69. #define UDIDETCR1 0x7B
  70. #define DTPR1 0x7C
  71. #define DISPLAY_CMD64X_TIMINGS
  72. #if defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS)
  73. #include <linux/stat.h>
  74. #include <linux/proc_fs.h>
  75. static int cmd64x_get_info(char *, char **, off_t, int);
  76. extern int (*cmd64x_display_info)(char *, char **, off_t, int); /* ide-proc.c */
  77. extern char *ide_media_verbose(ide_drive_t *);
  78. static struct pci_dev *bmide_dev;
  79. static int cmd64x_get_info (char *buffer, char **addr, off_t offset, int count)
  80. {
  81. char *p = buffer;
  82. u8 reg53 = 0, reg54 = 0, reg55 = 0, reg56 = 0; /* primary */
  83. u8 reg57 = 0, reg58 = 0, reg5b; /* secondary */
  84. u8 reg72 = 0, reg73 = 0; /* primary */
  85. u8 reg7a = 0, reg7b = 0; /* secondary */
  86. u8 reg50 = 0, reg71 = 0; /* extra */
  87. u8 hi_byte = 0, lo_byte = 0;
  88. switch(bmide_dev->device) {
  89. case PCI_DEVICE_ID_CMD_649:
  90. p += sprintf(p, "n                                CMD649 Chipset.n");
  91. break;
  92. case PCI_DEVICE_ID_CMD_648:
  93. p += sprintf(p, "n                                CMD648 Chipset.n");
  94. break;
  95. case PCI_DEVICE_ID_CMD_646:
  96. p += sprintf(p, "n                                CMD646 Chipset.n");
  97. break;
  98. case PCI_DEVICE_ID_CMD_643:
  99. p += sprintf(p, "n                                CMD643 Chipset.n");
  100. break;
  101. default:
  102. p += sprintf(p, "n                                CMD64? Chipse.n");
  103. break;
  104. }
  105. (void) pci_read_config_byte(bmide_dev, CFR,       &reg50);
  106. (void) pci_read_config_byte(bmide_dev, ARTTIM0,   &reg53);
  107. (void) pci_read_config_byte(bmide_dev, DRWTIM0,   &reg54);
  108. (void) pci_read_config_byte(bmide_dev, ARTTIM1,   &reg55);
  109. (void) pci_read_config_byte(bmide_dev, DRWTIM1,   &reg56);
  110. (void) pci_read_config_byte(bmide_dev, ARTTIM2,   &reg57);
  111. (void) pci_read_config_byte(bmide_dev, DRWTIM2,   &reg58);
  112. (void) pci_read_config_byte(bmide_dev, DRWTIM3,   &reg5b);
  113. (void) pci_read_config_byte(bmide_dev, MRDMODE,   &reg71);
  114. (void) pci_read_config_byte(bmide_dev, BMIDESR0,  &reg72);
  115. (void) pci_read_config_byte(bmide_dev, UDIDETCR0, &reg73);
  116. (void) pci_read_config_byte(bmide_dev, BMIDESR1,  &reg7a);
  117. (void) pci_read_config_byte(bmide_dev, UDIDETCR1, &reg7b);
  118. p += sprintf(p, "--------------- Primary Channel ---------------- Secondary Channel -------------n");
  119. p += sprintf(p, "                %sabled                         %sabledn",
  120. (reg72&0x80)?"dis":" en",(reg7a&0x80)?"dis":" en");
  121. p += sprintf(p, "--------------- drive0 --------- drive1 -------- drive0 ---------- drive1 ------n");
  122. p += sprintf(p, "DMA enabled:    %s              %s             %s               %sn",
  123. (reg72&0x20)?"yes":"no ",(reg72&0x40)?"yes":"no ",(reg7a&0x20)?"yes":"no ",(reg7a&0x40)?"yes":"no ");
  124. p += sprintf(p, "DMA Mode:       %s(%s)          %s(%s)         %s(%s)           %s(%s)n",
  125. (reg72&0x20)?((reg73&0x01)?"UDMA":" DMA"):" PIO",
  126. (reg72&0x20)?(  ((reg73&0x30)==0x30)?(((reg73&0x35)==0x35)?"3":"0"):
  127. ((reg73&0x20)==0x20)?(((reg73&0x25)==0x25)?"3":"1"):
  128. ((reg73&0x10)==0x10)?(((reg73&0x15)==0x15)?"4":"2"):
  129. ((reg73&0x00)==0x00)?(((reg73&0x05)==0x05)?"5":"2"):"X"):"?",
  130. (reg72&0x40)?((reg73&0x02)?"UDMA":" DMA"):" PIO",
  131. (reg72&0x40)?( ((reg73&0xC0)==0xC0)?(((reg73&0xC5)==0xC5)?"3":"0"):
  132. ((reg73&0x80)==0x80)?(((reg73&0x85)==0x85)?"3":"1"):
  133. ((reg73&0x40)==0x40)?(((reg73&0x4A)==0x4A)?"4":"2"):
  134. ((reg73&0x00)==0x00)?(((reg73&0x0A)==0x0A)?"5":"2"):"X"):"?",
  135. (reg7a&0x20)?((reg7b&0x01)?"UDMA":" DMA"):" PIO",
  136. (reg7a&0x20)?( ((reg7b&0x30)==0x30)?(((reg7b&0x35)==0x35)?"3":"0"):
  137. ((reg7b&0x20)==0x20)?(((reg7b&0x25)==0x25)?"3":"1"):
  138. ((reg7b&0x10)==0x10)?(((reg7b&0x15)==0x15)?"4":"2"):
  139. ((reg7b&0x00)==0x00)?(((reg7b&0x05)==0x05)?"5":"2"):"X"):"?",
  140. (reg7a&0x40)?((reg7b&0x02)?"UDMA":" DMA"):" PIO",
  141. (reg7a&0x40)?( ((reg7b&0xC0)==0xC0)?(((reg7b&0xC5)==0xC5)?"3":"0"):
  142. ((reg7b&0x80)==0x80)?(((reg7b&0x85)==0x85)?"3":"1"):
  143. ((reg7b&0x40)==0x40)?(((reg7b&0x4A)==0x4A)?"4":"2"):
  144. ((reg7b&0x00)==0x00)?(((reg7b&0x0A)==0x0A)?"5":"2"):"X"):"?" );
  145. p += sprintf(p, "PIO Mode:       %s                %s               %s                 %sn",
  146. "?", "?", "?", "?");
  147. p += sprintf(p, "                %s                     %sn",
  148. (reg50 & CFR_INTR_CH0) ? "interrupting" : "polling     ",
  149. (reg57 & ARTTIM23_INTR_CH1) ? "interrupting" : "polling");
  150. p += sprintf(p, "                %s                          %sn",
  151. (reg71 & MRDMODE_INTR_CH0) ? "pending" : "clear  ",
  152. (reg71 & MRDMODE_INTR_CH1) ? "pending" : "clear");
  153. p += sprintf(p, "                %s                          %sn",
  154. (reg71 & MRDMODE_BLK_CH0) ? "blocked" : "enabled",
  155. (reg71 & MRDMODE_BLK_CH1) ? "blocked" : "enabled");
  156. SPLIT_BYTE(reg50, hi_byte, lo_byte);
  157. p += sprintf(p, "CFR       = 0x%02x, HI = 0x%02x, LOW = 0x%02xn", reg50, hi_byte, lo_byte);
  158. SPLIT_BYTE(reg57, hi_byte, lo_byte);
  159. p += sprintf(p, "ARTTIM23  = 0x%02x, HI = 0x%02x, LOW = 0x%02xn", reg57, hi_byte, lo_byte);
  160. SPLIT_BYTE(reg71, hi_byte, lo_byte);
  161. p += sprintf(p, "MRDMODE   = 0x%02x, HI = 0x%02x, LOW = 0x%02xn", reg71, hi_byte, lo_byte);
  162. return p-buffer; /* => must be less than 4k! */
  163. }
  164. #if 0
  165. static char * cmd64x_chipset_data (char *buf, struct pci_dev *dev)
  166. {
  167. char *p = buf;
  168. p += sprintf(p, "thingy stuffn");
  169. return (char *)p;
  170. }
  171. static int __init cmd64x_get_info (char *buffer, char **addr, off_t offset, int count)
  172. {
  173. char *p = buffer;
  174. p = cmd64x_chipset_data(buffer, bmide_dev);
  175. return p-buffer; /* hoping it is less than 4K... */
  176. }
  177. #endif
  178. #endif /* defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS) */
  179. byte cmd64x_proc = 0;
  180. /*
  181.  * Registers and masks for easy access by drive index:
  182.  */
  183. #if 0
  184. static byte prefetch_regs[4]  = {CNTRL, CNTRL, ARTTIM23, ARTTIM23};
  185. static byte prefetch_masks[4] = {CNTRL_DIS_RA0, CNTRL_DIS_RA1, ARTTIM23_DIS_RA2, ARTTIM23_DIS_RA3};
  186. #endif
  187. /*
  188.  * This routine writes the prepared setup/active/recovery counts
  189.  * for a drive into the cmd646 chipset registers to active them.
  190.  */
  191. static void program_drive_counts (ide_drive_t *drive, int setup_count, int active_count, int recovery_count)
  192. {
  193. unsigned long flags;
  194. ide_drive_t *drives = HWIF(drive)->drives;
  195. byte temp_b;
  196. static const byte setup_counts[] = {0x40, 0x40, 0x40, 0x80, 0, 0xc0};
  197. static const byte recovery_counts[] =
  198. {15, 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0};
  199. static const byte arttim_regs[2][2] = {
  200. { ARTTIM0, ARTTIM1 },
  201. { ARTTIM23, ARTTIM23 }
  202. };
  203. static const byte drwtim_regs[2][2] = {
  204. { DRWTIM0, DRWTIM1 },
  205. { DRWTIM2, DRWTIM3 }
  206. };
  207. int channel = (int) HWIF(drive)->channel;
  208. int slave = (drives != drive);  /* Is this really the best way to determine this?? */
  209. cmdprintk("program_drive_count parameters = s(%d),a(%d),r(%d),p(%d)n", setup_count,
  210. active_count, recovery_count, drive->present);
  211. /*
  212.  * Set up address setup count registers.
  213.  * Primary interface has individual count/timing registers for
  214.  * each drive.  Secondary interface has one common set of registers,
  215.  * for address setup so we merge these timings, using the slowest
  216.  * value.
  217.  */
  218. if (channel) {
  219. drive->drive_data = setup_count;
  220. setup_count = IDE_MAX(drives[0].drive_data, drives[1].drive_data);
  221. cmdprintk("Secondary interface, setup_count = %dn", setup_count);
  222. }
  223. /*
  224.  * Convert values to internal chipset representation
  225.  */
  226. setup_count = (setup_count > 5) ? 0xc0 : (int) setup_counts[setup_count];
  227. active_count &= 0xf; /* Remember, max value is 16 */
  228. recovery_count = (int) recovery_counts[recovery_count];
  229. cmdprintk("Final values = %d,%d,%dn", setup_count, active_count, recovery_count);
  230. /*
  231.  * Now that everything is ready, program the new timings
  232.  */
  233. __save_flags (flags);
  234. __cli();
  235. /*
  236.  * Program the address_setup clocks into ARTTIM reg,
  237.  * and then the active/recovery counts into the DRWTIM reg
  238.  */
  239. (void) pci_read_config_byte(HWIF(drive)->pci_dev, arttim_regs[channel][slave], &temp_b);
  240. (void) pci_write_config_byte(HWIF(drive)->pci_dev, arttim_regs[channel][slave],
  241. ((byte) setup_count) | (temp_b & 0x3f));
  242. (void) pci_write_config_byte(HWIF(drive)->pci_dev, drwtim_regs[channel][slave],
  243. (byte) ((active_count << 4) | recovery_count));
  244. cmdprintk ("Write %x to %xn", ((byte) setup_count) | (temp_b & 0x3f), arttim_regs[channel][slave]);
  245. cmdprintk ("Write %x to %xn", (byte) ((active_count << 4) | recovery_count), drwtim_regs[channel][slave]);
  246. __restore_flags(flags);
  247. }
  248. /*
  249.  * Attempts to set the interface PIO mode.
  250.  * The preferred method of selecting PIO modes (e.g. mode 4) is 
  251.  * "echo 'piomode:4' > /proc/ide/hdx/settings".  Special cases are
  252.  * 8: prefetch off, 9: prefetch on, 255: auto-select best mode.
  253.  * Called with 255 at boot time.
  254.  */
  255. static void cmd64x_tuneproc (ide_drive_t *drive, byte mode_wanted)
  256. {
  257. int setup_time, active_time, recovery_time, clock_time, pio_mode, cycle_time;
  258. byte recovery_count2, cycle_count;
  259. int setup_count, active_count, recovery_count;
  260. int bus_speed = system_bus_clock();
  261. /*byte b;*/
  262. ide_pio_data_t  d;
  263. switch (mode_wanted) {
  264. case 8: /* set prefetch off */
  265. case 9: /* set prefetch on */
  266. mode_wanted &= 1;
  267. /*set_prefetch_mode(index, mode_wanted);*/
  268. cmdprintk("%s: %sabled cmd640 prefetchn", drive->name, mode_wanted ? "en" : "dis");
  269. return;
  270. }
  271. mode_wanted = ide_get_best_pio_mode (drive, mode_wanted, 5, &d);
  272. pio_mode = d.pio_mode;
  273. cycle_time = d.cycle_time;
  274. /*
  275.  * I copied all this complicated stuff from cmd640.c and made a few minor changes.
  276.  * For now I am just going to pray that it is correct.
  277.  */
  278. if (pio_mode > 5)
  279. pio_mode = 5;
  280. setup_time  = ide_pio_timings[pio_mode].setup_time;
  281. active_time = ide_pio_timings[pio_mode].active_time;
  282. recovery_time = cycle_time - (setup_time + active_time);
  283. clock_time = 1000 / bus_speed;
  284. cycle_count = (cycle_time + clock_time - 1) / clock_time;
  285. setup_count = (setup_time + clock_time - 1) / clock_time;
  286. active_count = (active_time + clock_time - 1) / clock_time;
  287. recovery_count = (recovery_time + clock_time - 1) / clock_time;
  288. recovery_count2 = cycle_count - (setup_count + active_count);
  289. if (recovery_count2 > recovery_count)
  290. recovery_count = recovery_count2;
  291. if (recovery_count > 16) {
  292. active_count += recovery_count - 16;
  293. recovery_count = 16;
  294. }
  295. if (active_count > 16)
  296. active_count = 16; /* maximum allowed by cmd646 */
  297. /*
  298.  * In a perfect world, we might set the drive pio mode here
  299.  * (using WIN_SETFEATURE) before continuing.
  300.  *
  301.  * But we do not, because:
  302.  * 1) this is the wrong place to do it (proper is do_special() in ide.c)
  303.  *  2) in practice this is rarely, if ever, necessary
  304.  */
  305. program_drive_counts (drive, setup_count, active_count, recovery_count);
  306. cmdprintk("%s: selected cmd646 PIO mode%d : %d (%dns)%s, clocks=%d/%d/%dn",
  307. drive->name, pio_mode, mode_wanted, cycle_time,
  308. d.overridden ? " (overriding vendor mode)" : "",
  309. setup_count, active_count, recovery_count);
  310. }
  311. static void config_chipset_for_pio (ide_drive_t *drive, byte set_speed)
  312. {
  313. byte speed= 0x00;
  314. byte set_pio= ide_get_best_pio_mode(drive, 4, 5, NULL);
  315. cmd64x_tuneproc(drive, set_pio);
  316. speed = XFER_PIO_0 + set_pio;
  317. if (set_speed)
  318. (void) ide_config_drive_speed(drive, speed);
  319. }
  320. static int cmd64x_tune_chipset (ide_drive_t *drive, byte speed)
  321. {
  322. #ifdef CONFIG_BLK_DEV_IDEDMA
  323. ide_hwif_t *hwif = HWIF(drive);
  324. struct pci_dev *dev = hwif->pci_dev;
  325. int err = 0;
  326. byte unit = (drive->select.b.unit & 0x01);
  327. u8 pciU = (hwif->channel) ? UDIDETCR1 : UDIDETCR0;
  328. u8 pciD = (hwif->channel) ? BMIDESR1 : BMIDESR0;
  329. u8 regU = 0;
  330. u8 regD = 0;
  331. if ((drive->media != ide_disk) && (speed < XFER_SW_DMA_0)) return 1;
  332. (void) pci_read_config_byte(dev, pciD, &regD);
  333. (void) pci_read_config_byte(dev, pciU, &regU);
  334. regD &= ~(unit ? 0x40 : 0x20);
  335. regU &= ~(unit ? 0xCA : 0x35);
  336. (void) pci_write_config_byte(dev, pciD, regD);
  337. (void) pci_write_config_byte(dev, pciU, regU);
  338. (void) pci_read_config_byte(dev, pciD, &regD);
  339. (void) pci_read_config_byte(dev, pciU, &regU);
  340. switch(speed) {
  341. case XFER_UDMA_5: regU |= (unit ? 0x0A : 0x05); break;
  342. case XFER_UDMA_4: regU |= (unit ? 0x4A : 0x15); break;
  343. case XFER_UDMA_3: regU |= (unit ? 0x8A : 0x25); break;
  344. case XFER_UDMA_2: regU |= (unit ? 0x42 : 0x11); break;
  345. case XFER_UDMA_1: regU |= (unit ? 0x82 : 0x21); break;
  346. case XFER_UDMA_0: regU |= (unit ? 0xC2 : 0x31); break;
  347. case XFER_MW_DMA_2: regD |= (unit ? 0x40 : 0x10); break;
  348. case XFER_MW_DMA_1: regD |= (unit ? 0x80 : 0x20); break;
  349. case XFER_MW_DMA_0: regD |= (unit ? 0xC0 : 0x30); break;
  350. case XFER_SW_DMA_2: regD |= (unit ? 0x40 : 0x10); break;
  351. case XFER_SW_DMA_1: regD |= (unit ? 0x80 : 0x20); break;
  352. case XFER_SW_DMA_0: regD |= (unit ? 0xC0 : 0x30); break;
  353. #else
  354. int err = 0;
  355. switch(speed) {
  356. #endif /* CONFIG_BLK_DEV_IDEDMA */
  357. case XFER_PIO_4: cmd64x_tuneproc(drive, 4); break;
  358. case XFER_PIO_3: cmd64x_tuneproc(drive, 3); break;
  359. case XFER_PIO_2: cmd64x_tuneproc(drive, 2); break;
  360. case XFER_PIO_1: cmd64x_tuneproc(drive, 1); break;
  361. case XFER_PIO_0: cmd64x_tuneproc(drive, 0); break;
  362. default:
  363. return 1;
  364. }
  365. #ifdef CONFIG_BLK_DEV_IDEDMA
  366. (void) pci_write_config_byte(dev, pciU, regU);
  367. #endif /* CONFIG_BLK_DEV_IDEDMA */
  368. err = ide_config_drive_speed(drive, speed);
  369. drive->current_speed = speed;
  370. #ifdef CONFIG_BLK_DEV_IDEDMA
  371. regD |= (unit ? 0x40 : 0x20);
  372. (void) pci_write_config_byte(dev, pciD, regD);
  373. #endif /* CONFIG_BLK_DEV_IDEDMA */
  374. return err;
  375. }
  376. #ifdef CONFIG_BLK_DEV_IDEDMA
  377. static int config_chipset_for_dma (ide_drive_t *drive, unsigned int rev, byte ultra_66)
  378. {
  379. struct hd_driveid *id = drive->id;
  380. ide_hwif_t *hwif = HWIF(drive);
  381. struct pci_dev *dev = hwif->pci_dev;
  382. byte speed = 0x00;
  383. byte set_pio = 0x00;
  384. byte udma_33 = ((rev >= 0x05) || (ultra_66)) ? 1 : 0;
  385. byte udma_66 = eighty_ninty_three(drive);
  386. byte udma_100 = 0;
  387. int rval;
  388. switch(dev->device) {
  389. case PCI_DEVICE_ID_CMD_649: udma_100 = 1; break;
  390. case PCI_DEVICE_ID_CMD_648:
  391. case PCI_DEVICE_ID_CMD_646:
  392. case PCI_DEVICE_ID_CMD_643:
  393. default:
  394. break;
  395. }
  396. if (drive->media != ide_disk) {
  397. cmdprintk("CMD64X: drive->media != ide_disk at double check, inital check failed!!n");
  398. return ((int) ide_dma_off);
  399. }
  400. /* UltraDMA only supported on PCI646U and PCI646U2,
  401.  * which correspond to revisions 0x03, 0x05 and 0x07 respectively.
  402.  * Actually, although the CMD tech support people won't
  403.  * tell me the details, the 0x03 revision cannot support
  404.  * UDMA correctly without hardware modifications, and even
  405.  * then it only works with Quantum disks due to some
  406.  * hold time assumptions in the 646U part which are fixed
  407.  * in the 646U2.
  408.  * So we only do UltraDMA on revision 0x05 and 0x07 chipsets.
  409.  */
  410. if ((id->dma_ultra & 0x0020) && (udma_100) && (udma_66) && (udma_33)) {
  411. speed = XFER_UDMA_5;
  412. } else if ((id->dma_ultra & 0x0010) && (udma_66) && (udma_33)) {
  413. speed = XFER_UDMA_4;
  414. } else if ((id->dma_ultra & 0x0008) && (udma_66) && (udma_33)) {
  415. speed = XFER_UDMA_3;
  416. } else if ((id->dma_ultra & 0x0004) && (udma_33)) {
  417. speed = XFER_UDMA_2;
  418. } else if ((id->dma_ultra & 0x0002) && (udma_33)) {
  419. speed = XFER_UDMA_1;
  420. } else if ((id->dma_ultra & 0x0001) && (udma_33)) {
  421. speed = XFER_UDMA_0;
  422. } else if (id->dma_mword & 0x0004) {
  423. speed = XFER_MW_DMA_2;
  424. } else if (id->dma_mword & 0x0002) {
  425. speed = XFER_MW_DMA_1;
  426. } else if (id->dma_mword & 0x0001) {
  427. speed = XFER_MW_DMA_0;
  428. } else if (id->dma_1word & 0x0004) {
  429. speed = XFER_SW_DMA_2;
  430. } else if (id->dma_1word & 0x0002) {
  431. speed = XFER_SW_DMA_1;
  432. } else if (id->dma_1word & 0x0001) {
  433. speed = XFER_SW_DMA_0;
  434. } else {
  435. set_pio = 1;
  436. }
  437. if (!drive->init_speed)
  438. drive->init_speed = speed;
  439. config_chipset_for_pio(drive, set_pio);
  440. if (set_pio)
  441. return ((int) ide_dma_off_quietly);
  442. if (cmd64x_tune_chipset(drive, speed))
  443. return ((int) ide_dma_off);
  444. rval = (int)( ((id->dma_ultra >> 11) & 7) ? ide_dma_on :
  445. ((id->dma_ultra >> 8) & 7) ? ide_dma_on :
  446. ((id->dma_mword >> 8) & 7) ? ide_dma_on :
  447. ((id->dma_1word >> 8) & 7) ? ide_dma_on :
  448.      ide_dma_off_quietly);
  449. return rval;
  450. }
  451. static int cmd64x_config_drive_for_dma (ide_drive_t *drive)
  452. {
  453. struct hd_driveid *id = drive->id;
  454. ide_hwif_t *hwif = HWIF(drive);
  455. struct pci_dev *dev = hwif->pci_dev;
  456. unsigned int class_rev = 0;
  457. byte can_ultra_33 = 0;
  458. byte can_ultra_66 = 0;
  459. byte can_ultra_100 = 0;
  460. ide_dma_action_t dma_func = ide_dma_on;
  461. pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
  462. class_rev &= 0xff;
  463. switch(dev->device) {
  464. case PCI_DEVICE_ID_CMD_649:
  465. can_ultra_100 = 1;
  466. case PCI_DEVICE_ID_CMD_648:
  467. can_ultra_66  = 1;
  468. case PCI_DEVICE_ID_CMD_643:
  469. can_ultra_33  = 1;
  470. break;
  471. case PCI_DEVICE_ID_CMD_646:
  472. can_ultra_33  = (class_rev >= 0x05) ? 1 : 0;
  473. can_ultra_66  = 0;
  474. can_ultra_100 = 0;
  475. break;
  476. default:
  477. return hwif->dmaproc(ide_dma_off, drive);
  478. }
  479. if ((id != NULL) && ((id->capability & 1) != 0) &&
  480.     hwif->autodma && (drive->media == ide_disk)) {
  481. /* Consult the list of known "bad" drives */
  482. if (ide_dmaproc(ide_dma_bad_drive, drive)) {
  483. dma_func = ide_dma_off;
  484. goto fast_ata_pio;
  485. }
  486. dma_func = ide_dma_off_quietly;
  487. if ((id->field_valid & 4) && (can_ultra_33)) {
  488. if (id->dma_ultra & 0x002F) {
  489. /* Force if Capable UltraDMA */
  490. dma_func = config_chipset_for_dma(drive, class_rev, can_ultra_66);
  491. if ((id->field_valid & 2) &&
  492.     (dma_func != ide_dma_on))
  493. goto try_dma_modes;
  494. }
  495. } else if (id->field_valid & 2) {
  496. try_dma_modes:
  497. if ((id->dma_mword & 0x0007) ||
  498.     (id->dma_1word & 0x0007)) {
  499. /* Force if Capable regular DMA modes */
  500. dma_func = config_chipset_for_dma(drive, class_rev, 0);
  501. if (dma_func != ide_dma_on)
  502. goto no_dma_set;
  503. }
  504. } else if (ide_dmaproc(ide_dma_good_drive, drive)) {
  505. if (id->eide_dma_time > 150) {
  506. goto no_dma_set;
  507. }
  508. /* Consult the list of known "good" drives */
  509. dma_func = config_chipset_for_dma(drive, class_rev, 0);
  510. if (dma_func != ide_dma_on)
  511. goto no_dma_set;
  512. } else {
  513. goto fast_ata_pio;
  514. }
  515. } else if ((id->capability & 8) || (id->field_valid & 2)) {
  516. fast_ata_pio:
  517. dma_func = ide_dma_off_quietly;
  518. no_dma_set:
  519. config_chipset_for_pio(drive, 1);
  520. }
  521. return HWIF(drive)->dmaproc(dma_func, drive);
  522. }
  523. static int cmd64x_dmaproc (ide_dma_action_t func, ide_drive_t *drive)
  524. {
  525. byte dma_stat = 0;
  526. byte dma_alt_stat = 0;
  527. byte mask = (HWIF(drive)->channel) ? MRDMODE_INTR_CH1 : MRDMODE_INTR_CH0;
  528. unsigned long dma_base = HWIF(drive)->dma_base;
  529. struct pci_dev *dev = HWIF(drive)->pci_dev;
  530. byte jack_slap = ((dev->device == PCI_DEVICE_ID_CMD_648) || (dev->device == PCI_DEVICE_ID_CMD_649)) ? 1 : 0;
  531. switch (func) {
  532. case ide_dma_check:
  533. return cmd64x_config_drive_for_dma(drive);
  534. case ide_dma_end: /* returns 1 on error, 0 otherwise */
  535. drive->waiting_for_dma = 0;
  536. outb(inb(dma_base)&~1, dma_base); /* stop DMA */
  537. dma_stat = inb(dma_base+2); /* get DMA status */
  538. outb(dma_stat|6, dma_base+2); /* clear the INTR & ERROR bits */
  539. if (jack_slap) {
  540. byte dma_intr = 0;
  541. byte dma_mask = (HWIF(drive)->channel) ? ARTTIM23_INTR_CH1 : CFR_INTR_CH0;
  542. byte dma_reg = (HWIF(drive)->channel) ? ARTTIM2 : CFR;
  543. (void) pci_read_config_byte(dev, dma_reg, &dma_intr);
  544. /*
  545.  * DAMN BMIDE is not connected to PCI space!
  546.  * Have to manually jack-slap that bitch!
  547.  * To allow the PCI side to read incoming interrupts.
  548.  */
  549. (void) pci_write_config_byte(dev, dma_reg, dma_intr|dma_mask); /* clear the INTR bit */
  550. }
  551. ide_destroy_dmatable(drive); /* purge DMA mappings */
  552. return (dma_stat & 7) != 4; /* verify good DMA status */
  553. case ide_dma_test_irq: /* returns 1 if dma irq issued, 0 otherwise */
  554. dma_stat = inb(dma_base+2);
  555. (void) pci_read_config_byte(dev, MRDMODE, &dma_alt_stat);
  556. #ifdef DEBUG
  557. printk("%s: dma_stat: 0x%02x dma_alt_stat: 0x%02x mask: 0x%02xn", drive->name, dma_stat, dma_alt_stat, mask);
  558. #endif
  559. if (!(dma_alt_stat & mask)) {
  560. return 0;
  561. }
  562. return (dma_stat & 4) == 4; /* return 1 if INTR asserted */
  563. default:
  564. break;
  565. }
  566. /* Other cases are done by generic IDE-DMA code. */
  567. return ide_dmaproc(func, drive);
  568. }
  569. /*
  570.  * ASUS P55T2P4D with CMD646 chipset revision 0x01 requires the old
  571.  * event order for DMA transfers.
  572.  */
  573. static int cmd646_1_dmaproc (ide_dma_action_t func, ide_drive_t *drive)
  574. {
  575. ide_hwif_t *hwif = HWIF(drive);
  576. unsigned long dma_base = hwif->dma_base;
  577. byte dma_stat;
  578. switch (func) {
  579. case ide_dma_check:
  580. return cmd64x_config_drive_for_dma(drive);
  581. case ide_dma_end:
  582. drive->waiting_for_dma = 0;
  583. dma_stat = inb(dma_base+2); /* get DMA status */
  584. outb(inb(dma_base)&~1, dma_base); /* stop DMA */
  585. outb(dma_stat|6, dma_base+2); /* clear the INTR & ERROR bits */
  586. ide_destroy_dmatable(drive); /* and free any DMA resources */
  587. return (dma_stat & 7) != 4; /* verify good DMA status */
  588. default:
  589. break;
  590. }
  591. /* Other cases are done by generic IDE-DMA code. */
  592. return ide_dmaproc(func, drive);
  593. }
  594. #endif /* CONFIG_BLK_DEV_IDEDMA */
  595. unsigned int __init pci_init_cmd64x (struct pci_dev *dev, const char *name)
  596. {
  597. unsigned char mrdmode;
  598. unsigned int class_rev;
  599. pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
  600. class_rev &= 0xff;
  601. #ifdef __i386__
  602. if (dev->resource[PCI_ROM_RESOURCE].start) {
  603. pci_write_config_byte(dev, PCI_ROM_ADDRESS, dev->resource[PCI_ROM_RESOURCE].start | PCI_ROM_ADDRESS_ENABLE);
  604. printk("%s: ROM enabled at 0x%08lxn", name, dev->resource[PCI_ROM_RESOURCE].start);
  605. }
  606. #endif
  607. switch(dev->device) {
  608. case PCI_DEVICE_ID_CMD_643:
  609. break;
  610. case PCI_DEVICE_ID_CMD_646:
  611. printk("%s: chipset revision 0x%02X, ", name, class_rev);
  612. switch(class_rev) {
  613. case 0x07:
  614. case 0x05:
  615. printk("UltraDMA Capable");
  616. break;
  617. case 0x03:
  618. printk("MultiWord DMA Force Limited");
  619. break;
  620. case 0x01:
  621. default:
  622. printk("MultiWord DMA Limited, IRQ workaround enabled");
  623. break;
  624. }
  625. printk("n");
  626.                         break;
  627. case PCI_DEVICE_ID_CMD_648:
  628. case PCI_DEVICE_ID_CMD_649:
  629. break;
  630. default:
  631. break;
  632. }
  633. /* Set a good latency timer and cache line size value. */
  634. (void) pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64);
  635. #ifdef __sparc_v9__
  636. (void) pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 0x10);
  637. #endif
  638. /* Setup interrupts. */
  639. (void) pci_read_config_byte(dev, MRDMODE, &mrdmode);
  640. mrdmode &= ~(0x30);
  641. (void) pci_write_config_byte(dev, MRDMODE, mrdmode);
  642. /* Use MEMORY READ LINE for reads.
  643.  * NOTE: Although not mentioned in the PCI0646U specs,
  644.  *       these bits are write only and won't be read
  645.  *       back as set or not.  The PCI0646U2 specs clarify
  646.  *       this point.
  647.  */
  648. (void) pci_write_config_byte(dev, MRDMODE, mrdmode | 0x02);
  649. /* Set reasonable active/recovery/address-setup values. */
  650. (void) pci_write_config_byte(dev, ARTTIM0,  0x40);
  651. (void) pci_write_config_byte(dev, DRWTIM0,  0x3f);
  652. (void) pci_write_config_byte(dev, ARTTIM1,  0x40);
  653. (void) pci_write_config_byte(dev, DRWTIM1,  0x3f);
  654. #ifdef __i386__
  655. (void) pci_write_config_byte(dev, ARTTIM23, 0x1c);
  656. #else
  657. (void) pci_write_config_byte(dev, ARTTIM23, 0x5c);
  658. #endif
  659. (void) pci_write_config_byte(dev, DRWTIM23, 0x3f);
  660. (void) pci_write_config_byte(dev, DRWTIM3,  0x3f);
  661. #ifdef CONFIG_PPC
  662. (void) pci_write_config_byte(dev, UDIDETCR0, 0xf0);
  663. #endif /* CONFIG_PPC */
  664. #if defined(DISPLAY_CMD64X_TIMINGS) && defined(CONFIG_PROC_FS)
  665. if (!cmd64x_proc) {
  666. cmd64x_proc = 1;
  667. bmide_dev = dev;
  668. cmd64x_display_info = &cmd64x_get_info;
  669. }
  670. #endif /* DISPLAY_CMD64X_TIMINGS && CONFIG_PROC_FS */
  671. return 0;
  672. }
  673. unsigned int __init ata66_cmd64x (ide_hwif_t *hwif)
  674. {
  675. byte ata66 = 0;
  676. byte mask = (hwif->channel) ? 0x02 : 0x01;
  677. pci_read_config_byte(hwif->pci_dev, BMIDECSR, &ata66);
  678. return (ata66 & mask) ? 1 : 0;
  679. }
  680. void __init ide_init_cmd64x (ide_hwif_t *hwif)
  681. {
  682. struct pci_dev *dev = hwif->pci_dev;
  683. unsigned int class_rev;
  684. pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev);
  685. class_rev &= 0xff;
  686. hwif->tuneproc = &cmd64x_tuneproc;
  687. hwif->speedproc = &cmd64x_tune_chipset;
  688. hwif->drives[0].autotune = 1;
  689. hwif->drives[1].autotune = 1;
  690. if (!hwif->dma_base)
  691. return;
  692. #ifdef CONFIG_BLK_DEV_IDEDMA
  693. switch(dev->device) {
  694. case PCI_DEVICE_ID_CMD_649:
  695. case PCI_DEVICE_ID_CMD_648:
  696. case PCI_DEVICE_ID_CMD_643:
  697. hwif->dmaproc = &cmd64x_dmaproc;
  698. break;
  699. case PCI_DEVICE_ID_CMD_646:
  700. hwif->chipset = ide_cmd646;
  701. if (class_rev == 0x01) {
  702. hwif->dmaproc = &cmd646_1_dmaproc;
  703. } else {
  704. hwif->dmaproc = &cmd64x_dmaproc;
  705. }
  706. break;
  707. default:
  708. break;
  709. }
  710. #endif /* CONFIG_BLK_DEV_IDEDMA */
  711. }