2 * linux/drivers/block/piix.c Version 0.23 May 29, 1999
4 * Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer
5 * Copyright (C) 1998-1999 Andre Hedrick, Author and Maintainer
7 * PIO mode setting function for Intel chipsets.
8 * For use instead of BIOS settings.
16 * | PIO 0 | c0 | 80 | 0 | piix_tune_drive(drive, 0);
17 * | PIO 2 | SW2 | d0 | 90 | 4 | piix_tune_drive(drive, 2);
18 * | PIO 3 | MW1 | e1 | a1 | 9 | piix_tune_drive(drive, 3);
19 * | PIO 4 | MW2 | e3 | a3 | b | piix_tune_drive(drive, 4);
21 * sitre = word40 & 0x4000; primary
22 * sitre = word42 & 0x4000; secondary
24 * 44 8421|8421 hdd|hdb
26 * 48 8421 hdd|hdc|hdb|hda udma enabled
41 * pci_read_config_word(HWIF(drive)->pci_dev, 0x40, ®40);
42 * pci_read_config_word(HWIF(drive)->pci_dev, 0x42, ®42);
43 * pci_read_config_word(HWIF(drive)->pci_dev, 0x44, ®44);
44 * pci_read_config_word(HWIF(drive)->pci_dev, 0x48, ®48);
45 * pci_read_config_word(HWIF(drive)->pci_dev, 0x4a, ®4a);
49 #include <linux/types.h>
50 #include <linux/kernel.h>
51 #include <linux/ioport.h>
52 #include <linux/pci.h>
53 #include <linux/hdreg.h>
54 #include <linux/ide.h>
56 #include <asm/delay.h>
59 #include "ide_modes.h"
61 #define PIIX_DEBUG_DRIVE_INFO 0
63 extern char *ide_xfer_verbose (byte xfer_rate
);
68 static byte
piix_dma_2_pio (byte xfer_rate
) {
96 * Based on settings done by AMI BIOS
97 * (might be usefull if drive is not registered in CMOS for any reason).
99 static void piix_tune_drive (ide_drive_t
*drive
, byte pio
)
104 int is_slave
= (&HWIF(drive
)->drives
[1] == drive
);
105 int master_port
= HWIF(drive
)->index
? 0x42 : 0x40;
106 int slave_port
= 0x44;
108 byte timings
[][2] = { { 0, 0 },
115 pio
= ide_get_best_pio_mode(drive
, pio
, 5, NULL
);
117 pio
= ide_get_best_pio_mode(drive
, pio
, 4, NULL
);
119 pci_read_config_word(HWIF(drive
)->pci_dev
, master_port
, &master_data
);
121 master_data
= master_data
| 0x4000;
123 /* enable PPE, IE and TIME */
124 master_data
= master_data
| 0x0070;
125 pci_read_config_byte(HWIF(drive
)->pci_dev
, slave_port
, &slave_data
);
126 slave_data
= slave_data
& (HWIF(drive
)->index
? 0x0f : 0xf0);
127 slave_data
= slave_data
| ((timings
[pio
][0] << 2) | (timings
[pio
][1]
128 << (HWIF(drive
)->index
? 4 : 0)));
130 master_data
= master_data
& 0xccf8;
132 /* enable PPE, IE and TIME */
133 master_data
= master_data
| 0x0007;
134 master_data
= master_data
| (timings
[pio
][0] << 12) |
135 (timings
[pio
][1] << 8);
139 pci_write_config_word(HWIF(drive
)->pci_dev
, master_port
, master_data
);
141 pci_write_config_byte(HWIF(drive
)->pci_dev
, slave_port
, slave_data
);
142 restore_flags(flags
);
145 static int piix_config_drive_for_dma(ide_drive_t
*drive
, int ultra
)
147 struct hd_driveid
*id
= drive
->id
;
148 ide_hwif_t
*hwif
= HWIF(drive
);
149 struct pci_dev
*dev
= hwif
->pci_dev
;
153 short reg4042
, reg44
, reg48
, reg4a
;
156 byte maslave
= hwif
->channel
? 0x42 : 0x40;
157 int drive_number
= ((hwif
->channel
? 2 : 0) + (drive
->select
.b
.unit
& 0x01));
158 int a_speed
= 2 << (drive_number
* 4);
159 int u_flag
= 1 << drive_number
;
161 pci_read_config_word(dev
, maslave
, ®4042
);
162 sitre
= (reg4042
& 0x4000) ? 1 : 0;
163 pci_read_config_word(dev
, 0x44, ®44
);
164 pci_read_config_word(dev
, 0x48, ®48
);
165 pci_read_config_word(dev
, 0x4a, ®4a
);
170 if (id
->dma_ultra
&& (ultra
)) {
171 if (!(reg48
& u_flag
)) {
172 pci_write_config_word(dev
, 0x48, reg48
|u_flag
);
175 if (reg48
& u_flag
) {
176 pci_write_config_word(dev
, 0x48, reg48
& ~u_flag
);
180 if ((id
->dma_ultra
& 0x0004) && (ultra
)) {
181 drive
->id
->dma_mword
&= ~0x0F00;
182 drive
->id
->dma_1word
&= ~0x0F00;
183 if (!((id
->dma_ultra
>> 8) & 4)) {
184 drive
->id
->dma_ultra
&= ~0x0F00;
185 drive
->id
->dma_ultra
|= 0x0404;
187 u_speed
= 2 << (drive_number
* 4);
188 if (!(reg4a
& u_speed
)) {
189 pci_write_config_word(dev
, 0x4a, reg4a
|u_speed
);
192 } else if ((id
->dma_ultra
& 0x0002) && (ultra
)) {
193 drive
->id
->dma_mword
&= ~0x0F00;
194 drive
->id
->dma_1word
&= ~0x0F00;
195 if (!((id
->dma_ultra
>> 8) & 2)) {
196 drive
->id
->dma_ultra
&= ~0x0F00;
197 drive
->id
->dma_ultra
|= 0x0202;
199 u_speed
= 1 << (drive_number
* 4);
200 if (!(reg4a
& u_speed
)) {
201 pci_write_config_word(dev
, 0x4a, reg4a
& ~a_speed
);
202 pci_write_config_word(dev
, 0x4a, reg4a
|u_speed
);
205 } else if ((id
->dma_ultra
& 0x0001) && (ultra
)) {
206 drive
->id
->dma_mword
&= ~0x0F00;
207 drive
->id
->dma_1word
&= ~0x0F00;
208 if (!((id
->dma_ultra
>> 8) & 1)) {
209 drive
->id
->dma_ultra
&= ~0x0F00;
210 drive
->id
->dma_ultra
|= 0x0101;
212 u_speed
= 0 << (drive_number
* 4);
213 if (!(reg4a
& u_speed
)) {
214 pci_write_config_word(dev
, 0x4a, reg4a
& ~a_speed
);
215 pci_write_config_word(dev
, 0x4a, reg4a
|u_speed
);
218 } else if (id
->dma_mword
& 0x0004) {
220 pci_write_config_word(dev
, 0x4a, reg4a
& ~a_speed
);
221 drive
->id
->dma_ultra
&= ~0x0F00;
222 drive
->id
->dma_1word
&= ~0x0F00;
223 if (!((id
->dma_mword
>> 8) & 4)) {
224 drive
->id
->dma_mword
&= ~0x0F00;
225 drive
->id
->dma_mword
|= 0x0404;
227 speed
= XFER_MW_DMA_2
;
228 } else if (id
->dma_mword
& 0x0002) {
230 pci_write_config_word(dev
, 0x4a, reg4a
& ~a_speed
);
231 drive
->id
->dma_ultra
&= ~0x0F00;
232 drive
->id
->dma_1word
&= ~0x0F00;
233 if (!((id
->dma_mword
>> 8) & 2)) {
234 drive
->id
->dma_mword
&= ~0x0F00;
235 drive
->id
->dma_mword
|= 0x0202;
237 speed
= XFER_MW_DMA_1
;
238 } else if (id
->dma_1word
& 0x0004) {
240 pci_write_config_word(dev
, 0x4a, reg4a
& ~a_speed
);
241 drive
->id
->dma_ultra
&= ~0x0F00;
242 drive
->id
->dma_mword
&= ~0x0F00;
243 if (!((id
->dma_1word
>> 8) & 4)) {
244 drive
->id
->dma_1word
&= ~0x0F00;
245 drive
->id
->dma_1word
|= 0x0404;
247 speed
= XFER_SW_DMA_2
;
252 speed
= XFER_PIO_0
+ ide_get_best_pio_mode(drive
, 255, 5, NULL
);
256 restore_flags(flags
);
257 piix_tune_drive(drive
, piix_dma_2_pio(speed
));
259 (void) ide_wait_cmd(drive
, WIN_SETFEATURES
, speed
, SETFEATURES_XFER
, 0, NULL
);
261 #if PIIX_DEBUG_DRIVE_INFO
262 printk("%s: %s drive%d ",
264 ide_xfer_verbose(speed
),
267 #endif /* PIIX_DEBUG_DRIVE_INFO */
269 return ((int) ((id
->dma_ultra
>> 8) & 7) ? ide_dma_on
:
270 ((id
->dma_mword
>> 8) & 7) ? ide_dma_on
:
271 ((id
->dma_1word
>> 8) & 7) ? ide_dma_on
:
272 ide_dma_off_quietly
);
275 static int piix_dmaproc(ide_dma_action_t func
, ide_drive_t
*drive
)
277 int ultra
= (HWIF(drive
)->pci_dev
->device
== PCI_DEVICE_ID_INTEL_82371AB
) ? 1 : 0;
280 return ide_dmaproc((ide_dma_action_t
) piix_config_drive_for_dma(drive
, ultra
), drive
);
284 /* Other cases are done by generic IDE-DMA code. */
285 return ide_dmaproc(func
, drive
);
288 void ide_init_piix (ide_hwif_t
*hwif
)
290 hwif
->tuneproc
= &piix_tune_drive
;
291 if (hwif
->dma_base
) {
292 hwif
->dmaproc
= &piix_dmaproc
;