Blame view

drivers/ide/piix.c 14.1 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
   *  Copyright (C) 1998-1999 Andrzej Krzysztofowicz, Author and Maintainer
   *  Copyright (C) 1998-2000 Andre Hedrick <andre@linux-ide.org>
ccd32e221   Alan Cox   ide: Switch to a ...
4
   *  Copyright (C) 2003 Red Hat
07af42760   Sergei Shtylyov   piix/slc90e66: mo...
5
   *  Copyright (C) 2006-2007 MontaVista Software, Inc. <source@mvista.com>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
6
7
8
   *
   *  May be copied or modified under the terms of the GNU General Public License
   *
2be564b03   Bartlomiej Zolnierkiewicz   piix: remove stal...
9
   * Documentation:
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
   *
25985edce   Lucas De Marchi   Fix common misspe...
11
12
   *	Publicly available from Intel web site. Errata documentation
   * is also publicly available. As an aide to anyone hacking on this
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
   * driver the list of errata that are relevant is below.going back to
   * PIIX4. Older device documentation is now a bit tricky to find.
   *
   * Errata of note:
   *
   * Unfixable
   *	PIIX4    errata #9	- Only on ultra obscure hw
   *	ICH3	 errata #13     - Not observed to affect real hw
   *				  by Intel
   *
   * Things we must deal with
   *	PIIX4	errata #10	- BM IDE hang with non UDMA
   *				  (must stop/start dma to recover)
   *	440MX   errata #15	- As PIIX4 errata #10
   *	PIIX4	errata #15	- Must not read control registers
   * 				  during a PIO transfer
   *	440MX   errata #13	- As PIIX4 errata #15
   *	ICH2	errata #21	- DMA mode 0 doesn't work right
   *	ICH0/1  errata #55	- As ICH2 errata #21
   *	ICH2	spec c #9	- Extra operations needed to handle
   *				  drive hotswap [NOT YET SUPPORTED]
   *	ICH2    spec c #20	- IDE PRD must not cross a 64K boundary
   *				  and must be dword aligned
   *	ICH2    spec c #24	- UDMA mode 4,5 t85/86 should be 6ns not 3.3
   *
   * Should have been BIOS fixed:
   *	450NX:	errata #19	- DMA hangs on old 450NX
   *	450NX:  errata #20	- DMA hangs on old 450NX
   *	450NX:  errata #25	- Corruption with DMA on old 450NX
   *	ICH3    errata #15      - IDE deadlock under high load
   *				  (BIOS must set dev 31 fn 0 bit 23)
   *	ICH3	errata #18	- Don't use native mode
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46
47
48
  #include <linux/types.h>
  #include <linux/module.h>
  #include <linux/kernel.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
49
  #include <linux/pci.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
50
  #include <linux/ide.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
51
52
53
  #include <linux/init.h>
  
  #include <asm/io.h>
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
54
  #define DRV_NAME "piix"
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
55
56
57
  static int no_piix_dma;
  
  /**
88b2b32ba   Bartlomiej Zolnierkiewicz   ide: move ide_con...
58
   *	piix_set_pio_mode	-	set host controller for PIO mode
e085b3cae   Bartlomiej Zolnierkiewicz   ide: change ->set...
59
   *	@port: port
88b2b32ba   Bartlomiej Zolnierkiewicz   ide: move ide_con...
60
   *	@drive: drive
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
61
   *
07af42760   Sergei Shtylyov   piix/slc90e66: mo...
62
   *	Set the interface PIO mode based upon the settings done by AMI BIOS.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
63
   */
88b2b32ba   Bartlomiej Zolnierkiewicz   ide: move ide_con...
64

