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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/drivers/ide/piix.c Version 0.32 June 9, 2000
  3.  *
  4.  *  Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer
  5.  *  Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org>
  6.  *  May be copied or modified under the terms of the GNU General Public License
  7.  *
  8.  *  PIO mode setting function for Intel chipsets.  
  9.  *  For use instead of BIOS settings.
  10.  *
  11.  * 40-41
  12.  * 42-43
  13.  * 
  14.  *                 41
  15.  *                 43
  16.  *
  17.  * | PIO 0       | c0 | 80 | 0 |  piix_tune_drive(drive, 0);
  18.  * | PIO 2 | SW2 | d0 | 90 | 4 |  piix_tune_drive(drive, 2);
  19.  * | PIO 3 | MW1 | e1 | a1 | 9 |  piix_tune_drive(drive, 3);
  20.  * | PIO 4 | MW2 | e3 | a3 | b |  piix_tune_drive(drive, 4);
  21.  * 
  22.  * sitre = word40 & 0x4000; primary
  23.  * sitre = word42 & 0x4000; secondary
  24.  *
  25.  * 44 8421|8421    hdd|hdb
  26.  * 
  27.  * 48 8421         hdd|hdc|hdb|hda udma enabled
  28.  *
  29.  *    0001         hda
  30.  *    0010         hdb
  31.  *    0100         hdc
  32.  *    1000         hdd
  33.  *
  34.  * 4a 84|21        hdb|hda
  35.  * 4b 84|21        hdd|hdc
  36.  *
  37.  *    ata-33/82371AB
  38.  *    ata-33/82371EB
  39.  *    ata-33/82801AB            ata-66/82801AA
  40.  *    00|00 udma 0              00|00 reserved
  41.  *    01|01 udma 1              01|01 udma 3
  42.  *    10|10 udma 2              10|10 udma 4
  43.  *    11|11 reserved            11|11 reserved
  44.  *
  45.  * 54 8421|8421    ata66 drive|ata66 enable
  46.  *
  47.  * pci_read_config_word(HWIF(drive)->pci_dev, 0x40, &reg40);
  48.  * pci_read_config_word(HWIF(drive)->pci_dev, 0x42, &reg42);
  49.  * pci_read_config_word(HWIF(drive)->pci_dev, 0x44, &reg44);
  50.  * pci_read_config_word(HWIF(drive)->pci_dev, 0x48, &reg48);
  51.  * pci_read_config_word(HWIF(drive)->pci_dev, 0x4a, &reg4a);
  52.  * pci_read_config_word(HWIF(drive)->pci_dev, 0x54, &reg54);
  53.  *
  54.  */
  55. #include <linux/config.h>
  56. #include <linux/types.h>
  57. #include <linux/kernel.h>
  58. #include <linux/ioport.h>
  59. #include <linux/pci.h>
  60. #include <linux/hdreg.h>
  61. #include <linux/ide.h>
  62. #include <linux/delay.h>
  63. #include <linux/init.h>
  64. #include <asm/io.h>
  65. #include "ide_modes.h"
  66. #define PIIX_DEBUG_DRIVE_INFO 0
  67. #define DISPLAY_PIIX_TIMINGS
  68. #if defined(DISPLAY_PIIX_TIMINGS) && defined(CONFIG_PROC_FS)
  69. #include <linux/stat.h>
  70. #include <linux/proc_fs.h>
  71. static int piix_get_info(char *, char **, off_t, int);
  72. extern int (*piix_display_info)(char *, char **, off_t, int); /* ide-proc.c */
  73. extern char *ide_media_verbose(ide_drive_t *);
  74. static struct pci_dev *bmide_dev;
  75. static int piix_get_info (char *buffer, char **addr, off_t offset, int count)
  76. {
  77. char *p = buffer;
  78. u32 bibma = pci_resource_start(bmide_dev, 4);
  79.         u16 reg40 = 0, psitre = 0, reg42 = 0, ssitre = 0;
  80. u8  c0 = 0, c1 = 0;
  81. u8  reg44 = 0, reg48 = 0, reg4a = 0, reg4b = 0, reg54 = 0, reg55 = 0;
  82. switch(bmide_dev->device) {
  83. case PCI_DEVICE_ID_INTEL_82801BA_8:
  84. case PCI_DEVICE_ID_INTEL_82801BA_9:
  85.         case PCI_DEVICE_ID_INTEL_82801CA_10:
  86. p += sprintf(p, "n                                Intel PIIX4 Ultra 100 Chipset.n");
  87. break;
  88. case PCI_DEVICE_ID_INTEL_82372FB_1:
  89. case PCI_DEVICE_ID_INTEL_82801AA_1:
  90. p += sprintf(p, "n                                Intel PIIX4 Ultra 66 Chipset.n");
  91. break;
  92. case PCI_DEVICE_ID_INTEL_82451NX:
  93. case PCI_DEVICE_ID_INTEL_82801AB_1:
  94. case PCI_DEVICE_ID_INTEL_82443MX_1:
  95. case PCI_DEVICE_ID_INTEL_82371AB:
  96. p += sprintf(p, "n                                Intel PIIX4 Ultra 33 Chipset.n");
  97. break;
  98. case PCI_DEVICE_ID_INTEL_82371SB_1:
  99. p += sprintf(p, "n                                Intel PIIX3 Chipset.n");
  100. break;
  101. case PCI_DEVICE_ID_INTEL_82371MX:
  102. p += sprintf(p, "n                                Intel MPIIX Chipset.n");
  103. return p-buffer; /* => must be less than 4k! */
  104. case PCI_DEVICE_ID_INTEL_82371FB_1:
  105. case PCI_DEVICE_ID_INTEL_82371FB_0:
  106. default:
  107. p += sprintf(p, "n                                Intel PIIX Chipset.n");
  108. break;
  109. }
  110. pci_read_config_word(bmide_dev, 0x40, &reg40);
  111. pci_read_config_word(bmide_dev, 0x42, &reg42);
  112. pci_read_config_byte(bmide_dev, 0x44, &reg44);
  113. pci_read_config_byte(bmide_dev, 0x48, &reg48);
  114. pci_read_config_byte(bmide_dev, 0x4a, &reg4a);
  115. pci_read_config_byte(bmide_dev, 0x4b, &reg4b);
  116. pci_read_config_byte(bmide_dev, 0x54, &reg54);
  117. pci_read_config_byte(bmide_dev, 0x55, &reg55);
  118. psitre = (reg40 & 0x4000) ? 1 : 0;
  119. ssitre = (reg42 & 0x4000) ? 1 : 0;
  120. /*
  121.  * at that point bibma+0x2 et bibma+0xa are byte registers
  122.  * to investigate:
  123.  */
  124. c0 = inb_p((unsigned short)bibma + 0x02);
  125. c1 = inb_p((unsigned short)bibma + 0x0a);
  126. p += sprintf(p, "--------------- Primary Channel ---------------- Secondary Channel -------------n");
  127. p += sprintf(p, "                %sabled                         %sabledn",
  128. (c0&0x80) ? "dis" : " en",
  129. (c1&0x80) ? "dis" : " en");
  130. p += sprintf(p, "--------------- drive0 --------- drive1 -------- drive0 ---------- drive1 ------n");
  131. p += sprintf(p, "DMA enabled:    %s              %s             %s               %sn",
  132. (c0&0x20) ? "yes" : "no ",
  133. (c0&0x40) ? "yes" : "no ",
  134. (c1&0x20) ? "yes" : "no ",
  135. (c1&0x40) ? "yes" : "no " );
  136. p += sprintf(p, "UDMA enabled:   %s              %s             %s               %sn",
  137. (reg48&0x01) ? "yes" : "no ",
  138. (reg48&0x02) ? "yes" : "no ",
  139. (reg48&0x04) ? "yes" : "no ",
  140. (reg48&0x08) ? "yes" : "no " );
  141. p += sprintf(p, "UDMA enabled:   %s                %s               %s                 %sn",
  142. ((reg54&0x11) && (reg55&0x10) && (reg4a&0x01)) ? "5" :
  143. ((reg54&0x11) && (reg4a&0x02)) ? "4" :
  144. ((reg54&0x11) && (reg4a&0x01)) ? "3" :
  145. (reg4a&0x02) ? "2" :
  146. (reg4a&0x01) ? "1" :
  147. (reg4a&0x00) ? "0" : "X",
  148. ((reg54&0x22) && (reg55&0x20) && (reg4a&0x10)) ? "5" :
  149. ((reg54&0x22) && (reg4a&0x20)) ? "4" :
  150. ((reg54&0x22) && (reg4a&0x10)) ? "3" :
  151. (reg4a&0x20) ? "2" :
  152. (reg4a&0x10) ? "1" :
  153. (reg4a&0x00) ? "0" : "X",
  154. ((reg54&0x44) && (reg55&0x40) && (reg4b&0x03)) ? "5" :
  155. ((reg54&0x44) && (reg4b&0x02)) ? "4" :
  156. ((reg54&0x44) && (reg4b&0x01)) ? "3" :
  157. (reg4b&0x02) ? "2" :
  158. (reg4b&0x01) ? "1" :
  159. (reg4b&0x00) ? "0" : "X",
  160. ((reg54&0x88) && (reg55&0x80) && (reg4b&0x30)) ? "5" :
  161. ((reg54&0x88) && (reg4b&0x20)) ? "4" :
  162. ((reg54&0x88) && (reg4b&0x10)) ? "3" :
  163. (reg4b&0x20) ? "2" :
  164. (reg4b&0x10) ? "1" :
  165. (reg4b&0x00) ? "0" : "X");
  166. p += sprintf(p, "UDMAn");
  167. p += sprintf(p, "DMAn");
  168. p += sprintf(p, "PIOn");
  169. /*
  170.  * FIXME.... Add configuration junk data....blah blah......
  171.  */
  172. return p-buffer;  /* => must be less than 4k! */
  173. }
  174. #endif  /* defined(DISPLAY_PIIX_TIMINGS) && defined(CONFIG_PROC_FS) */
  175. /*
  176.  *  Used to set Fifo configuration via kernel command line:
  177.  */
  178. byte piix_proc = 0;
  179. extern char *ide_xfer_verbose (byte xfer_rate);
  180. #if defined(CONFIG_BLK_DEV_IDEDMA) && defined(CONFIG_PIIX_TUNING)
  181. /*
  182.  *
  183.  */
  184. static byte piix_dma_2_pio (byte xfer_rate) {
  185. switch(xfer_rate) {
  186. case XFER_UDMA_5:
  187. case XFER_UDMA_4:
  188. case XFER_UDMA_3:
  189. case XFER_UDMA_2:
  190. case XFER_UDMA_1:
  191. case XFER_UDMA_0:
  192. case XFER_MW_DMA_2:
  193. case XFER_PIO_4:
  194. return 4;
  195. case XFER_MW_DMA_1:
  196. case XFER_PIO_3:
  197. return 3;
  198. case XFER_SW_DMA_2:
  199. case XFER_PIO_2:
  200. return 2;
  201. case XFER_MW_DMA_0:
  202. case XFER_SW_DMA_1:
  203. case XFER_SW_DMA_0:
  204. case XFER_PIO_1:
  205. case XFER_PIO_0:
  206. case XFER_PIO_SLOW:
  207. default:
  208. return 0;
  209. }
  210. }
  211. #endif /* defined(CONFIG_BLK_DEV_IDEDMA) && (CONFIG_PIIX_TUNING) */
  212. /*
  213.  *  Based on settings done by AMI BIOS
  214.  *  (might be useful if drive is not registered in CMOS for any reason).
  215.  */
  216. static void piix_tune_drive (ide_drive_t *drive, byte pio)
  217. {
  218. unsigned long flags;
  219. u16 master_data;
  220. byte slave_data;
  221. int is_slave = (&HWIF(drive)->drives[1] == drive);
  222. int master_port = HWIF(drive)->index ? 0x42 : 0x40;
  223. int slave_port = 0x44;
  224.  /* ISP  RTC */
  225. byte timings[][2] = { { 0, 0 },
  226.     { 0, 0 },
  227.     { 1, 0 },
  228.     { 2, 1 },
  229.     { 2, 3 }, };
  230. pio = ide_get_best_pio_mode(drive, pio, 5, NULL);
  231. pci_read_config_word(HWIF(drive)->pci_dev, master_port, &master_data);
  232. if (is_slave) {
  233. master_data = master_data | 0x4000;
  234. if (pio > 1)
  235. /* enable PPE, IE and TIME */
  236. master_data = master_data | 0x0070;
  237. pci_read_config_byte(HWIF(drive)->pci_dev, slave_port, &slave_data);
  238. slave_data = slave_data & (HWIF(drive)->index ? 0x0f : 0xf0);
  239. slave_data = slave_data | ((timings[pio][0] << 2) | (timings[pio][1]
  240.    << (HWIF(drive)->index ? 4 : 0)));
  241. } else {
  242. master_data = master_data & 0xccf8;
  243. if (pio > 1)
  244. /* enable PPE, IE and TIME */
  245. master_data = master_data | 0x0007;
  246. master_data = master_data | (timings[pio][0] << 12) |
  247.       (timings[pio][1] << 8);
  248. }
  249. save_flags(flags);
  250. cli();
  251. pci_write_config_word(HWIF(drive)->pci_dev, master_port, master_data);
  252. if (is_slave)
  253. pci_write_config_byte(HWIF(drive)->pci_dev, slave_port, slave_data);
  254. restore_flags(flags);
  255. }
  256. #if defined(CONFIG_BLK_DEV_IDEDMA) && defined(CONFIG_PIIX_TUNING)
  257. static int piix_tune_chipset (ide_drive_t *drive, byte speed)
  258. {
  259. ide_hwif_t *hwif = HWIF(drive);
  260. struct pci_dev *dev = hwif->pci_dev;
  261. byte maslave = hwif->channel ? 0x42 : 0x40;
  262. int a_speed = 3 << (drive->dn * 4);
  263. int u_flag = 1 << drive->dn;
  264. int v_flag = 0x01 << drive->dn;
  265. int w_flag = 0x10 << drive->dn;
  266. int u_speed = 0;
  267. int err = 0;
  268. int sitre;
  269. short reg4042, reg44, reg48, reg4a, reg54;
  270. byte reg55;
  271. pci_read_config_word(dev, maslave, &reg4042);
  272. sitre = (reg4042 & 0x4000) ? 1 : 0;
  273. pci_read_config_word(dev, 0x44, &reg44);
  274. pci_read_config_word(dev, 0x48, &reg48);
  275. pci_read_config_word(dev, 0x4a, &reg4a);
  276. pci_read_config_word(dev, 0x54, &reg54);
  277. pci_read_config_byte(dev, 0x55, &reg55);
  278. switch(speed) {
  279. case XFER_UDMA_4:
  280. case XFER_UDMA_2: u_speed = 2 << (drive->dn * 4); break;
  281. case XFER_UDMA_5:
  282. case XFER_UDMA_3:
  283. case XFER_UDMA_1: u_speed = 1 << (drive->dn * 4); break;
  284. case XFER_UDMA_0: u_speed = 0 << (drive->dn * 4); break;
  285. case XFER_MW_DMA_2:
  286. case XFER_MW_DMA_1:
  287. case XFER_SW_DMA_2: break;
  288. default: return -1;
  289. }
  290. if (speed >= XFER_UDMA_0) {
  291. if (!(reg48 & u_flag))
  292. pci_write_config_word(dev, 0x48, reg48|u_flag);
  293. if (speed == XFER_UDMA_5) {
  294. pci_write_config_byte(dev, 0x55, (byte) reg55|w_flag);
  295. } else {
  296. pci_write_config_byte(dev, 0x55, (byte) reg55 & ~w_flag);
  297. }
  298. if (!(reg4a & u_speed)) {
  299. pci_write_config_word(dev, 0x4a, reg4a & ~a_speed);
  300. pci_write_config_word(dev, 0x4a, reg4a|u_speed);
  301. }
  302. if (speed > XFER_UDMA_2) {
  303. if (!(reg54 & v_flag)) {
  304. pci_write_config_word(dev, 0x54, reg54|v_flag);
  305. }
  306. } else {
  307. pci_write_config_word(dev, 0x54, reg54 & ~v_flag);
  308. }
  309. }
  310. if (speed < XFER_UDMA_0) {
  311. if (reg48 & u_flag)
  312. pci_write_config_word(dev, 0x48, reg48 & ~u_flag);
  313. if (reg4a & a_speed)
  314. pci_write_config_word(dev, 0x4a, reg4a & ~a_speed);
  315. if (reg54 & v_flag)
  316. pci_write_config_word(dev, 0x54, reg54 & ~v_flag);
  317. if (reg55 & w_flag)
  318. pci_write_config_byte(dev, 0x55, (byte) reg55 & ~w_flag);
  319. }
  320. piix_tune_drive(drive, piix_dma_2_pio(speed));
  321. #if PIIX_DEBUG_DRIVE_INFO
  322. printk("%s: %s drive%dn", drive->name, ide_xfer_verbose(speed), drive->dn);
  323. #endif /* PIIX_DEBUG_DRIVE_INFO */
  324. if (!drive->init_speed)
  325. drive->init_speed = speed;
  326. err = ide_config_drive_speed(drive, speed);
  327. drive->current_speed = speed;
  328. return err;
  329. }
  330. static int piix_config_drive_for_dma (ide_drive_t *drive)
  331. {
  332. struct hd_driveid *id = drive->id;
  333. ide_hwif_t *hwif = HWIF(drive);
  334. struct pci_dev *dev = hwif->pci_dev;
  335. byte speed;
  336. byte udma_66 = eighty_ninty_three(drive);
  337. int ultra100 = ((dev->device == PCI_DEVICE_ID_INTEL_82801BA_8) ||
  338.    (dev->device == PCI_DEVICE_ID_INTEL_82801BA_9) ||
  339.    (dev->device == PCI_DEVICE_ID_INTEL_82801CA_10)) ? 1 : 0;
  340. int ultra66 = ((ultra100) ||
  341.    (dev->device == PCI_DEVICE_ID_INTEL_82801AA_1) ||
  342.    (dev->device == PCI_DEVICE_ID_INTEL_82372FB_1)) ? 1 : 0;
  343. int ultra = ((ultra66) ||
  344.    (dev->device == PCI_DEVICE_ID_INTEL_82371AB) ||
  345.    (dev->device == PCI_DEVICE_ID_INTEL_82443MX_1) ||
  346.    (dev->device == PCI_DEVICE_ID_INTEL_82451NX) ||
  347.    (dev->device == PCI_DEVICE_ID_INTEL_82801AB_1)) ? 1 : 0;
  348. if ((id->dma_ultra & 0x0020) && (udma_66) && (ultra100)) {
  349. speed = XFER_UDMA_5;
  350. } else if ((id->dma_ultra & 0x0010) && (ultra)) {
  351. speed = ((udma_66) && (ultra66)) ? XFER_UDMA_4 : XFER_UDMA_2;
  352. } else if ((id->dma_ultra & 0x0008) && (ultra)) {
  353. speed = ((udma_66) && (ultra66)) ? XFER_UDMA_3 : XFER_UDMA_1;
  354. } else if ((id->dma_ultra & 0x0004) && (ultra)) {
  355. speed = XFER_UDMA_2;
  356. } else if ((id->dma_ultra & 0x0002) && (ultra)) {
  357. speed = XFER_UDMA_1;
  358. } else if ((id->dma_ultra & 0x0001) && (ultra)) {
  359. speed = XFER_UDMA_0;
  360. } else if (id->dma_mword & 0x0004) {
  361. speed = XFER_MW_DMA_2;
  362. } else if (id->dma_mword & 0x0002) {
  363. speed = XFER_MW_DMA_1;
  364. } else if (id->dma_1word & 0x0004) {
  365. speed = XFER_SW_DMA_2;
  366.         } else {
  367. speed = XFER_PIO_0 + ide_get_best_pio_mode(drive, 255, 5, NULL);
  368. }
  369. (void) piix_tune_chipset(drive, speed);
  370. return ((int) ((id->dma_ultra >> 11) & 7) ? ide_dma_on :
  371. ((id->dma_ultra >> 8) & 7) ? ide_dma_on :
  372. ((id->dma_mword >> 8) & 7) ? ide_dma_on :
  373. ((id->dma_1word >> 8) & 7) ? ide_dma_on :
  374.      ide_dma_off_quietly);
  375. }
  376. static void config_chipset_for_pio (ide_drive_t *drive)
  377. {
  378. piix_tune_drive(drive, ide_get_best_pio_mode(drive, 255, 5, NULL));
  379. }
  380. static int config_drive_xfer_rate (ide_drive_t *drive)
  381. {
  382. struct hd_driveid *id = drive->id;
  383. ide_dma_action_t dma_func = ide_dma_on;
  384. if (id && (id->capability & 1) && HWIF(drive)->autodma) {
  385. /* Consult the list of known "bad" drives */
  386. if (ide_dmaproc(ide_dma_bad_drive, drive)) {
  387. dma_func = ide_dma_off;
  388. goto fast_ata_pio;
  389. }
  390. dma_func = ide_dma_off_quietly;
  391. if (id->field_valid & 4) {
  392. if (id->dma_ultra & 0x002F) {
  393. /* Force if Capable UltraDMA */
  394. dma_func = piix_config_drive_for_dma(drive);
  395. if ((id->field_valid & 2) &&
  396.     (dma_func != ide_dma_on))
  397. goto try_dma_modes;
  398. }
  399. } else if (id->field_valid & 2) {
  400. try_dma_modes:
  401. if ((id->dma_mword & 0x0007) ||
  402.     (id->dma_1word & 0x007)) {
  403. /* Force if Capable regular DMA modes */
  404. dma_func = piix_config_drive_for_dma(drive);
  405. if (dma_func != ide_dma_on)
  406. goto no_dma_set;
  407. }
  408. } else if (ide_dmaproc(ide_dma_good_drive, drive)) {
  409. if (id->eide_dma_time > 150) {
  410. goto no_dma_set;
  411. }
  412. /* Consult the list of known "good" drives */
  413. dma_func = piix_config_drive_for_dma(drive);
  414. if (dma_func != ide_dma_on)
  415. goto no_dma_set;
  416. } else {
  417. goto fast_ata_pio;
  418. }
  419. } else if ((id->capability & 8) || (id->field_valid & 2)) {
  420. fast_ata_pio:
  421. dma_func = ide_dma_off_quietly;
  422. no_dma_set:
  423. config_chipset_for_pio(drive);
  424. }
  425. return HWIF(drive)->dmaproc(dma_func, drive);
  426. }
  427. static int piix_dmaproc(ide_dma_action_t func, ide_drive_t *drive)
  428. {
  429. switch (func) {
  430. case ide_dma_check:
  431. return config_drive_xfer_rate(drive);
  432. default :
  433. break;
  434. }
  435. /* Other cases are done by generic IDE-DMA code. */
  436. return ide_dmaproc(func, drive);
  437. }
  438. #endif /* defined(CONFIG_BLK_DEV_IDEDMA) && (CONFIG_PIIX_TUNING) */
  439. unsigned int __init pci_init_piix (struct pci_dev *dev, const char *name)
  440. {
  441. #if defined(DISPLAY_PIIX_TIMINGS) && defined(CONFIG_PROC_FS)
  442. if (!piix_proc) {
  443. piix_proc = 1;
  444. bmide_dev = dev;
  445. piix_display_info = &piix_get_info;
  446. }
  447. #endif /* DISPLAY_PIIX_TIMINGS && CONFIG_PROC_FS */
  448. return 0;
  449. }
  450. /*
  451.  * Sheesh, someone at Intel needs to go read the ATA-4/5 T13 standards.
  452.  * It does not specify device detection, but channel!!!
  453.  * You determine later if bit 13 of word93 is set...
  454.  */
  455. unsigned int __init ata66_piix (ide_hwif_t *hwif)
  456. {
  457. byte reg54h = 0, reg55h = 0, ata66 = 0;
  458. byte mask = hwif->channel ? 0xc0 : 0x30;
  459. pci_read_config_byte(hwif->pci_dev, 0x54, &reg54h);
  460. pci_read_config_byte(hwif->pci_dev, 0x55, &reg55h);
  461. ata66 = (reg54h & mask) ? 1 : 0;
  462. return ata66;
  463. }
  464. void __init ide_init_piix (ide_hwif_t *hwif)
  465. {
  466. #ifndef CONFIG_IA64
  467. if (!hwif->irq)
  468. hwif->irq = hwif->channel ? 15 : 14;
  469. #endif /* CONFIG_IA64 */
  470. if (hwif->pci_dev->device == PCI_DEVICE_ID_INTEL_82371MX) {
  471. /* This is a painful system best to let it self tune for now */
  472. return;
  473. }
  474. hwif->tuneproc = &piix_tune_drive;
  475. hwif->drives[0].autotune = 1;
  476. hwif->drives[1].autotune = 1;
  477. if (!hwif->dma_base)
  478. return;
  479. #ifndef CONFIG_BLK_DEV_IDEDMA
  480. hwif->autodma = 0;
  481. #else /* CONFIG_BLK_DEV_IDEDMA */
  482. #ifdef CONFIG_PIIX_TUNING
  483. if (!noautodma)
  484. hwif->autodma = 1;
  485. hwif->dmaproc = &piix_dmaproc;
  486. hwif->speedproc = &piix_tune_chipset;
  487. #endif /* CONFIG_PIIX_TUNING */
  488. #endif /* !CONFIG_BLK_DEV_IDEDMA */
  489. }