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

Linux/Unix编程

开发平台:

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