e085b3cae   Bartlomiej Zolnierkiewicz   ide: change ->set...
65
  static void piix_set_pio_mode(ide_hwif_t *hwif, ide_drive_t *drive)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
  {
36501650e   Bartlomiej Zolnierkiewicz   ide: keep pointer...
67
  	struct pci_dev *dev	= to_pci_dev(hwif->dev);
30dfd12f5   Sergei Shtylyov   piix: tuneproc() ...
68
  	int is_slave		= drive->dn & 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
69
70
71
72
73
  	int master_port		= hwif->channel ? 0x42 : 0x40;
  	int slave_port		= 0x44;
  	unsigned long flags;
  	u16 master_data;
  	u8 slave_data;
4fb0f76d8   Alan Cox   [PATCH] Fix IDE l...
74
  	static DEFINE_SPINLOCK(tune_lock);
5ac246976   Alan Cox   [PATCH] ide: back...
75
  	int control = 0;
e085b3cae   Bartlomiej Zolnierkiewicz   ide: change ->set...
76
  	const u8 pio = drive->pio_mode - XFER_PIO_0;
4fb0f76d8   Alan Cox   [PATCH] Fix IDE l...
77

30dfd12f5   Sergei Shtylyov   piix: tuneproc() ...
78
  				     /* ISP  RTC */
5ac246976   Alan Cox   [PATCH] ide: back...
79
80
81
82
83
84
  	static const u8 timings[][2]= {
  					{ 0, 0 },
  					{ 0, 0 },
  					{ 1, 0 },
  					{ 2, 1 },
  					{ 2, 3 }, };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85

4fb0f76d8   Alan Cox   [PATCH] Fix IDE l...
86
87
88
89
90
91
  	/*
  	 * Master vs slave is synchronized above us but the slave register is
  	 * shared by the two hwifs so the corner case of two slave timeouts in
  	 * parallel must be locked.
  	 */
  	spin_lock_irqsave(&tune_lock, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
  	pci_read_config_word(dev, master_port, &master_data);
5ac246976   Alan Cox   [PATCH] ide: back...
93

30dfd12f5   Sergei Shtylyov   piix: tuneproc() ...
94
  	if (pio > 1)
5ac246976   Alan Cox   [PATCH] ide: back...
95
96
97
  		control |= 1;	/* Programmable timing on */
  	if (drive->media == ide_disk)
  		control |= 4;	/* Prefetch, post write */
c9ef59ff0   Bartlomiej Zolnierkiewicz   ide: IORDY handli...
98
  	if (ide_pio_need_iordy(drive, pio))
5ac246976   Alan Cox   [PATCH] ide: back...
99
  		control |= 2;	/* IORDY */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
100
  	if (is_slave) {
30dfd12f5   Sergei Shtylyov   piix: tuneproc() ...
101
102
  		master_data |=  0x4000;
  		master_data &= ~0x0070;
5ac246976   Alan Cox   [PATCH] ide: back...
103
  		if (pio > 1) {
07af42760   Sergei Shtylyov   piix/slc90e66: mo...
104
105
  			/* Set PPE, IE and TIME */
  			master_data |= control << 4;
5ac246976   Alan Cox   [PATCH] ide: back...
106
  		}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
107
  		pci_read_config_byte(dev, slave_port, &slave_data);
07af42760   Sergei Shtylyov   piix/slc90e66: mo...
108
109
110
  		slave_data &= hwif->channel ? 0x0f : 0xf0;
  		slave_data |= ((timings[pio][0] << 2) | timings[pio][1]) <<
  			       (hwif->channel ? 4 : 0);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
111
  	} else {
30dfd12f5   Sergei Shtylyov   piix: tuneproc() ...
112
  		master_data &= ~0x3307;
5ac246976   Alan Cox   [PATCH] ide: back...
113
  		if (pio > 1) {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
114
  			/* enable PPE, IE and TIME */
07af42760   Sergei Shtylyov   piix/slc90e66: mo...
115
  			master_data |= control;
5ac246976   Alan Cox   [PATCH] ide: back...
116
  		}
07af42760   Sergei Shtylyov   piix/slc90e66: mo...
117
  		master_data |= (timings[pio][0] << 12) | (timings[pio][1] << 8);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
119
120
121
  	}
  	pci_write_config_word(dev, master_port, master_data);
  	if (is_slave)
  		pci_write_config_byte(dev, slave_port, slave_data);
4fb0f76d8   Alan Cox   [PATCH] Fix IDE l...
122
  	spin_unlock_irqrestore(&tune_lock, flags);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
123
124
125
  }
  
  /**
88b2b32ba   Bartlomiej Zolnierkiewicz   ide: move ide_con...
126
   *	piix_set_dma_mode	-	set host controller for DMA mode
8776168ca   Bartlomiej Zolnierkiewicz   ide: change ->set...
127
   *	@hwif: port
88b2b32ba   Bartlomiej Zolnierkiewicz   ide: move ide_con...
128
   *	@drive: drive
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
129
   *
88b2b32ba   Bartlomiej Zolnierkiewicz   ide: move ide_con...
130
131
   *	Set a PIIX host controller to the desired DMA mode.  This involves
   *	programming the right timing data into the PCI configuration space.
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
132
   */
f212ff28f   Bartlomiej Zolnierkiewicz   ide: move ide_rat...
133

8776168ca   Bartlomiej Zolnierkiewicz   ide: change ->set...
134
  static void piix_set_dma_mode(ide_hwif_t *hwif, ide_drive_t *drive)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
135
  {
36501650e   Bartlomiej Zolnierkiewicz   ide: keep pointer...
136
  	struct pci_dev *dev	= to_pci_dev(hwif->dev);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
137
  	u8 maslave		= hwif->channel ? 0x42 : 0x40;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
138
139
140
141
142
143
144
  	int a_speed		= 3 << (drive->dn * 4);
  	int u_flag		= 1 << drive->dn;
  	int v_flag		= 0x01 << drive->dn;
  	int w_flag		= 0x10 << drive->dn;
  	int u_speed		= 0;
  	int			sitre;
  	u16			reg4042, reg4a;
1c54a93d4   Bartlomiej Zolnierkiewicz   it8213/piix/slc90...
145
  	u8			reg48, reg54, reg55;
8776168ca   Bartlomiej Zolnierkiewicz   ide: change ->set...
146
  	const u8 speed		= drive->dma_mode;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
147
148
149
150
151
152
153
  
  	pci_read_config_word(dev, maslave, &reg4042);
  	sitre = (reg4042 & 0x4000) ? 1 : 0;
  	pci_read_config_byte(dev, 0x48, &reg48);
  	pci_read_config_word(dev, 0x4a, &reg4a);
  	pci_read_config_byte(dev, 0x54, &reg54);
  	pci_read_config_byte(dev, 0x55, &reg55);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
154
  	if (speed >= XFER_UDMA_0) {
4db90a145   Bartlomiej Zolnierkiewicz   ide: add IDE_HFLA...
155
156
157
  		u8 udma = speed - XFER_UDMA_0;
  
  		u_speed = min_t(u8, 2 - (udma & 1), udma) << (drive->dn * 4);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
  		if (!(reg48 & u_flag))
  			pci_write_config_byte(dev, 0x48, reg48 | u_flag);
  		if (speed == XFER_UDMA_5) {
  			pci_write_config_byte(dev, 0x55, (u8) reg55|w_flag);
  		} else {
  			pci_write_config_byte(dev, 0x55, (u8) reg55 & ~w_flag);
  		}
  		if ((reg4a & a_speed) != u_speed)
  			pci_write_config_word(dev, 0x4a, (reg4a & ~a_speed) | u_speed);
  		if (speed > XFER_UDMA_2) {
  			if (!(reg54 & v_flag))
  				pci_write_config_byte(dev, 0x54, reg54 | v_flag);
  		} else
  			pci_write_config_byte(dev, 0x54, reg54 & ~v_flag);
  	} else {
8c91abf86   Bartlomiej Zolnierkiewicz   it8213/piix/slc90...
173
  		const u8 mwdma_to_pio[] = { 0, 3, 4 };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
174
175
176
177
178
179
180
181
  		if (reg48 & u_flag)
  			pci_write_config_byte(dev, 0x48, reg48 & ~u_flag);
  		if (reg4a & a_speed)
  			pci_write_config_word(dev, 0x4a, reg4a & ~a_speed);
  		if (reg54 & v_flag)
  			pci_write_config_byte(dev, 0x54, reg54 & ~v_flag);
  		if (reg55 & w_flag)
  			pci_write_config_byte(dev, 0x55, (u8) reg55 & ~w_flag);
8c91abf86   Bartlomiej Zolnierkiewicz   it8213/piix/slc90...
182
183
  
  		if (speed >= XFER_MW_DMA_0)
e085b3cae   Bartlomiej Zolnierkiewicz   ide: change ->set...
184
185
  			drive->pio_mode =
  				mwdma_to_pio[speed - XFER_MW_DMA_0] + XFER_PIO_0;
8c91abf86   Bartlomiej Zolnierkiewicz   it8213/piix/slc90...
186
  		else
e085b3cae   Bartlomiej Zolnierkiewicz   ide: change ->set...
187
  			drive->pio_mode = XFER_PIO_2; /* for SWDMA2 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
188

e085b3cae   Bartlomiej Zolnierkiewicz   ide: change ->set...
189
  		piix_set_pio_mode(hwif, drive);
1c54a93d4   Bartlomiej Zolnierkiewicz   it8213/piix/slc90...
190
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
191
192
193
  }
  
  /**
40d2dd7ef   Bartlomiej Zolnierkiewicz   piix: add DECLARE...
194
   *	init_chipset_ich	-	set up the ICH chipset
f0dd8712e   Albert Lee   ide: clear bmdma ...
195
   *	@dev: PCI device to set up
f0dd8712e   Albert Lee   ide: clear bmdma ...
196
   *
40d2dd7ef   Bartlomiej Zolnierkiewicz   piix: add DECLARE...
197
198
   *	Initialize the PCI device as required.  For the ICH this turns
   *	out to be nice and simple.
f0dd8712e   Albert Lee   ide: clear bmdma ...
199
   */
2ed0ef543   Bartlomiej Zolnierkiewicz   ide: fix ->init_c...
200
  static int init_chipset_ich(struct pci_dev *dev)
f0dd8712e   Albert Lee   ide: clear bmdma ...
201
  {
40d2dd7ef   Bartlomiej Zolnierkiewicz   piix: add DECLARE...
202
203
204
205
  	u32 extra = 0;
  
  	pci_read_config_dword(dev, 0x54, &extra);
  	pci_write_config_dword(dev, 0x54, extra | 0x400);
f0dd8712e   Albert Lee   ide: clear bmdma ...
206
207
208
209
210
  
  	return 0;
  }
  
  /**
bfa7d8e55   Bartlomiej Zolnierkiewicz   ide: ->ide_dma_cl...
211
212
   *	ich_clear_irq	-	clear BMDMA status
   *	@drive: IDE drive
f0dd8712e   Albert Lee   ide: clear bmdma ...
213
   *
bfa7d8e55   Bartlomiej Zolnierkiewicz   ide: ->ide_dma_cl...
214
215
216
   *	ICHx contollers set DMA INTR no matter DMA or PIO.
   *	BMDMA status might need to be cleared even for
   *	PIO interrupts to prevent spurious/lost IRQ.
f0dd8712e   Albert Lee   ide: clear bmdma ...
217
   */
bfa7d8e55   Bartlomiej Zolnierkiewicz   ide: ->ide_dma_cl...
218
  static void ich_clear_irq(ide_drive_t *drive)
f0dd8712e   Albert Lee   ide: clear bmdma ...
219
  {
898ec223f   Bartlomiej Zolnierkiewicz   ide: remove HWIF(...
220
  	ide_hwif_t *hwif = drive->hwif;
f0dd8712e   Albert Lee   ide: clear bmdma ...
221
  	u8 dma_stat;
bfa7d8e55   Bartlomiej Zolnierkiewicz   ide: ->ide_dma_cl...
222
223
224
225
226
227
228
  	/*
  	 * ide_dma_end() needs BMDMA status for error checking.
  	 * So, skip clearing BMDMA status here and leave it
  	 * to ide_dma_end() if this is DMA interrupt.
  	 */
  	if (drive->waiting_for_dma || hwif->dma_base == 0)
  		return;
f0dd8712e   Albert Lee   ide: clear bmdma ...
229
  	/* clear the INTR & ERROR bits */
cab7f8eda   Bartlomiej Zolnierkiewicz   ide: remove ->dma...
230
  	dma_stat = inb(hwif->dma_base + ATA_DMA_STATUS);
f0dd8712e   Albert Lee   ide: clear bmdma ...
231
  	/* Should we force the bit as well ? */
cab7f8eda   Bartlomiej Zolnierkiewicz   ide: remove ->dma...
232
  	outb(dma_stat, hwif->dma_base + ATA_DMA_STATUS);
f0dd8712e   Albert Lee   ide: clear bmdma ...
233
  }
7207626f4   Bartlomiej Zolnierkiewicz   piix: backport sh...
234
235
236
237
238
239
240
241
242
243
244
245
  struct ich_laptop {
  	u16 device;
  	u16 subvendor;
  	u16 subdevice;
  };
  
  /*
   *	List of laptops that use short cables rather than 80 wire
   */
  
  static const struct ich_laptop ich_laptop[] = {
  	/* devid, subvendor, subdev */
afda5e4da   sebdeg@ngi.it   piix: add support...
246
  	{ 0x27DF, 0x1025, 0x0102 },	/* ICH7 on Acer 5602aWLMi */
7207626f4   Bartlomiej Zolnierkiewicz   piix: backport sh...
247
248
249
  	{ 0x27DF, 0x0005, 0x0280 },	/* ICH7 on Acer 5602WLMi */
  	{ 0x27DF, 0x1025, 0x0110 },	/* ICH7 on Acer 3682WLMi */
  	{ 0x27DF, 0x1043, 0x1267 },	/* ICH7 on Asus W5F */
dd0fd40d5   Bartlomiej Zolnierkiewicz   piix: add HP comp...
250
  	{ 0x27DF, 0x103C, 0x30A1 },	/* ICH7 on HP Compaq nc2400 */
a8269e542   Herton Ronaldo Krzesinski   piix: add Hercule...
251
  	{ 0x27DF, 0x1071, 0xD221 },	/* ICH7 on Hercules EC-900 */
7207626f4   Bartlomiej Zolnierkiewicz   piix: backport sh...
252
  	{ 0x24CA, 0x1025, 0x0061 },	/* ICH4 on Acer Aspire 2023WLMi */
7ee98034d   Bartlomiej Zolnierkiewicz   piix: sync ich_la...
253
254
  	{ 0x24CA, 0x1025, 0x003d },	/* ICH4 on ACER TM290 */
  	{ 0x266F, 0x1025, 0x0066 },	/* ICH6 on ACER Aspire 1694WLMi */
1fa5a40f2   Bartlomiej Zolnierkiewicz   piix: add Asus Ee...
255
  	{ 0x2653, 0x1043, 0x82D8 },	/* ICH6M on Asus Eee 701 */
d8788298d   Alan Cox   piix: The Sony TZ...
256
  	{ 0x27df, 0x104d, 0x900e },	/* ICH7 on Sony TZ-90 */
7207626f4   Bartlomiej Zolnierkiewicz   piix: backport sh...
257
258
259
  	/* end marker */
  	{ 0, }
  };
f454cbe8c   Bartlomiej Zolnierkiewicz   ide: ->cable_dete...
260
  static u8 piix_cable_detect(ide_hwif_t *hwif)
74594fd14   Bartlomiej Zolnierkiewicz   piix: cleanup
261
  {
36501650e   Bartlomiej Zolnierkiewicz   ide: keep pointer...
262
  	struct pci_dev *pdev = to_pci_dev(hwif->dev);
7207626f4   Bartlomiej Zolnierkiewicz   piix: backport sh...
263
  	const struct ich_laptop *lap = &ich_laptop[0];
74594fd14   Bartlomiej Zolnierkiewicz   piix: cleanup
264
  	u8 reg54h = 0, mask = hwif->channel ? 0xc0 : 0x30;
7207626f4   Bartlomiej Zolnierkiewicz   piix: backport sh...
265
266
267
268
269
270
271
272
273
274
275
  	/* check for specials */
  	while (lap->device) {
  		if (lap->device == pdev->device &&
  		    lap->subvendor == pdev->subsystem_vendor &&
  		    lap->subdevice == pdev->subsystem_device) {
  			return ATA_CBL_PATA40_SHORT;
  		}
  		lap++;
  	}
  
  	pci_read_config_byte(pdev, 0x54, &reg54h);
74594fd14   Bartlomiej Zolnierkiewicz   piix: cleanup
276

49521f97c   Bartlomiej Zolnierkiewicz   ide: add short ca...
277
  	return (reg54h & mask) ? ATA_CBL_PATA80 : ATA_CBL_PATA40;
74594fd14   Bartlomiej Zolnierkiewicz   piix: cleanup
278
  }
f0dd8712e   Albert Lee   ide: clear bmdma ...
279
  /**
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
280
281
282
283
284
285
286
287
288
   *	init_hwif_piix		-	fill in the hwif for the PIIX
   *	@hwif: IDE interface
   *
   *	Set up the ide_hwif_t for the PIIX interface according to the
   *	capabilities of the hardware.
   */
  
  static void __devinit init_hwif_piix(ide_hwif_t *hwif)
  {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
289
290
  	if (!hwif->dma_base)
  		return;
74594fd14   Bartlomiej Zolnierkiewicz   piix: cleanup
291
292
  	if (no_piix_dma)
  		hwif->ultra_mask = hwif->mwdma_mask = hwif->swdma_mask = 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
293
  }
ac95beedf   Bartlomiej Zolnierkiewicz   ide: add struct i...
294
295
296
297
298
  static const struct ide_port_ops piix_port_ops = {
  	.set_pio_mode		= piix_set_pio_mode,
  	.set_dma_mode		= piix_set_dma_mode,
  	.cable_detect		= piix_cable_detect,
  };
bfa7d8e55   Bartlomiej Zolnierkiewicz   ide: ->ide_dma_cl...
299
300
301
302
303
304
  static const struct ide_port_ops ich_port_ops = {
  	.set_pio_mode		= piix_set_pio_mode,
  	.set_dma_mode		= piix_set_dma_mode,
  	.clear_irq		= ich_clear_irq,
  	.cable_detect		= piix_cable_detect,
  };
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
305
  #define DECLARE_PIIX_DEV(udma) \
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
306
  	{						\
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
307
  		.name		= DRV_NAME,		\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
308
  		.init_hwif	= init_hwif_piix,	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
309
  		.enablebits	= {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, \
ac95beedf   Bartlomiej Zolnierkiewicz   ide: add struct i...
310
  		.port_ops	= &piix_port_ops,	\
4099d1432   Bartlomiej Zolnierkiewicz   ide: add PIO masks
311
  		.pio_mask	= ATA_PIO4,		\
5f8b6c348   Bartlomiej Zolnierkiewicz   ide: add ->mwdma_...
312
313
  		.swdma_mask	= ATA_SWDMA2_ONLY,	\
  		.mwdma_mask	= ATA_MWDMA12_ONLY,	\
181372072   Bartlomiej Zolnierkiewicz   ide: fix UDMA/MWD...
314
  		.udma_mask	= udma,			\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
315
  	}
dc9c0beec   Bartlomiej Zolnierkiewicz   piix: ICH7 MWDMA1...
316
  #define DECLARE_ICH_DEV(mwdma, udma) \
40d2dd7ef   Bartlomiej Zolnierkiewicz   piix: add DECLARE...
317
  	{ \
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
318
  		.name		= DRV_NAME, \
40d2dd7ef   Bartlomiej Zolnierkiewicz   piix: add DECLARE...
319
  		.init_chipset	= init_chipset_ich, \
bfa7d8e55   Bartlomiej Zolnierkiewicz   ide: ->ide_dma_cl...
320
  		.init_hwif	= init_hwif_piix, \
40d2dd7ef   Bartlomiej Zolnierkiewicz   piix: add DECLARE...
321
  		.enablebits	= {{0x41,0x80,0x80}, {0x43,0x80,0x80}}, \
bfa7d8e55   Bartlomiej Zolnierkiewicz   ide: ->ide_dma_cl...
322
  		.port_ops	= &ich_port_ops, \
40d2dd7ef   Bartlomiej Zolnierkiewicz   piix: add DECLARE...
323
324
  		.pio_mask	= ATA_PIO4, \
  		.swdma_mask	= ATA_SWDMA2_ONLY, \
dc9c0beec   Bartlomiej Zolnierkiewicz   piix: ICH7 MWDMA1...
325
  		.mwdma_mask	= mwdma, \
40d2dd7ef   Bartlomiej Zolnierkiewicz   piix: add DECLARE...
326
327
  		.udma_mask	= udma, \
  	}
856204360   Bartlomiej Zolnierkiewicz   ide: constify str...
328
  static const struct ide_port_info piix_pci_info[] __devinitdata = {
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
329
  	/* 0: MPIIX */
d28722397   Sergei Shtylyov   piix: fix 82371MX...
330
331
332
333
334
  	{	/*
  		 * MPIIX actually has only a single IDE channel mapped to
  		 * the primary or secondary ports depending on the value
  		 * of the bit 14 of the IDETIM register at offset 0x6c
  		 */
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
335
  		.name		= DRV_NAME,
d28722397   Sergei Shtylyov   piix: fix 82371MX...
336
  		.enablebits	= {{0x6d,0xc0,0x80}, {0x6d,0xc0,0xc0}},
2467922a5   Bartlomiej Zolnierkiewicz   ide: remove no lo...
337
  		.host_flags	= IDE_HFLAG_ISA_PORTS | IDE_HFLAG_NO_DMA,
4099d1432   Bartlomiej Zolnierkiewicz   ide: add PIO masks
338
  		.pio_mask	= ATA_PIO4,
3985ee3b4   Bartlomiej Zolnierkiewicz   ide: add IDE_HFLA...
339
  		/* This is a painful system best to let it self tune for now */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
340
  	},
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
341
342
343
344
345
  	/* 1: PIIXa/PIIXb/PIIX3 */
  	DECLARE_PIIX_DEV(0x00), /* no udma */
  	/* 2: PIIX4 */
  	DECLARE_PIIX_DEV(ATA_UDMA2),
  	/* 3: ICH0 */
dc9c0beec   Bartlomiej Zolnierkiewicz   piix: ICH7 MWDMA1...
346
  	DECLARE_ICH_DEV(ATA_MWDMA12_ONLY, ATA_UDMA2),
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
347
  	/* 4: ICH */
dc9c0beec   Bartlomiej Zolnierkiewicz   piix: ICH7 MWDMA1...
348
  	DECLARE_ICH_DEV(ATA_MWDMA12_ONLY, ATA_UDMA4),
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
349
350
  	/* 5: PIIX4 */
  	DECLARE_PIIX_DEV(ATA_UDMA4),
dc9c0beec   Bartlomiej Zolnierkiewicz   piix: ICH7 MWDMA1...
351
352
353
354
  	/* 6: ICH[2-6]/ICH[2-3]M/C-ICH/ICH5-SATA/ESB2/ICH8M */
  	DECLARE_ICH_DEV(ATA_MWDMA12_ONLY, ATA_UDMA5),
  	/* 7: ICH7/7-R, no MWDMA1 */
  	DECLARE_ICH_DEV(ATA_MWDMA2_ONLY, ATA_UDMA5),
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
355
356
357
358
359
360
361
362
363
364
365
366
367
  };
  
  /**
   *	piix_init_one	-	called when a PIIX is found
   *	@dev: the piix device
   *	@id: the matching pci id
   *
   *	Called when the PCI registration layer (or the IDE initialization)
   *	finds a device matching our IDE device tables.
   */
   
  static int __devinit piix_init_one(struct pci_dev *dev, const struct pci_device_id *id)
  {
6cdf6eb35   Bartlomiej Zolnierkiewicz   ide: add ->dev an...
368
  	return ide_pci_init_one(dev, &piix_pci_info[id->driver_data], NULL);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
369
370
371
372
373
374
375
376
377
378
379
380
381
  }
  
  /**
   *	piix_check_450nx	-	Check for problem 450NX setup
   *	
   *	Check for the present of 450NX errata #19 and errata #25. If
   *	they are found, disable use of DMA IDE
   */
  
  static void __devinit piix_check_450nx(void)
  {
  	struct pci_dev *pdev = NULL;
  	u16 cfg;
1424e5044   Alan Cox   [PATCH] piix: Use...
382
  	while((pdev=pci_get_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454NX, pdev))!=NULL)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
383
384
385
  	{
  		/* Look for 450NX PXB. Check for problem configurations
  		   A PCI quirk checks bit 6 already */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
386
387
  		pci_read_config_word(pdev, 0x41, &cfg);
  		/* Only on the original revision: IDE DMA can hang */
44c10138f   Auke Kok   PCI: Change all d...
388
  		if (pdev->revision == 0x00)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
389
390
  			no_piix_dma = 1;
  		/* On all revisions below 5 PXB bus lock must be disabled for IDE */
44c10138f   Auke Kok   PCI: Change all d...
391
  		else if (cfg & (1<<14) && pdev->revision < 5)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
392
393
394
  			no_piix_dma = 2;
  	}
  	if(no_piix_dma)
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
395
396
  		printk(KERN_WARNING DRV_NAME ": 450NX errata present, disabling IDE DMA.
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
397
  	if(no_piix_dma == 2)
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
398
399
  		printk(KERN_WARNING DRV_NAME ": A BIOS update may resolve this.
  ");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
400
  }		
9cbcc5e3c   Bartlomiej Zolnierkiewicz   ide: use PCI_VDEV...
401
  static const struct pci_device_id piix_pci_tbl[] = {
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82371FB_0),  1 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82371FB_1),  1 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82371MX),    0 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82371SB_1),  1 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82371AB),    2 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82801AB_1),  3 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82443MX_1),  2 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82801AA_1),  4 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82372FB_1),  5 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82451NX),    2 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82801BA_9),  6 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82801BA_8),  6 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82801CA_10), 6 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82801CA_11), 6 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82801DB_11), 6 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82801EB_11), 6 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82801E_11),  6 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82801DB_10), 6 },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
420
  #ifdef CONFIG_BLK_DEV_IDE_SATA
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
421
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82801EB_1),  6 },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
422
  #endif
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
423
424
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ESB_2),      6 },
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ICH6_19),    6 },
dc9c0beec   Bartlomiej Zolnierkiewicz   piix: ICH7 MWDMA1...
425
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ICH7_21),    7 },
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
426
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_82801DB_1),  6 },
dc9c0beec   Bartlomiej Zolnierkiewicz   piix: ICH7 MWDMA1...
427
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ESB2_18),    7 },
ced3ec8aa   Bartlomiej Zolnierkiewicz   ide: prefix messa...
428
  	{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ICH8_6),     6 },
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
429
430
431
  	{ 0, },
  };
  MODULE_DEVICE_TABLE(pci, piix_pci_tbl);
