xref: /netbsd-src/sys/dev/pci/piixide.c (revision c0179c282a5968435315a82f4128c61372c68fc3)
1 /*	$NetBSD: piixide.c,v 1.34 2006/11/24 22:04:25 wiz Exp $	*/
2 
3 /*
4  * Copyright (c) 1999, 2000, 2001 Manuel Bouyer.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. All advertising materials mentioning features or use of this software
15  *    must display the following acknowledgement:
16  *	This product includes software developed by Manuel Bouyer.
17  * 4. The name of the author may not be used to endorse or promote products
18  *    derived from this software without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #include <sys/cdefs.h>
33 __KERNEL_RCSID(0, "$NetBSD: piixide.c,v 1.34 2006/11/24 22:04:25 wiz Exp $");
34 
35 #include <sys/param.h>
36 #include <sys/systm.h>
37 
38 #include <dev/pci/pcivar.h>
39 #include <dev/pci/pcidevs.h>
40 #include <dev/pci/pciidereg.h>
41 #include <dev/pci/pciidevar.h>
42 #include <dev/pci/pciide_piix_reg.h>
43 
44 static void piix_chip_map(struct pciide_softc*, struct pci_attach_args *);
45 static void piix_setup_channel(struct ata_channel *);
46 static void piix3_4_setup_channel(struct ata_channel *);
47 static u_int32_t piix_setup_idetim_timings(u_int8_t, u_int8_t, u_int8_t);
48 static u_int32_t piix_setup_idetim_drvs(struct ata_drive_datas *);
49 static u_int32_t piix_setup_sidetim_timings(u_int8_t, u_int8_t, u_int8_t);
50 static void piixsata_chip_map(struct pciide_softc*, struct pci_attach_args *);
51 
52 static void piixide_powerhook(int, void *);
53 static int  piixide_match(struct device *, struct cfdata *, void *);
54 static void piixide_attach(struct device *, struct device *, void *);
55 
56 static const struct pciide_product_desc pciide_intel_products[] =  {
57 	{ PCI_PRODUCT_INTEL_82092AA,
58 	  0,
59 	  "Intel 82092AA IDE controller",
60 	  default_chip_map,
61 	},
62 	{ PCI_PRODUCT_INTEL_82371FB_IDE,
63 	  0,
64 	  "Intel 82371FB IDE controller (PIIX)",
65 	  piix_chip_map,
66 	},
67 	{ PCI_PRODUCT_INTEL_82371SB_IDE,
68 	  0,
69 	  "Intel 82371SB IDE Interface (PIIX3)",
70 	  piix_chip_map,
71 	},
72 	{ PCI_PRODUCT_INTEL_82371AB_IDE,
73 	  0,
74 	  "Intel 82371AB IDE controller (PIIX4)",
75 	  piix_chip_map,
76 	},
77 	{ PCI_PRODUCT_INTEL_82440MX_IDE,
78 	  0,
79 	  "Intel 82440MX IDE controller",
80 	  piix_chip_map
81 	},
82 	{ PCI_PRODUCT_INTEL_82801AA_IDE,
83 	  0,
84 	  "Intel 82801AA IDE Controller (ICH)",
85 	  piix_chip_map,
86 	},
87 	{ PCI_PRODUCT_INTEL_82801AB_IDE,
88 	  0,
89 	  "Intel 82801AB IDE Controller (ICH0)",
90 	  piix_chip_map,
91 	},
92 	{ PCI_PRODUCT_INTEL_82801BA_IDE,
93 	  0,
94 	  "Intel 82801BA IDE Controller (ICH2)",
95 	  piix_chip_map,
96 	},
97 	{ PCI_PRODUCT_INTEL_82801BAM_IDE,
98 	  0,
99 	  "Intel 82801BAM IDE Controller (ICH2-M)",
100 	  piix_chip_map,
101 	},
102 	{ PCI_PRODUCT_INTEL_82801CA_IDE_1,
103 	  0,
104 	  "Intel 82801CA IDE Controller (ICH3)",
105 	  piix_chip_map,
106 	},
107 	{ PCI_PRODUCT_INTEL_82801CA_IDE_2,
108 	  0,
109 	  "Intel 82801CA IDE Controller (ICH3)",
110 	  piix_chip_map,
111 	},
112 	{ PCI_PRODUCT_INTEL_82801DB_IDE,
113 	  0,
114 	  "Intel 82801DB IDE Controller (ICH4)",
115 	  piix_chip_map,
116 	},
117 	{ PCI_PRODUCT_INTEL_82801DBM_IDE,
118 	  0,
119 	  "Intel 82801DBM IDE Controller (ICH4-M)",
120 	  piix_chip_map,
121 	},
122 	{ PCI_PRODUCT_INTEL_82801EB_IDE,
123 	  0,
124 	  "Intel 82801EB IDE Controller (ICH5)",
125 	  piix_chip_map,
126 	},
127 	{ PCI_PRODUCT_INTEL_82801EB_SATA,
128 	  0,
129 	  "Intel 82801EB Serial ATA Controller",
130 	  piixsata_chip_map,
131 	},
132 	{ PCI_PRODUCT_INTEL_82801ER_SATA,
133 	  0,
134 	  "Intel 82801ER Serial ATA/Raid Controller",
135 	  piixsata_chip_map,
136 	},
137 	{ PCI_PRODUCT_INTEL_6300ESB_IDE,
138 	  0,
139 	  "Intel 6300ESB IDE Controller (ICH5)",
140 	  piix_chip_map,
141 	},
142 	{ PCI_PRODUCT_INTEL_6300ESB_SATA,
143 	  0,
144 	  "Intel 6300ESB Serial ATA Controller",
145 	  piixsata_chip_map,
146 	},
147 	{ PCI_PRODUCT_INTEL_6300ESB_RAID,
148 	  0,
149 	  "Intel 6300ESB Serial ATA/RAID Controller",
150 	  piixsata_chip_map,
151 	},
152 	{ PCI_PRODUCT_INTEL_82801FB_IDE,
153 	  0,
154 	  "Intel 82801FB IDE Controller (ICH6)",
155 	  piix_chip_map,
156 	},
157 	{ PCI_PRODUCT_INTEL_82801FB_SATA,
158 	  0,
159 	  "Intel 82801FB Serial ATA/Raid Controller",
160 	  piixsata_chip_map,
161 	},
162 	{ PCI_PRODUCT_INTEL_82801FR_SATA,
163 	  0,
164 	  "Intel 82801FR Serial ATA/Raid Controller",
165 	  piixsata_chip_map,
166 	},
167 	{ PCI_PRODUCT_INTEL_82801FBM_SATA,
168 	  0,
169 	  "Intel 82801FBM Serial ATA Controller (ICH6)",
170 	  piixsata_chip_map,
171 	},
172 	{ PCI_PRODUCT_INTEL_82801G_IDE,
173 	  0,
174 	  "Intel 82801GB/GR IDE Controller (ICH7)",
175 	  piix_chip_map,
176 	},
177 	{ PCI_PRODUCT_INTEL_82801G_SATA,
178 	  0,
179 	  "Intel 82801GB/GR Serial ATA/Raid Controller (ICH7)",
180 	  piixsata_chip_map,
181 	},
182 	{ PCI_PRODUCT_INTEL_82801GBM_SATA,
183 	  0,
184 	  "Intel 82801GBM/GHM Serial ATA Controller (ICH7)",
185 	  piixsata_chip_map,
186 	},
187 	{ PCI_PRODUCT_INTEL_82801H_SATA_1,
188 	  0,
189 	  "Intel 82801H Serial ATA Controller (ICH8)",
190 	  piixsata_chip_map,
191 	},
192 	{ PCI_PRODUCT_INTEL_82801H_SATA_AHCI6,
193 	  0,
194 	  "Intel 82801H AHCI Controller (ICH8)",
195 	  piixsata_chip_map,
196 	},
197 	{ PCI_PRODUCT_INTEL_82801H_SATA_RAID,
198 	  0,
199 	  "Intel 82801H Serial ATA RAID Controller (ICH8)",
200 	  piixsata_chip_map,
201 	},
202 	{ PCI_PRODUCT_INTEL_82801H_SATA_AHCI4,
203 	  0,
204 	  "Intel 82801H Serial ATA Controller (ICH8)",
205 	  piixsata_chip_map,
206 	},
207 	{ PCI_PRODUCT_INTEL_82801H_SATA_2,
208 	  0,
209 	  "Intel 82801H Serial ATA Controller (ICH8)",
210 	  piixsata_chip_map,
211 	},
212 	{ PCI_PRODUCT_INTEL_82801HBM_SATA_1,
213 	  0,
214 	  "Intel 82801HBM Serial ATA Controller (ICH8M)",
215 	  piixsata_chip_map,
216 	},
217 	{ PCI_PRODUCT_INTEL_82801HBM_SATA_2,
218 	  0,
219 	  "Intel 82801HBM Serial ATA Controller (ICH8M)",
220 	  piixsata_chip_map,
221 	},
222 	{ PCI_PRODUCT_INTEL_63XXESB_IDE,
223 	  0,
224 	  "Intel 631xESB/632xESB IDE Controller",
225 	  piix_chip_map,
226 	},
227 	{ PCI_PRODUCT_INTEL_63XXESB_SATA,
228 	  0,
229 	  "Intel 631xESB/632xESB Serial ATA Controller",
230 	  piixsata_chip_map,
231 	},
232 	{ 0,
233 	  0,
234 	  NULL,
235 	  NULL
236 	}
237 };
238 
239 CFATTACH_DECL(piixide, sizeof(struct pciide_softc),
240     piixide_match, piixide_attach, NULL, NULL);
241 
242 static int
243 piixide_match(struct device *parent, struct cfdata *match,
244     void *aux)
245 {
246 	struct pci_attach_args *pa = aux;
247 
248 	if (PCI_VENDOR(pa->pa_id) == PCI_VENDOR_INTEL) {
249 		if (pciide_lookup_product(pa->pa_id, pciide_intel_products))
250 			return (2);
251 	}
252 	return (0);
253 }
254 
255 static void
256 piixide_attach(struct device *parent, struct device *self, void *aux)
257 {
258 	struct pci_attach_args *pa = aux;
259 	struct pciide_softc *sc = (struct pciide_softc *)self;
260 
261 	pciide_common_attach(sc, pa,
262 	    pciide_lookup_product(pa->pa_id, pciide_intel_products));
263 
264 	/* Setup our powerhook */
265 	sc->sc_powerhook = powerhook_establish(
266 	    sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, piixide_powerhook, sc);
267 	if (sc->sc_powerhook == NULL)
268 		printf("%s: WARNING: unable to establish PCI power hook\n",
269 		    sc->sc_wdcdev.sc_atac.atac_dev.dv_xname);
270 }
271 
272 static void
273 piixide_powerhook(int why, void *hdl)
274 {
275 	struct pciide_softc *sc = (struct pciide_softc *)hdl;
276 
277 	switch (why) {
278 	case PWR_SUSPEND:
279 	case PWR_STANDBY:
280 		pci_conf_capture(sc->sc_pc, sc->sc_tag, &sc->sc_pciconf);
281 		sc->sc_idetim = pci_conf_read(sc->sc_pc, sc->sc_tag,
282 		    PIIX_IDETIM);
283 		sc->sc_udmatim = pci_conf_read(sc->sc_pc, sc->sc_tag,
284 		    PIIX_UDMATIM);
285 		break;
286 	case PWR_RESUME:
287 		pci_conf_restore(sc->sc_pc, sc->sc_tag, &sc->sc_pciconf);
288 		pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM,
289 		    sc->sc_idetim);
290 		pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_UDMATIM,
291 		    sc->sc_udmatim);
292 		break;
293 	case PWR_SOFTSUSPEND:
294 	case PWR_SOFTSTANDBY:
295 	case PWR_SOFTRESUME:
296 		break;
297 	}
298 
299 	return;
300 }
301 
302 static void
303 piix_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
304 {
305 	struct pciide_channel *cp;
306 	int channel;
307 	u_int32_t idetim;
308 	bus_size_t cmdsize, ctlsize;
309 	pcireg_t interface = PCI_INTERFACE(pa->pa_class);
310 
311 	if (pciide_chipen(sc, pa) == 0)
312 		return;
313 
314 	aprint_normal("%s: bus-master DMA support present",
315 	    sc->sc_wdcdev.sc_atac.atac_dev.dv_xname);
316 	pciide_mapreg_dma(sc, pa);
317 	aprint_normal("\n");
318 	sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DATA16 | ATAC_CAP_DATA32;
319 	if (sc->sc_dma_ok) {
320 		sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DMA;
321 		sc->sc_wdcdev.irqack = pciide_irqack;
322 		switch(sc->sc_pp->ide_product) {
323 		case PCI_PRODUCT_INTEL_82371AB_IDE:
324 		case PCI_PRODUCT_INTEL_82440MX_IDE:
325 		case PCI_PRODUCT_INTEL_82801AA_IDE:
326 		case PCI_PRODUCT_INTEL_82801AB_IDE:
327 		case PCI_PRODUCT_INTEL_82801BA_IDE:
328 		case PCI_PRODUCT_INTEL_82801BAM_IDE:
329 		case PCI_PRODUCT_INTEL_82801CA_IDE_1:
330 		case PCI_PRODUCT_INTEL_82801CA_IDE_2:
331 		case PCI_PRODUCT_INTEL_82801DB_IDE:
332 		case PCI_PRODUCT_INTEL_82801DBM_IDE:
333 		case PCI_PRODUCT_INTEL_82801EB_IDE:
334 		case PCI_PRODUCT_INTEL_6300ESB_IDE:
335 		case PCI_PRODUCT_INTEL_82801FB_IDE:
336 		case PCI_PRODUCT_INTEL_82801G_IDE:
337 			sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_UDMA;
338 		}
339 	}
340 	sc->sc_wdcdev.sc_atac.atac_pio_cap = 4;
341 	sc->sc_wdcdev.sc_atac.atac_dma_cap = 2;
342 	switch(sc->sc_pp->ide_product) {
343 	case PCI_PRODUCT_INTEL_82801AA_IDE:
344 		sc->sc_wdcdev.sc_atac.atac_udma_cap = 4;
345 		break;
346 	case PCI_PRODUCT_INTEL_82801BA_IDE:
347 	case PCI_PRODUCT_INTEL_82801BAM_IDE:
348 	case PCI_PRODUCT_INTEL_82801CA_IDE_1:
349 	case PCI_PRODUCT_INTEL_82801CA_IDE_2:
350 	case PCI_PRODUCT_INTEL_82801DB_IDE:
351 	case PCI_PRODUCT_INTEL_82801DBM_IDE:
352 	case PCI_PRODUCT_INTEL_82801EB_IDE:
353 	case PCI_PRODUCT_INTEL_6300ESB_IDE:
354 	case PCI_PRODUCT_INTEL_82801FB_IDE:
355 	case PCI_PRODUCT_INTEL_82801G_IDE:
356 		sc->sc_wdcdev.sc_atac.atac_udma_cap = 5;
357 		break;
358 	default:
359 		sc->sc_wdcdev.sc_atac.atac_udma_cap = 2;
360 	}
361 	if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82371FB_IDE)
362 		sc->sc_wdcdev.sc_atac.atac_set_modes = piix_setup_channel;
363 	else
364 		sc->sc_wdcdev.sc_atac.atac_set_modes = piix3_4_setup_channel;
365 	sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray;
366 	sc->sc_wdcdev.sc_atac.atac_nchannels = PCIIDE_NUM_CHANNELS;
367 
368 	ATADEBUG_PRINT(("piix_setup_chip: old idetim=0x%x",
369 	    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM)),
370 	    DEBUG_PROBE);
371 	if (sc->sc_pp->ide_product != PCI_PRODUCT_INTEL_82371FB_IDE) {
372 		ATADEBUG_PRINT((", sidetim=0x%x",
373 		    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM)),
374 		    DEBUG_PROBE);
375 		if (sc->sc_wdcdev.sc_atac.atac_cap & ATAC_CAP_UDMA) {
376 			ATADEBUG_PRINT((", udamreg 0x%x",
377 			    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG)),
378 			    DEBUG_PROBE);
379 		}
380 		if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE ||
381 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE ||
382 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE ||
383 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE ||
384 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 ||
385 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 ||
386 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE ||
387 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE ||
388 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801EB_IDE ||
389 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801FB_IDE ||
390 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6300ESB_IDE ||
391 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801G_IDE) {
392 			ATADEBUG_PRINT((", IDE_CONTROL 0x%x",
393 			    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG)),
394 			    DEBUG_PROBE);
395 		}
396 
397 	}
398 	ATADEBUG_PRINT(("\n"), DEBUG_PROBE);
399 
400 	wdc_allocate_regs(&sc->sc_wdcdev);
401 
402 	for (channel = 0; channel < sc->sc_wdcdev.sc_atac.atac_nchannels;
403 	     channel++) {
404 		cp = &sc->pciide_channels[channel];
405 		if (pciide_chansetup(sc, channel, interface) == 0)
406 			continue;
407 		idetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM);
408 		if ((PIIX_IDETIM_READ(idetim, channel) &
409 		    PIIX_IDETIM_IDE) == 0) {
410 #if 1
411 			aprint_normal("%s: %s channel ignored (disabled)\n",
412 			    sc->sc_wdcdev.sc_atac.atac_dev.dv_xname, cp->name);
413 			cp->ata_channel.ch_flags |= ATACH_DISABLED;
414 			continue;
415 #else
416 			pcireg_t interface;
417 
418 			idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE,
419 			    channel);
420 			pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM,
421 			    idetim);
422 			interface = PCI_INTERFACE(pci_conf_read(sc->sc_pc,
423 			    sc->sc_tag, PCI_CLASS_REG));
424 			aprint_normal("channel %d idetim=%08x interface=%02x\n",
425 			    channel, idetim, interface);
426 #endif
427 		}
428 		pciide_mapchan(pa, cp, interface,
429 		    &cmdsize, &ctlsize, pciide_pci_intr);
430 	}
431 
432 	ATADEBUG_PRINT(("piix_setup_chip: idetim=0x%x",
433 	    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM)),
434 	    DEBUG_PROBE);
435 	if (sc->sc_pp->ide_product != PCI_PRODUCT_INTEL_82371FB_IDE) {
436 		ATADEBUG_PRINT((", sidetim=0x%x",
437 		    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM)),
438 		    DEBUG_PROBE);
439 		if (sc->sc_wdcdev.sc_atac.atac_cap & ATAC_CAP_UDMA) {
440 			ATADEBUG_PRINT((", udamreg 0x%x",
441 			    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG)),
442 			    DEBUG_PROBE);
443 		}
444 		if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE ||
445 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE ||
446 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE ||
447 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE ||
448 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 ||
449 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 ||
450 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE ||
451 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE ||
452 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801EB_IDE ||
453 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801FB_IDE ||
454 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6300ESB_IDE ||
455 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801G_IDE) {
456 			ATADEBUG_PRINT((", IDE_CONTROL 0x%x",
457 			    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG)),
458 			    DEBUG_PROBE);
459 		}
460 	}
461 	ATADEBUG_PRINT(("\n"), DEBUG_PROBE);
462 }
463 
464 static void
465 piix_setup_channel(struct ata_channel *chp)
466 {
467 	u_int8_t mode[2], drive;
468 	u_int32_t oidetim, idetim, idedma_ctl;
469 	struct pciide_channel *cp = CHAN_TO_PCHAN(chp);
470 	struct pciide_softc *sc = CHAN_TO_PCIIDE(chp);
471 	struct ata_drive_datas *drvp = cp->ata_channel.ch_drive;
472 
473 	oidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM);
474 	idetim = PIIX_IDETIM_CLEAR(oidetim, 0xffff, chp->ch_channel);
475 	idedma_ctl = 0;
476 
477 	/* set up new idetim: Enable IDE registers decode */
478 	idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE,
479 	    chp->ch_channel);
480 
481 	/* setup DMA */
482 	pciide_channel_dma_setup(cp);
483 
484 	/*
485 	 * Here we have to mess up with drives mode: PIIX can't have
486 	 * different timings for master and slave drives.
487 	 * We need to find the best combination.
488 	 */
489 
490 	/* If both drives supports DMA, take the lower mode */
491 	if ((drvp[0].drive_flags & DRIVE_DMA) &&
492 	    (drvp[1].drive_flags & DRIVE_DMA)) {
493 		mode[0] = mode[1] =
494 		    min(drvp[0].DMA_mode, drvp[1].DMA_mode);
495 		    drvp[0].DMA_mode = mode[0];
496 		    drvp[1].DMA_mode = mode[1];
497 		goto ok;
498 	}
499 	/*
500 	 * If only one drive supports DMA, use its mode, and
501 	 * put the other one in PIO mode 0 if mode not compatible
502 	 */
503 	if (drvp[0].drive_flags & DRIVE_DMA) {
504 		mode[0] = drvp[0].DMA_mode;
505 		mode[1] = drvp[1].PIO_mode;
506 		if (piix_isp_pio[mode[1]] != piix_isp_dma[mode[0]] ||
507 		    piix_rtc_pio[mode[1]] != piix_rtc_dma[mode[0]])
508 			mode[1] = drvp[1].PIO_mode = 0;
509 		goto ok;
510 	}
511 	if (drvp[1].drive_flags & DRIVE_DMA) {
512 		mode[1] = drvp[1].DMA_mode;
513 		mode[0] = drvp[0].PIO_mode;
514 		if (piix_isp_pio[mode[0]] != piix_isp_dma[mode[1]] ||
515 		    piix_rtc_pio[mode[0]] != piix_rtc_dma[mode[1]])
516 			mode[0] = drvp[0].PIO_mode = 0;
517 		goto ok;
518 	}
519 	/*
520 	 * If both drives are not DMA, takes the lower mode, unless
521 	 * one of them is PIO mode < 2
522 	 */
523 	if (drvp[0].PIO_mode < 2) {
524 		mode[0] = drvp[0].PIO_mode = 0;
525 		mode[1] = drvp[1].PIO_mode;
526 	} else if (drvp[1].PIO_mode < 2) {
527 		mode[1] = drvp[1].PIO_mode = 0;
528 		mode[0] = drvp[0].PIO_mode;
529 	} else {
530 		mode[0] = mode[1] =
531 		    min(drvp[1].PIO_mode, drvp[0].PIO_mode);
532 		drvp[0].PIO_mode = mode[0];
533 		drvp[1].PIO_mode = mode[1];
534 	}
535 ok:	/* The modes are setup */
536 	for (drive = 0; drive < 2; drive++) {
537 		if (drvp[drive].drive_flags & DRIVE_DMA) {
538 			idetim |= piix_setup_idetim_timings(
539 			    mode[drive], 1, chp->ch_channel);
540 			goto end;
541 		}
542 	}
543 	/* If we are there, none of the drives are DMA */
544 	if (mode[0] >= 2)
545 		idetim |= piix_setup_idetim_timings(
546 		    mode[0], 0, chp->ch_channel);
547 	else
548 		idetim |= piix_setup_idetim_timings(
549 		    mode[1], 0, chp->ch_channel);
550 end:	/*
551 	 * timing mode is now set up in the controller. Enable
552 	 * it per-drive
553 	 */
554 	for (drive = 0; drive < 2; drive++) {
555 		/* If no drive, skip */
556 		if ((drvp[drive].drive_flags & DRIVE) == 0)
557 			continue;
558 		idetim |= piix_setup_idetim_drvs(&drvp[drive]);
559 		if (drvp[drive].drive_flags & DRIVE_DMA)
560 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
561 	}
562 	if (idedma_ctl != 0) {
563 		/* Add software bits in status register */
564 		bus_space_write_1(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CTL], 0,
565 		    idedma_ctl);
566 	}
567 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, idetim);
568 }
569 
570 static void
571 piix3_4_setup_channel(struct ata_channel *chp)
572 {
573 	struct ata_drive_datas *drvp;
574 	u_int32_t oidetim, idetim, sidetim, udmareg, ideconf, idedma_ctl;
575 	struct pciide_channel *cp = CHAN_TO_PCHAN(chp);
576 	struct pciide_softc *sc = CHAN_TO_PCIIDE(chp);
577 	struct wdc_softc *wdc = &sc->sc_wdcdev;
578 	int drive, s;
579 	int channel = chp->ch_channel;
580 
581 	oidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM);
582 	sidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM);
583 	udmareg = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG);
584 	ideconf = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG);
585 	idetim = PIIX_IDETIM_CLEAR(oidetim, 0xffff, channel);
586 	sidetim &= ~(PIIX_SIDETIM_ISP_MASK(channel) |
587 	    PIIX_SIDETIM_RTC_MASK(channel));
588 	idedma_ctl = 0;
589 
590 	/* set up new idetim: Enable IDE registers decode */
591 	idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE, channel);
592 
593 	/* setup DMA if needed */
594 	pciide_channel_dma_setup(cp);
595 
596 	for (drive = 0; drive < 2; drive++) {
597 		udmareg &= ~(PIIX_UDMACTL_DRV_EN(channel, drive) |
598 		    PIIX_UDMATIM_SET(0x3, channel, drive));
599 		drvp = &chp->ch_drive[drive];
600 		/* If no drive, skip */
601 		if ((drvp->drive_flags & DRIVE) == 0)
602 			continue;
603 		if (((drvp->drive_flags & DRIVE_DMA) == 0 &&
604 		    (drvp->drive_flags & DRIVE_UDMA) == 0))
605 			goto pio;
606 
607 		if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE ||
608 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE ||
609 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE ||
610 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE ||
611 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 ||
612 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 ||
613 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE ||
614 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE ||
615 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801EB_IDE ||
616 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801FB_IDE ||
617 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6300ESB_IDE ||
618 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801G_IDE) {
619 			ideconf |= PIIX_CONFIG_PINGPONG;
620 		}
621 		if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE ||
622 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE ||
623 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 ||
624 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 ||
625 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE ||
626 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE ||
627 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801EB_IDE ||
628 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801FB_IDE ||
629 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_6300ESB_IDE ||
630 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801G_IDE) {
631 			/* setup Ultra/100 */
632 			if (drvp->UDMA_mode > 2 &&
633 			    (ideconf & PIIX_CONFIG_CR(channel, drive)) == 0)
634 				drvp->UDMA_mode = 2;
635 			if (drvp->UDMA_mode > 4) {
636 				ideconf |= PIIX_CONFIG_UDMA100(channel, drive);
637 			} else {
638 				ideconf &= ~PIIX_CONFIG_UDMA100(channel, drive);
639 				if (drvp->UDMA_mode > 2) {
640 					ideconf |= PIIX_CONFIG_UDMA66(channel,
641 					    drive);
642 				} else {
643 					ideconf &= ~PIIX_CONFIG_UDMA66(channel,
644 					    drive);
645 				}
646 			}
647 		}
648 		if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE) {
649 			/* setup Ultra/66 */
650 			if (drvp->UDMA_mode > 2 &&
651 			    (ideconf & PIIX_CONFIG_CR(channel, drive)) == 0)
652 				drvp->UDMA_mode = 2;
653 			if (drvp->UDMA_mode > 2)
654 				ideconf |= PIIX_CONFIG_UDMA66(channel, drive);
655 			else
656 				ideconf &= ~PIIX_CONFIG_UDMA66(channel, drive);
657 		}
658 		if ((wdc->sc_atac.atac_cap & ATAC_CAP_UDMA) &&
659 		    (drvp->drive_flags & DRIVE_UDMA)) {
660 			/* use Ultra/DMA */
661 			s = splbio();
662 			drvp->drive_flags &= ~DRIVE_DMA;
663 			splx(s);
664 			udmareg |= PIIX_UDMACTL_DRV_EN( channel, drive);
665 			udmareg |= PIIX_UDMATIM_SET(
666 			    piix4_sct_udma[drvp->UDMA_mode], channel, drive);
667 		} else {
668 			/* use Multiword DMA */
669 			s = splbio();
670 			drvp->drive_flags &= ~DRIVE_UDMA;
671 			splx(s);
672 			if (drive == 0) {
673 				idetim |= piix_setup_idetim_timings(
674 				    drvp->DMA_mode, 1, channel);
675 			} else {
676 				sidetim |= piix_setup_sidetim_timings(
677 					drvp->DMA_mode, 1, channel);
678 				idetim =PIIX_IDETIM_SET(idetim,
679 				    PIIX_IDETIM_SITRE, channel);
680 			}
681 		}
682 		idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
683 
684 pio:		/* use PIO mode */
685 		idetim |= piix_setup_idetim_drvs(drvp);
686 		if (drive == 0) {
687 			idetim |= piix_setup_idetim_timings(
688 			    drvp->PIO_mode, 0, channel);
689 		} else {
690 			sidetim |= piix_setup_sidetim_timings(
691 				drvp->PIO_mode, 0, channel);
692 			idetim =PIIX_IDETIM_SET(idetim,
693 			    PIIX_IDETIM_SITRE, channel);
694 		}
695 	}
696 	if (idedma_ctl != 0) {
697 		/* Add software bits in status register */
698 		bus_space_write_1(sc->sc_dma_iot, cp->dma_iohs[IDEDMA_CTL], 0,
699 		    idedma_ctl);
700 	}
701 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, idetim);
702 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM, sidetim);
703 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG, udmareg);
704 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_CONFIG, ideconf);
705 }
706 
707 
708 /* setup ISP and RTC fields, based on mode */
709 static u_int32_t
710 piix_setup_idetim_timings(mode, dma, channel)
711 	u_int8_t mode;
712 	u_int8_t dma;
713 	u_int8_t channel;
714 {
715 
716 	if (dma)
717 		return PIIX_IDETIM_SET(0,
718 		    PIIX_IDETIM_ISP_SET(piix_isp_dma[mode]) |
719 		    PIIX_IDETIM_RTC_SET(piix_rtc_dma[mode]),
720 		    channel);
721 	else
722 		return PIIX_IDETIM_SET(0,
723 		    PIIX_IDETIM_ISP_SET(piix_isp_pio[mode]) |
724 		    PIIX_IDETIM_RTC_SET(piix_rtc_pio[mode]),
725 		    channel);
726 }
727 
728 /* setup DTE, PPE, IE and TIME field based on PIO mode */
729 static u_int32_t
730 piix_setup_idetim_drvs(drvp)
731 	struct ata_drive_datas *drvp;
732 {
733 	u_int32_t ret = 0;
734 	struct ata_channel *chp = drvp->chnl_softc;
735 	u_int8_t channel = chp->ch_channel;
736 	u_int8_t drive = drvp->drive;
737 
738 	/*
739 	 * If drive is using UDMA, timings setups are independent
740 	 * So just check DMA and PIO here.
741 	 */
742 	if (drvp->drive_flags & DRIVE_DMA) {
743 		/* if mode = DMA mode 0, use compatible timings */
744 		if ((drvp->drive_flags & DRIVE_DMA) &&
745 		    drvp->DMA_mode == 0) {
746 			drvp->PIO_mode = 0;
747 			return ret;
748 		}
749 		ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_TIME(drive), channel);
750 		/*
751 		 * PIO and DMA timings are the same, use fast timings for PIO
752 		 * too, else use compat timings.
753 		 */
754 		if ((piix_isp_pio[drvp->PIO_mode] !=
755 		    piix_isp_dma[drvp->DMA_mode]) ||
756 		    (piix_rtc_pio[drvp->PIO_mode] !=
757 		    piix_rtc_dma[drvp->DMA_mode]))
758 			drvp->PIO_mode = 0;
759 		/* if PIO mode <= 2, use compat timings for PIO */
760 		if (drvp->PIO_mode <= 2) {
761 			ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_DTE(drive),
762 			    channel);
763 			return ret;
764 		}
765 	}
766 
767 	/*
768 	 * Now setup PIO modes. If mode < 2, use compat timings.
769 	 * Else enable fast timings. Enable IORDY and prefetch/post
770 	 * if PIO mode >= 3.
771 	 */
772 
773 	if (drvp->PIO_mode < 2)
774 		return ret;
775 
776 	ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_TIME(drive), channel);
777 	if (drvp->PIO_mode >= 3) {
778 		ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_IE(drive), channel);
779 		ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_PPE(drive), channel);
780 	}
781 	return ret;
782 }
783 
784 /* setup values in SIDETIM registers, based on mode */
785 static u_int32_t
786 piix_setup_sidetim_timings(mode, dma, channel)
787 	u_int8_t mode;
788 	u_int8_t dma;
789 	u_int8_t channel;
790 {
791 	if (dma)
792 		return PIIX_SIDETIM_ISP_SET(piix_isp_dma[mode], channel) |
793 		    PIIX_SIDETIM_RTC_SET(piix_rtc_dma[mode], channel);
794 	else
795 		return PIIX_SIDETIM_ISP_SET(piix_isp_pio[mode], channel) |
796 		    PIIX_SIDETIM_RTC_SET(piix_rtc_pio[mode], channel);
797 }
798 
799 static void
800 piixsata_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
801 {
802 	struct pciide_channel *cp;
803 	bus_size_t cmdsize, ctlsize;
804 	pcireg_t interface, cmdsts;
805 	int channel, ich = 0;
806 	uint8_t reg;
807 
808 	if (pciide_chipen(sc, pa) == 0)
809 		return;
810 
811 	aprint_normal("%s: bus-master DMA support present",
812 	    sc->sc_wdcdev.sc_atac.atac_dev.dv_xname);
813 	pciide_mapreg_dma(sc, pa);
814 	aprint_normal("\n");
815 
816 	sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DATA16 | ATAC_CAP_DATA32;
817 	sc->sc_wdcdev.sc_atac.atac_pio_cap = 4;
818 	if (sc->sc_dma_ok) {
819 		sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_DMA | ATAC_CAP_UDMA;
820 		sc->sc_wdcdev.irqack = pciide_irqack;
821 		sc->sc_wdcdev.sc_atac.atac_dma_cap = 2;
822 		sc->sc_wdcdev.sc_atac.atac_udma_cap = 6;
823 	}
824 	sc->sc_wdcdev.sc_atac.atac_set_modes = sata_setup_channel;
825 
826 	sc->sc_wdcdev.sc_atac.atac_channels = sc->wdc_chanarray;
827 	sc->sc_wdcdev.sc_atac.atac_nchannels = PCIIDE_NUM_CHANNELS;
828 
829 	cmdsts = pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_COMMAND_STATUS_REG);
830 	cmdsts &= ~PCI_COMMAND_INTERRUPT_DISABLE;
831 	pci_conf_write(sc->sc_pc, sc->sc_tag, PCI_COMMAND_STATUS_REG, cmdsts);
832 
833 	if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE &&
834 	    PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_RAID)
835 		sc->sc_wdcdev.sc_atac.atac_cap |= ATAC_CAP_RAID;
836 
837 	interface = PCI_INTERFACE(pa->pa_class);
838 
839 	switch (sc->sc_pp->ide_product) {
840 	case PCI_PRODUCT_INTEL_6300ESB_SATA:
841 	case PCI_PRODUCT_INTEL_6300ESB_RAID:
842 	case PCI_PRODUCT_INTEL_63XXESB_SATA:
843 	case PCI_PRODUCT_INTEL_82801EB_SATA:
844 	case PCI_PRODUCT_INTEL_82801ER_SATA:
845 		ich = 5;
846 		break;
847 	case PCI_PRODUCT_INTEL_82801FB_SATA:
848 	case PCI_PRODUCT_INTEL_82801FR_SATA:
849 	case PCI_PRODUCT_INTEL_82801FBM_SATA:
850 		ich = 6;
851 		break;
852 	case PCI_PRODUCT_INTEL_82801G_SATA:
853 	case PCI_PRODUCT_INTEL_82801G_SATA_AHCI:
854 	case PCI_PRODUCT_INTEL_82801G_SATA_RAID:
855 	case PCI_PRODUCT_INTEL_82801GBM_SATA:
856 	case PCI_PRODUCT_INTEL_82801GBM_AHCI:
857 	case PCI_PRODUCT_INTEL_82801GHM_RAID:
858 		ich = 7;
859 		break;
860 	case PCI_PRODUCT_INTEL_82801H_SATA_1:
861 	case PCI_PRODUCT_INTEL_82801H_SATA_AHCI6:
862 	case PCI_PRODUCT_INTEL_82801H_SATA_RAID:
863 	case PCI_PRODUCT_INTEL_82801H_SATA_AHCI4:
864 	case PCI_PRODUCT_INTEL_82801H_SATA_2:
865 	case PCI_PRODUCT_INTEL_82801HBM_SATA_1:
866 	case PCI_PRODUCT_INTEL_82801HBM_SATA_2:
867 		ich = 8;
868 		break;
869 	}
870 
871 	/*
872 	 * Put the SATA portion of controllers that don't operate in combined
873 	 * mode into native PCI modes so the maximum number of devices can be
874 	 * used.  Intel calls this "enhanced mode".
875 	 */
876 
877 	if (ich == 5) {
878 		reg = pciide_pci_read(sc->sc_pc, sc->sc_tag, ICH5_SATA_MAP);
879 		if ((reg & ICH5_SATA_MAP_COMBINED) == 0) {
880 			reg = pciide_pci_read(pa->pa_pc, pa->pa_tag,
881 			    ICH5_SATA_PI);
882 			reg |= ICH5_SATA_PI_PRI_NATIVE |
883 			    ICH5_SATA_PI_SEC_NATIVE;
884 			pciide_pci_write(pa->pa_pc, pa->pa_tag,
885 			    ICH5_SATA_PI, reg);
886 			interface |= PCIIDE_INTERFACE_PCI(0) |
887 			    PCIIDE_INTERFACE_PCI(1);
888 		}
889 	} else {
890 		reg = pciide_pci_read(sc->sc_pc, sc->sc_tag, ICH5_SATA_MAP) &
891 		    ICH6_SATA_MAP_CMB_MASK;
892 		if (reg != ICH6_SATA_MAP_CMB_PRI &&
893 		    reg != ICH6_SATA_MAP_CMB_SEC) {
894 			reg = pciide_pci_read(pa->pa_pc, pa->pa_tag,
895 			    ICH5_SATA_PI);
896 			reg |= ICH5_SATA_PI_PRI_NATIVE |
897 			    ICH5_SATA_PI_SEC_NATIVE;
898 
899 			pciide_pci_write(pa->pa_pc, pa->pa_tag,
900 			   ICH5_SATA_PI, reg);
901 			interface |= PCIIDE_INTERFACE_PCI(0) |
902 			   PCIIDE_INTERFACE_PCI(1);
903 
904 			/*
905 			 * Ask for SATA IDE Mode, we don't need to do this
906 			 * for the combined mode case as combined mode is
907 			 * only allowed in IDE Mode.
908 			 */
909 
910 			if (ich >= 7) {
911 				reg = pciide_pci_read(sc->sc_pc, sc->sc_tag,
912 				    ICH5_SATA_MAP) & ~ICH7_SATA_MAP_SMS_MASK;
913 				pciide_pci_write(pa->pa_pc, pa->pa_tag,
914 				    ICH5_SATA_MAP, reg);
915 			}
916 		}
917 	}
918 
919 	wdc_allocate_regs(&sc->sc_wdcdev);
920 
921 	for (channel = 0; channel < sc->sc_wdcdev.sc_atac.atac_nchannels;
922 	     channel++) {
923 		cp = &sc->pciide_channels[channel];
924 		if (pciide_chansetup(sc, channel, interface) == 0)
925 			continue;
926 		pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
927 		    pciide_pci_intr);
928 	}
929 }
930