a9ab09e26   Bartlomiej Zolnierkiewicz   ide: use unique n...
432
  static struct pci_driver piix_pci_driver = {
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
433
434
435
  	.name		= "PIIX_IDE",
  	.id_table	= piix_pci_tbl,
  	.probe		= piix_init_one,
da8c3e0d2   Bartlomiej Zolnierkiewicz   piix: add ->remov...
436
  	.remove		= ide_pci_remove,
feb22b7f8   Bartlomiej Zolnierkiewicz   ide: add proper P...
437
438
  	.suspend	= ide_pci_suspend,
  	.resume		= ide_pci_resume,
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
439
440
441
442
443
  };
  
  static int __init piix_ide_init(void)
  {
  	piix_check_450nx();
a9ab09e26   Bartlomiej Zolnierkiewicz   ide: use unique n...
444
  	return ide_pci_register_driver(&piix_pci_driver);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
445
  }
da8c3e0d2   Bartlomiej Zolnierkiewicz   piix: add ->remov...
446
447
  static void __exit piix_ide_exit(void)
  {
a9ab09e26   Bartlomiej Zolnierkiewicz   ide: use unique n...
448
  	pci_unregister_driver(&piix_pci_driver);
da8c3e0d2   Bartlomiej Zolnierkiewicz   piix: add ->remov...
449
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
450
  module_init(piix_ide_init);
da8c3e0d2   Bartlomiej Zolnierkiewicz   piix: add ->remov...
451
  module_exit(piix_ide_exit);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
452
453
454
455
  
  MODULE_AUTHOR("Andre Hedrick, Andrzej Krzysztofowicz");
  MODULE_DESCRIPTION("PCI driver module for Intel PIIX IDE");
  MODULE_LICENSE("GPL");