xref: /netbsd-src/sys/dev/pci/pciide.c (revision 1ffa7b76c40339c17a0fb2a09fac93f287cfc046)
1 /*	$NetBSD: pciide.c,v 1.191 2003/04/28 05:20:31 nakayama Exp $	*/
2 
3 
4 /*
5  * Copyright (c) 1999, 2000, 2001 Manuel Bouyer.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *	This product includes software developed by Manuel Bouyer.
18  * 4. Neither the name of the University nor the names of its contributors
19  *    may be used to endorse or promote products derived from this software
20  *    without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  *
33  */
34 
35 
36 /*
37  * Copyright (c) 1996, 1998 Christopher G. Demetriou.  All rights reserved.
38  *
39  * Redistribution and use in source and binary forms, with or without
40  * modification, are permitted provided that the following conditions
41  * are met:
42  * 1. Redistributions of source code must retain the above copyright
43  *    notice, this list of conditions and the following disclaimer.
44  * 2. Redistributions in binary form must reproduce the above copyright
45  *    notice, this list of conditions and the following disclaimer in the
46  *    documentation and/or other materials provided with the distribution.
47  * 3. All advertising materials mentioning features or use of this software
48  *    must display the following acknowledgement:
49  *      This product includes software developed by Christopher G. Demetriou
50  *	for the NetBSD Project.
51  * 4. The name of the author may not be used to endorse or promote products
52  *    derived from this software without specific prior written permission
53  *
54  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
55  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
56  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
57  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
58  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
59  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
60  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
61  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
62  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
63  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
64  */
65 
66 /*
67  * PCI IDE controller driver.
68  *
69  * Author: Christopher G. Demetriou, March 2, 1998 (derived from NetBSD
70  * sys/dev/pci/ppb.c, revision 1.16).
71  *
72  * See "PCI IDE Controller Specification, Revision 1.0 3/4/94" and
73  * "Programming Interface for Bus Master IDE Controller, Revision 1.0
74  * 5/16/94" from the PCI SIG.
75  *
76  */
77 
78 #include <sys/cdefs.h>
79 __KERNEL_RCSID(0, "$NetBSD: pciide.c,v 1.191 2003/04/28 05:20:31 nakayama Exp $");
80 
81 #ifndef WDCDEBUG
82 #define WDCDEBUG
83 #endif
84 
85 #define DEBUG_DMA   0x01
86 #define DEBUG_XFERS  0x02
87 #define DEBUG_FUNCS  0x08
88 #define DEBUG_PROBE  0x10
89 #ifdef WDCDEBUG
90 int wdcdebug_pciide_mask = 0;
91 #define WDCDEBUG_PRINT(args, level) \
92 	if (wdcdebug_pciide_mask & (level)) printf args
93 #else
94 #define WDCDEBUG_PRINT(args, level)
95 #endif
96 #include <sys/param.h>
97 #include <sys/systm.h>
98 #include <sys/device.h>
99 #include <sys/malloc.h>
100 
101 #include <uvm/uvm_extern.h>
102 
103 #include <machine/endian.h>
104 
105 #include <dev/pci/pcireg.h>
106 #include <dev/pci/pcivar.h>
107 #include <dev/pci/pcidevs.h>
108 #include <dev/pci/pciidereg.h>
109 #include <dev/pci/pciidevar.h>
110 #include <dev/pci/pciide_piix_reg.h>
111 #include <dev/pci/pciide_amd_reg.h>
112 #include <dev/pci/pciide_apollo_reg.h>
113 #include <dev/pci/pciide_cmd_reg.h>
114 #include <dev/pci/pciide_cy693_reg.h>
115 #include <dev/pci/pciide_sis_reg.h>
116 #include <dev/pci/pciide_acer_reg.h>
117 #include <dev/pci/pciide_pdc202xx_reg.h>
118 #include <dev/pci/pciide_opti_reg.h>
119 #include <dev/pci/pciide_hpt_reg.h>
120 #include <dev/pci/pciide_acard_reg.h>
121 #include <dev/pci/pciide_sl82c105_reg.h>
122 #include <dev/pci/pciide_i31244_reg.h>
123 #include <dev/pci/pciide_sii3112_reg.h>
124 #include <dev/pci/cy82c693var.h>
125 
126 #include "opt_pciide.h"
127 
128 static const char dmaerrfmt[] =
129     "%s:%d: unable to %s table DMA map for drive %d, error=%d\n";
130 
131 /* inlines for reading/writing 8-bit PCI registers */
132 static __inline u_int8_t pciide_pci_read __P((pci_chipset_tag_t, pcitag_t,
133 					      int));
134 static __inline void pciide_pci_write __P((pci_chipset_tag_t, pcitag_t,
135 					   int, u_int8_t));
136 
137 static __inline u_int8_t
138 pciide_pci_read(pc, pa, reg)
139 	pci_chipset_tag_t pc;
140 	pcitag_t pa;
141 	int reg;
142 {
143 
144 	return (pci_conf_read(pc, pa, (reg & ~0x03)) >>
145 	    ((reg & 0x03) * 8) & 0xff);
146 }
147 
148 static __inline void
149 pciide_pci_write(pc, pa, reg, val)
150 	pci_chipset_tag_t pc;
151 	pcitag_t pa;
152 	int reg;
153 	u_int8_t val;
154 {
155 	pcireg_t pcival;
156 
157 	pcival = pci_conf_read(pc, pa, (reg & ~0x03));
158 	pcival &= ~(0xff << ((reg & 0x03) * 8));
159 	pcival |= (val << ((reg & 0x03) * 8));
160 	pci_conf_write(pc, pa, (reg & ~0x03), pcival);
161 }
162 
163 void default_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
164 
165 void sata_setup_channel __P((struct channel_softc*));
166 
167 void piix_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
168 void piix_setup_channel __P((struct channel_softc*));
169 void piix3_4_setup_channel __P((struct channel_softc*));
170 static u_int32_t piix_setup_idetim_timings __P((u_int8_t, u_int8_t, u_int8_t));
171 static u_int32_t piix_setup_idetim_drvs __P((struct ata_drive_datas*));
172 static u_int32_t piix_setup_sidetim_timings __P((u_int8_t, u_int8_t, u_int8_t));
173 
174 void amd7x6_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
175 void amd7x6_setup_channel __P((struct channel_softc*));
176 
177 void apollo_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
178 void apollo_setup_channel __P((struct channel_softc*));
179 
180 void cmd_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
181 void cmd0643_9_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
182 void cmd0643_9_setup_channel __P((struct channel_softc*));
183 void cmd_channel_map __P((struct pci_attach_args *,
184 			struct pciide_softc *, int));
185 int  cmd_pci_intr __P((void *));
186 void cmd646_9_irqack __P((struct channel_softc *));
187 void cmd680_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
188 void cmd680_setup_channel __P((struct channel_softc*));
189 void cmd680_channel_map __P((struct pci_attach_args *,
190 			struct pciide_softc *, int));
191 
192 void cmd3112_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
193 void cmd3112_setup_channel __P((struct channel_softc*));
194 
195 void cy693_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
196 void cy693_setup_channel __P((struct channel_softc*));
197 
198 void sis_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
199 void sis_setup_channel __P((struct channel_softc*));
200 void sis96x_setup_channel __P((struct channel_softc*));
201 static int sis_hostbr_match __P(( struct pci_attach_args *));
202 static int sis_south_match __P(( struct pci_attach_args *));
203 
204 void acer_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
205 void acer_setup_channel __P((struct channel_softc*));
206 int  acer_pci_intr __P((void *));
207 
208 void pdc202xx_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
209 void pdc202xx_setup_channel __P((struct channel_softc*));
210 void pdc20268_setup_channel __P((struct channel_softc*));
211 int  pdc202xx_pci_intr __P((void *));
212 int  pdc20265_pci_intr __P((void *));
213 static void pdc20262_dma_start __P((void*, int, int));
214 static int  pdc20262_dma_finish __P((void*, int, int, int));
215 
216 void opti_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
217 void opti_setup_channel __P((struct channel_softc*));
218 
219 void hpt_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
220 void hpt_setup_channel __P((struct channel_softc*));
221 int  hpt_pci_intr __P((void *));
222 
223 void acard_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
224 void acard_setup_channel __P((struct channel_softc*));
225 int  acard_pci_intr __P((void *));
226 
227 void serverworks_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
228 void serverworks_setup_channel __P((struct channel_softc*));
229 int  serverworks_pci_intr __P((void *));
230 
231 void sl82c105_chip_map __P((struct pciide_softc*, struct pci_attach_args*));
232 void sl82c105_setup_channel __P((struct channel_softc*));
233 
234 void pciide_channel_dma_setup __P((struct pciide_channel *));
235 int  pciide_dma_table_setup __P((struct pciide_softc*, int, int));
236 int  pciide_dma_init __P((void*, int, int, void *, size_t, int));
237 void pciide_dma_start __P((void*, int, int));
238 int  pciide_dma_finish __P((void*, int, int, int));
239 void pciide_irqack __P((struct channel_softc *));
240 void pciide_print_modes __P((struct pciide_channel *));
241 
242 void artisea_chip_map __P((struct pciide_softc*, struct pci_attach_args *));
243 
244 struct pciide_product_desc {
245 	u_int32_t ide_product;
246 	int ide_flags;
247 	const char *ide_name;
248 	/* map and setup chip, probe drives */
249 	void (*chip_map) __P((struct pciide_softc*, struct pci_attach_args*));
250 };
251 
252 /* Flags for ide_flags */
253 #define IDE_PCI_CLASS_OVERRIDE	0x0001 /* accept even if class != pciide */
254 #define	IDE_16BIT_IOSPACE	0x0002 /* I/O space BARS ignore upper word */
255 
256 /* Default product description for devices not known from this controller */
257 const struct pciide_product_desc default_product_desc = {
258 	0,
259 	0,
260 	"Generic PCI IDE controller",
261 	default_chip_map,
262 };
263 
264 const struct pciide_product_desc pciide_intel_products[] =  {
265 	{ PCI_PRODUCT_INTEL_82092AA,
266 	  0,
267 	  "Intel 82092AA IDE controller",
268 	  default_chip_map,
269 	},
270 	{ PCI_PRODUCT_INTEL_82371FB_IDE,
271 	  0,
272 	  "Intel 82371FB IDE controller (PIIX)",
273 	  piix_chip_map,
274 	},
275 	{ PCI_PRODUCT_INTEL_82371SB_IDE,
276 	  0,
277 	  "Intel 82371SB IDE Interface (PIIX3)",
278 	  piix_chip_map,
279 	},
280 	{ PCI_PRODUCT_INTEL_82371AB_IDE,
281 	  0,
282 	  "Intel 82371AB IDE controller (PIIX4)",
283 	  piix_chip_map,
284 	},
285 	{ PCI_PRODUCT_INTEL_82440MX_IDE,
286 	  0,
287 	  "Intel 82440MX IDE controller",
288 	  piix_chip_map
289 	},
290 	{ PCI_PRODUCT_INTEL_82801AA_IDE,
291 	  0,
292 	  "Intel 82801AA IDE Controller (ICH)",
293 	  piix_chip_map,
294 	},
295 	{ PCI_PRODUCT_INTEL_82801AB_IDE,
296 	  0,
297 	  "Intel 82801AB IDE Controller (ICH0)",
298 	  piix_chip_map,
299 	},
300 	{ PCI_PRODUCT_INTEL_82801BA_IDE,
301 	  0,
302 	  "Intel 82801BA IDE Controller (ICH2)",
303 	  piix_chip_map,
304 	},
305 	{ PCI_PRODUCT_INTEL_82801BAM_IDE,
306 	  0,
307 	  "Intel 82801BAM IDE Controller (ICH2-M)",
308 	  piix_chip_map,
309 	},
310 	{ PCI_PRODUCT_INTEL_82801CA_IDE_1,
311 	  0,
312 	  "Intel 82801CA IDE Controller (ICH3)",
313 	  piix_chip_map,
314 	},
315 	{ PCI_PRODUCT_INTEL_82801CA_IDE_2,
316 	  0,
317 	  "Intel 82801CA IDE Controller (ICH3)",
318 	  piix_chip_map,
319 	},
320 	{ PCI_PRODUCT_INTEL_82801DB_IDE,
321 	  0,
322 	  "Intel 82801DB IDE Controller (ICH4)",
323 	  piix_chip_map,
324 	},
325 	{ PCI_PRODUCT_INTEL_82801DBM_IDE,
326 	  0,
327 	  "Intel 82801DBM IDE Controller (ICH4-M)",
328 	  piix_chip_map,
329 	},
330 	{ PCI_PRODUCT_INTEL_31244,
331 	  0,
332 	  "Intel 31244 Serial ATA Controller",
333 	  artisea_chip_map,
334 	},
335 	{ 0,
336 	  0,
337 	  NULL,
338 	  NULL
339 	}
340 };
341 
342 const struct pciide_product_desc pciide_amd_products[] =  {
343 	{ PCI_PRODUCT_AMD_PBC756_IDE,
344 	  0,
345 	  "Advanced Micro Devices AMD756 IDE Controller",
346 	  amd7x6_chip_map
347 	},
348 	{ PCI_PRODUCT_AMD_PBC766_IDE,
349 	  0,
350 	  "Advanced Micro Devices AMD766 IDE Controller",
351 	  amd7x6_chip_map
352 	},
353 	{ PCI_PRODUCT_AMD_PBC768_IDE,
354 	  0,
355 	  "Advanced Micro Devices AMD768 IDE Controller",
356 	  amd7x6_chip_map
357 	},
358 	{ PCI_PRODUCT_AMD_PBC8111_IDE,
359 	  0,
360 	  "Advanced Micro Devices AMD8111 IDE Controller",
361 	  amd7x6_chip_map
362 	},
363 	{ 0,
364 	  0,
365 	  NULL,
366 	  NULL
367 	}
368 };
369 
370 const struct pciide_product_desc pciide_nvidia_products[] = {
371 	{ PCI_PRODUCT_NVIDIA_NFORCE_ATA100,
372 	  0,
373 	  "NVIDIA nForce IDE Controller",
374 	  amd7x6_chip_map
375 	},
376 	{ PCI_PRODUCT_NVIDIA_NFORCE2_ATA133,
377 	  0,
378 	  "NVIDIA nForce2 IDE Controller",
379 	  amd7x6_chip_map
380 	},
381 	{ 0,
382 	  0,
383 	  NULL,
384 	  NULL
385 	}
386 };
387 
388 const struct pciide_product_desc pciide_cmd_products[] =  {
389 	{ PCI_PRODUCT_CMDTECH_640,
390 	  0,
391 	  "CMD Technology PCI0640",
392 	  cmd_chip_map
393 	},
394 	{ PCI_PRODUCT_CMDTECH_643,
395 	  0,
396 	  "CMD Technology PCI0643",
397 	  cmd0643_9_chip_map,
398 	},
399 	{ PCI_PRODUCT_CMDTECH_646,
400 	  0,
401 	  "CMD Technology PCI0646",
402 	  cmd0643_9_chip_map,
403 	},
404 	{ PCI_PRODUCT_CMDTECH_648,
405 	  IDE_PCI_CLASS_OVERRIDE,
406 	  "CMD Technology PCI0648",
407 	  cmd0643_9_chip_map,
408 	},
409 	{ PCI_PRODUCT_CMDTECH_649,
410 	  IDE_PCI_CLASS_OVERRIDE,
411 	  "CMD Technology PCI0649",
412 	  cmd0643_9_chip_map,
413 	},
414 	{ PCI_PRODUCT_CMDTECH_680,
415 	  IDE_PCI_CLASS_OVERRIDE,
416 	  "Silicon Image 0680",
417 	  cmd680_chip_map,
418 	},
419 	{ PCI_PRODUCT_CMDTECH_3112,
420 	  IDE_PCI_CLASS_OVERRIDE,
421 	  "Silicon Image SATALink 3112",
422 	  cmd3112_chip_map,
423 	},
424 	{ 0,
425 	  0,
426 	  NULL,
427 	  NULL
428 	}
429 };
430 
431 const struct pciide_product_desc pciide_via_products[] =  {
432 	{ PCI_PRODUCT_VIATECH_VT82C586_IDE,
433 	  0,
434 	  NULL,
435 	  apollo_chip_map,
436 	 },
437 	{ PCI_PRODUCT_VIATECH_VT82C586A_IDE,
438 	  0,
439 	  NULL,
440 	  apollo_chip_map,
441 	},
442 	{ 0,
443 	  0,
444 	  NULL,
445 	  NULL
446 	}
447 };
448 
449 const struct pciide_product_desc pciide_cypress_products[] =  {
450 	{ PCI_PRODUCT_CONTAQ_82C693,
451 	  IDE_16BIT_IOSPACE,
452 	  "Cypress 82C693 IDE Controller",
453 	  cy693_chip_map,
454 	},
455 	{ 0,
456 	  0,
457 	  NULL,
458 	  NULL
459 	}
460 };
461 
462 const struct pciide_product_desc pciide_sis_products[] =  {
463 	{ PCI_PRODUCT_SIS_5597_IDE,
464 	  0,
465 	  NULL,
466 	  sis_chip_map,
467 	},
468 	{ 0,
469 	  0,
470 	  NULL,
471 	  NULL
472 	}
473 };
474 
475 const struct pciide_product_desc pciide_acer_products[] =  {
476 	{ PCI_PRODUCT_ALI_M5229,
477 	  0,
478 	  "Acer Labs M5229 UDMA IDE Controller",
479 	  acer_chip_map,
480 	},
481 	{ 0,
482 	  0,
483 	  NULL,
484 	  NULL
485 	}
486 };
487 
488 const struct pciide_product_desc pciide_promise_products[] =  {
489 	{ PCI_PRODUCT_PROMISE_ULTRA33,
490 	  IDE_PCI_CLASS_OVERRIDE,
491 	  "Promise Ultra33/ATA Bus Master IDE Accelerator",
492 	  pdc202xx_chip_map,
493 	},
494 	{ PCI_PRODUCT_PROMISE_ULTRA66,
495 	  IDE_PCI_CLASS_OVERRIDE,
496 	  "Promise Ultra66/ATA Bus Master IDE Accelerator",
497 	  pdc202xx_chip_map,
498 	},
499 	{ PCI_PRODUCT_PROMISE_ULTRA100,
500 	  IDE_PCI_CLASS_OVERRIDE,
501 	  "Promise Ultra100/ATA Bus Master IDE Accelerator",
502 	  pdc202xx_chip_map,
503 	},
504 	{ PCI_PRODUCT_PROMISE_ULTRA100X,
505 	  IDE_PCI_CLASS_OVERRIDE,
506 	  "Promise Ultra100/ATA Bus Master IDE Accelerator",
507 	  pdc202xx_chip_map,
508 	},
509 	{ PCI_PRODUCT_PROMISE_ULTRA100TX2,
510 	  IDE_PCI_CLASS_OVERRIDE,
511 	  "Promise Ultra100TX2/ATA Bus Master IDE Accelerator",
512 	  pdc202xx_chip_map,
513 	},
514 	{ PCI_PRODUCT_PROMISE_ULTRA100TX2v2,
515 	  IDE_PCI_CLASS_OVERRIDE,
516 	  "Promise Ultra100TX2v2/ATA Bus Master IDE Accelerator",
517 	  pdc202xx_chip_map,
518 	},
519 	{ PCI_PRODUCT_PROMISE_ULTRA133,
520 	  IDE_PCI_CLASS_OVERRIDE,
521 	  "Promise Ultra133/ATA Bus Master IDE Accelerator",
522 	  pdc202xx_chip_map,
523 	},
524 	{ PCI_PRODUCT_PROMISE_ULTRA133TX2,
525 	  IDE_PCI_CLASS_OVERRIDE,
526 	  "Promise Ultra133TX2/ATA Bus Master IDE Accelerator",
527 	  pdc202xx_chip_map,
528 	},
529 	{ PCI_PRODUCT_PROMISE_MBULTRA133,
530 	  IDE_PCI_CLASS_OVERRIDE,
531 	  "Promise Ultra133/ATA Bus Master IDE Accelerator (MB)",
532 	  pdc202xx_chip_map,
533 	},
534 	{ PCI_PRODUCT_PROMISE_ULTRA133TX2v2,
535 	  IDE_PCI_CLASS_OVERRIDE,
536 	  "Promise Ultra133TX2v2/ATA Bus Master IDE Accelerator",
537 	  pdc202xx_chip_map,
538 	},
539 	{ PCI_PRODUCT_PROMISE_FASTTRAK133LITE,
540 	  IDE_PCI_CLASS_OVERRIDE,
541 	  "Promise Fasttrak133 Lite Bus Master IDE Accelerator",
542 	  pdc202xx_chip_map,
543 	},
544 	{ PCI_PRODUCT_PROMISE_SATA150TX2PLUS,
545 	  IDE_PCI_CLASS_OVERRIDE,
546 	  "Promise Serial ATA/150 TX2plus Bus Master IDE Accelerator",
547 	  pdc202xx_chip_map,
548 	},
549 	{ 0,
550 	  0,
551 	  NULL,
552 	  NULL
553 	}
554 };
555 
556 const struct pciide_product_desc pciide_opti_products[] =  {
557 	{ PCI_PRODUCT_OPTI_82C621,
558 	  0,
559 	  "OPTi 82c621 PCI IDE controller",
560 	  opti_chip_map,
561 	},
562 	{ PCI_PRODUCT_OPTI_82C568,
563 	  0,
564 	  "OPTi 82c568 (82c621 compatible) PCI IDE controller",
565 	  opti_chip_map,
566 	},
567 	{ PCI_PRODUCT_OPTI_82D568,
568 	  0,
569 	  "OPTi 82d568 (82c621 compatible) PCI IDE controller",
570 	  opti_chip_map,
571 	},
572 	{ 0,
573 	  0,
574 	  NULL,
575 	  NULL
576 	}
577 };
578 
579 const struct pciide_product_desc pciide_triones_products[] =  {
580 	{ PCI_PRODUCT_TRIONES_HPT366,
581 	  IDE_PCI_CLASS_OVERRIDE,
582 	  NULL,
583 	  hpt_chip_map,
584 	},
585 	{ PCI_PRODUCT_TRIONES_HPT372,
586 	  IDE_PCI_CLASS_OVERRIDE,
587 	  NULL,
588 	  hpt_chip_map
589 	},
590 	{ PCI_PRODUCT_TRIONES_HPT374,
591 	  IDE_PCI_CLASS_OVERRIDE,
592 	  NULL,
593 	  hpt_chip_map
594 	},
595 	{ 0,
596 	  0,
597 	  NULL,
598 	  NULL
599 	}
600 };
601 
602 const struct pciide_product_desc pciide_acard_products[] =  {
603 	{ PCI_PRODUCT_ACARD_ATP850U,
604 	  IDE_PCI_CLASS_OVERRIDE,
605 	  "Acard ATP850U Ultra33 IDE Controller",
606 	  acard_chip_map,
607 	},
608 	{ PCI_PRODUCT_ACARD_ATP860,
609 	  IDE_PCI_CLASS_OVERRIDE,
610 	  "Acard ATP860 Ultra66 IDE Controller",
611 	  acard_chip_map,
612 	},
613 	{ PCI_PRODUCT_ACARD_ATP860A,
614 	  IDE_PCI_CLASS_OVERRIDE,
615 	  "Acard ATP860-A Ultra66 IDE Controller",
616 	  acard_chip_map,
617 	},
618 	{ 0,
619 	  0,
620 	  NULL,
621 	  NULL
622 	}
623 };
624 
625 const struct pciide_product_desc pciide_serverworks_products[] =  {
626 	{ PCI_PRODUCT_SERVERWORKS_OSB4_IDE,
627 	  0,
628 	  "ServerWorks OSB4 IDE Controller",
629 	  serverworks_chip_map,
630 	},
631 	{ PCI_PRODUCT_SERVERWORKS_CSB5_IDE,
632 	  0,
633 	  "ServerWorks CSB5 IDE Controller",
634 	  serverworks_chip_map,
635 	},
636 	{ PCI_PRODUCT_SERVERWORKS_CSB6_IDE,
637 	  0,
638 	  "ServerWorks CSB6 RAID/IDE Controller",
639 	  serverworks_chip_map,
640 	},
641 	{ 0,
642 	  0,
643 	  NULL,
644 	}
645 };
646 
647 const struct pciide_product_desc pciide_symphony_products[] = {
648 	{ PCI_PRODUCT_SYMPHONY_82C105,
649 	  0,
650 	  "Symphony Labs 82C105 IDE controller",
651 	  sl82c105_chip_map,
652 	},
653 	{ 0,
654 	  0,
655 	  NULL,
656 	}
657 };
658 
659 const struct pciide_product_desc pciide_winbond_products[] =  {
660 	{ PCI_PRODUCT_WINBOND_W83C553F_1,
661 	  0,
662 	  "Winbond W83C553F IDE controller",
663 	  sl82c105_chip_map,
664 	},
665 	{ 0,
666 	  0,
667 	  NULL,
668 	}
669 };
670 
671 struct pciide_vendor_desc {
672 	u_int32_t ide_vendor;
673 	const struct pciide_product_desc *ide_products;
674 };
675 
676 const struct pciide_vendor_desc pciide_vendors[] = {
677 	{ PCI_VENDOR_INTEL, pciide_intel_products },
678 	{ PCI_VENDOR_CMDTECH, pciide_cmd_products },
679 	{ PCI_VENDOR_VIATECH, pciide_via_products },
680 	{ PCI_VENDOR_CONTAQ, pciide_cypress_products },
681 	{ PCI_VENDOR_SIS, pciide_sis_products },
682 	{ PCI_VENDOR_ALI, pciide_acer_products },
683 	{ PCI_VENDOR_PROMISE, pciide_promise_products },
684 	{ PCI_VENDOR_AMD, pciide_amd_products },
685 	{ PCI_VENDOR_OPTI, pciide_opti_products },
686 	{ PCI_VENDOR_TRIONES, pciide_triones_products },
687 	{ PCI_VENDOR_ACARD, pciide_acard_products },
688 	{ PCI_VENDOR_SERVERWORKS, pciide_serverworks_products },
689 	{ PCI_VENDOR_SYMPHONY, pciide_symphony_products },
690 	{ PCI_VENDOR_WINBOND, pciide_winbond_products },
691 	{ PCI_VENDOR_NVIDIA, pciide_nvidia_products },
692 	{ 0, NULL }
693 };
694 
695 /* options passed via the 'flags' config keyword */
696 #define	PCIIDE_OPTIONS_DMA	0x01
697 #define	PCIIDE_OPTIONS_NODMA	0x02
698 
699 int	pciide_match __P((struct device *, struct cfdata *, void *));
700 void	pciide_attach __P((struct device *, struct device *, void *));
701 
702 CFATTACH_DECL(pciide, sizeof(struct pciide_softc),
703     pciide_match, pciide_attach, NULL, NULL);
704 
705 int	pciide_chipen __P((struct pciide_softc *, struct pci_attach_args *));
706 int	pciide_mapregs_compat __P(( struct pci_attach_args *,
707 	    struct pciide_channel *, int, bus_size_t *, bus_size_t*));
708 int	pciide_mapregs_native __P((struct pci_attach_args *,
709 	    struct pciide_channel *, bus_size_t *, bus_size_t *,
710 	    int (*pci_intr) __P((void *))));
711 void	pciide_mapreg_dma __P((struct pciide_softc *,
712 	    struct pci_attach_args *));
713 int	pciide_chansetup __P((struct pciide_softc *, int, pcireg_t));
714 void	pciide_mapchan __P((struct pci_attach_args *,
715 	    struct pciide_channel *, pcireg_t, bus_size_t *, bus_size_t *,
716 	    int (*pci_intr) __P((void *))));
717 int	pciide_chan_candisable __P((struct pciide_channel *));
718 void	pciide_map_compat_intr __P(( struct pci_attach_args *,
719 	    struct pciide_channel *, int, int));
720 int	pciide_compat_intr __P((void *));
721 int	pciide_pci_intr __P((void *));
722 const struct pciide_product_desc* pciide_lookup_product __P((u_int32_t));
723 
724 const struct pciide_product_desc *
725 pciide_lookup_product(id)
726 	u_int32_t id;
727 {
728 	const struct pciide_product_desc *pp;
729 	const struct pciide_vendor_desc *vp;
730 
731 	for (vp = pciide_vendors; vp->ide_products != NULL; vp++)
732 		if (PCI_VENDOR(id) == vp->ide_vendor)
733 			break;
734 
735 	if ((pp = vp->ide_products) == NULL)
736 		return NULL;
737 
738 	for (; pp->chip_map != NULL; pp++)
739 		if (PCI_PRODUCT(id) == pp->ide_product)
740 			break;
741 
742 	if (pp->chip_map == NULL)
743 		return NULL;
744 	return pp;
745 }
746 
747 int
748 pciide_match(parent, match, aux)
749 	struct device *parent;
750 	struct cfdata *match;
751 	void *aux;
752 {
753 	struct pci_attach_args *pa = aux;
754 	const struct pciide_product_desc *pp;
755 
756 	/*
757 	 * Check the ID register to see that it's a PCI IDE controller.
758 	 * If it is, we assume that we can deal with it; it _should_
759 	 * work in a standardized way...
760 	 */
761 	if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE &&
762 	    PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_IDE) {
763 		return (1);
764 	}
765 
766 	/*
767 	 * Some controllers (e.g. promise Utra-33) don't claim to be PCI IDE
768 	 * controllers. Let see if we can deal with it anyway.
769 	 */
770 	pp = pciide_lookup_product(pa->pa_id);
771 	if (pp != NULL && (pp->ide_flags & IDE_PCI_CLASS_OVERRIDE)) {
772 		return (1);
773 	}
774 
775 	return (0);
776 }
777 
778 void
779 pciide_attach(parent, self, aux)
780 	struct device *parent, *self;
781 	void *aux;
782 {
783 	struct pci_attach_args *pa = aux;
784 	pci_chipset_tag_t pc = pa->pa_pc;
785 	pcitag_t tag = pa->pa_tag;
786 	struct pciide_softc *sc = (struct pciide_softc *)self;
787 	pcireg_t csr;
788 	char devinfo[256];
789 	const char *displaydev;
790 
791 	sc->sc_pci_vendor = PCI_VENDOR(pa->pa_id);
792 	sc->sc_pp = pciide_lookup_product(pa->pa_id);
793 	if (sc->sc_pp == NULL) {
794 		sc->sc_pp = &default_product_desc;
795 		pci_devinfo(pa->pa_id, pa->pa_class, 0, devinfo);
796 		displaydev = devinfo;
797 	} else
798 		displaydev = sc->sc_pp->ide_name;
799 
800 	/* if displaydev == NULL, printf is done in chip-specific map */
801 	if (displaydev)
802 		printf(": %s (rev. 0x%02x)\n", displaydev,
803 		    PCI_REVISION(pa->pa_class));
804 
805 	sc->sc_pc = pa->pa_pc;
806 	sc->sc_tag = pa->pa_tag;
807 
808 	/* Set up DMA defaults; these might be adjusted by chip_map. */
809 	sc->sc_dma_maxsegsz = IDEDMA_BYTE_COUNT_MAX;
810 	sc->sc_dma_boundary = IDEDMA_BYTE_COUNT_ALIGN;
811 
812 #ifdef WDCDEBUG
813 	if (wdcdebug_pciide_mask & DEBUG_PROBE)
814 		pci_conf_print(sc->sc_pc, sc->sc_tag, NULL);
815 #endif
816 	sc->sc_pp->chip_map(sc, pa);
817 
818 	if (sc->sc_dma_ok) {
819 		csr = pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG);
820 		csr |= PCI_COMMAND_MASTER_ENABLE;
821 		pci_conf_write(pc, tag, PCI_COMMAND_STATUS_REG, csr);
822 	}
823 	WDCDEBUG_PRINT(("pciide: command/status register=%x\n",
824 	    pci_conf_read(pc, tag, PCI_COMMAND_STATUS_REG)), DEBUG_PROBE);
825 }
826 
827 /* tell whether the chip is enabled or not */
828 int
829 pciide_chipen(sc, pa)
830 	struct pciide_softc *sc;
831 	struct pci_attach_args *pa;
832 {
833 	pcireg_t csr;
834 	if ((pa->pa_flags & PCI_FLAGS_IO_ENABLED) == 0) {
835 		csr = pci_conf_read(sc->sc_pc, sc->sc_tag,
836 		    PCI_COMMAND_STATUS_REG);
837 		printf("%s: device disabled (at %s)\n",
838 	 	   sc->sc_wdcdev.sc_dev.dv_xname,
839 	  	  (csr & PCI_COMMAND_IO_ENABLE) == 0 ?
840 		  "device" : "bridge");
841 		return 0;
842 	}
843 	return 1;
844 }
845 
846 int
847 pciide_mapregs_compat(pa, cp, compatchan, cmdsizep, ctlsizep)
848 	struct pci_attach_args *pa;
849 	struct pciide_channel *cp;
850 	int compatchan;
851 	bus_size_t *cmdsizep, *ctlsizep;
852 {
853 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
854 	struct channel_softc *wdc_cp = &cp->wdc_channel;
855 
856 	cp->compat = 1;
857 	*cmdsizep = PCIIDE_COMPAT_CMD_SIZE;
858 	*ctlsizep = PCIIDE_COMPAT_CTL_SIZE;
859 
860 	wdc_cp->cmd_iot = pa->pa_iot;
861 	if (bus_space_map(wdc_cp->cmd_iot, PCIIDE_COMPAT_CMD_BASE(compatchan),
862 	    PCIIDE_COMPAT_CMD_SIZE, 0, &wdc_cp->cmd_ioh) != 0) {
863 		printf("%s: couldn't map %s channel cmd regs\n",
864 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
865 		return (0);
866 	}
867 
868 	wdc_cp->ctl_iot = pa->pa_iot;
869 	if (bus_space_map(wdc_cp->ctl_iot, PCIIDE_COMPAT_CTL_BASE(compatchan),
870 	    PCIIDE_COMPAT_CTL_SIZE, 0, &wdc_cp->ctl_ioh) != 0) {
871 		printf("%s: couldn't map %s channel ctl regs\n",
872 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
873 		bus_space_unmap(wdc_cp->cmd_iot, wdc_cp->cmd_ioh,
874 		    PCIIDE_COMPAT_CMD_SIZE);
875 		return (0);
876 	}
877 
878 	return (1);
879 }
880 
881 int
882 pciide_mapregs_native(pa, cp, cmdsizep, ctlsizep, pci_intr)
883 	struct pci_attach_args * pa;
884 	struct pciide_channel *cp;
885 	bus_size_t *cmdsizep, *ctlsizep;
886 	int (*pci_intr) __P((void *));
887 {
888 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
889 	struct channel_softc *wdc_cp = &cp->wdc_channel;
890 	const char *intrstr;
891 	pci_intr_handle_t intrhandle;
892 
893 	cp->compat = 0;
894 
895 	if (sc->sc_pci_ih == NULL) {
896 		if (pci_intr_map(pa, &intrhandle) != 0) {
897 			printf("%s: couldn't map native-PCI interrupt\n",
898 			    sc->sc_wdcdev.sc_dev.dv_xname);
899 			return 0;
900 		}
901 		intrstr = pci_intr_string(pa->pa_pc, intrhandle);
902 		sc->sc_pci_ih = pci_intr_establish(pa->pa_pc,
903 		    intrhandle, IPL_BIO, pci_intr, sc);
904 		if (sc->sc_pci_ih != NULL) {
905 			printf("%s: using %s for native-PCI interrupt\n",
906 			    sc->sc_wdcdev.sc_dev.dv_xname,
907 			    intrstr ? intrstr : "unknown interrupt");
908 		} else {
909 			printf("%s: couldn't establish native-PCI interrupt",
910 			    sc->sc_wdcdev.sc_dev.dv_xname);
911 			if (intrstr != NULL)
912 				printf(" at %s", intrstr);
913 			printf("\n");
914 			return 0;
915 		}
916 	}
917 	cp->ih = sc->sc_pci_ih;
918 	if (pci_mapreg_map(pa, PCIIDE_REG_CMD_BASE(wdc_cp->channel),
919 	    PCI_MAPREG_TYPE_IO, 0,
920 	    &wdc_cp->cmd_iot, &wdc_cp->cmd_ioh, NULL, cmdsizep) != 0) {
921 		printf("%s: couldn't map %s channel cmd regs\n",
922 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
923 		return 0;
924 	}
925 
926 	if (pci_mapreg_map(pa, PCIIDE_REG_CTL_BASE(wdc_cp->channel),
927 	    PCI_MAPREG_TYPE_IO, 0,
928 	    &wdc_cp->ctl_iot, &cp->ctl_baseioh, NULL, ctlsizep) != 0) {
929 		printf("%s: couldn't map %s channel ctl regs\n",
930 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
931 		bus_space_unmap(wdc_cp->cmd_iot, wdc_cp->cmd_ioh, *cmdsizep);
932 		return 0;
933 	}
934 	/*
935 	 * In native mode, 4 bytes of I/O space are mapped for the control
936 	 * register, the control register is at offset 2. Pass the generic
937 	 * code a handle for only one byte at the right offset.
938 	 */
939 	if (bus_space_subregion(wdc_cp->ctl_iot, cp->ctl_baseioh, 2, 1,
940 	    &wdc_cp->ctl_ioh) != 0) {
941 		printf("%s: unable to subregion %s channel ctl regs\n",
942 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
943 		bus_space_unmap(wdc_cp->cmd_iot, wdc_cp->cmd_ioh, *cmdsizep);
944 		bus_space_unmap(wdc_cp->cmd_iot, cp->ctl_baseioh, *ctlsizep);
945 		return 0;
946 	}
947 	return (1);
948 }
949 
950 void
951 pciide_mapreg_dma(sc, pa)
952 	struct pciide_softc *sc;
953 	struct pci_attach_args *pa;
954 {
955 	pcireg_t maptype;
956 	bus_addr_t addr;
957 
958 	/*
959 	 * Map DMA registers
960 	 *
961 	 * Note that sc_dma_ok is the right variable to test to see if
962 	 * DMA can be done.  If the interface doesn't support DMA,
963 	 * sc_dma_ok will never be non-zero.  If the DMA regs couldn't
964 	 * be mapped, it'll be zero.  I.e., sc_dma_ok will only be
965 	 * non-zero if the interface supports DMA and the registers
966 	 * could be mapped.
967 	 *
968 	 * XXX Note that despite the fact that the Bus Master IDE specs
969 	 * XXX say that "The bus master IDE function uses 16 bytes of IO
970 	 * XXX space," some controllers (at least the United
971 	 * XXX Microelectronics UM8886BF) place it in memory space.
972 	 */
973 	maptype = pci_mapreg_type(pa->pa_pc, pa->pa_tag,
974 	    PCIIDE_REG_BUS_MASTER_DMA);
975 
976 	switch (maptype) {
977 	case PCI_MAPREG_TYPE_IO:
978 		sc->sc_dma_ok = (pci_mapreg_info(pa->pa_pc, pa->pa_tag,
979 		    PCIIDE_REG_BUS_MASTER_DMA, PCI_MAPREG_TYPE_IO,
980 		    &addr, NULL, NULL) == 0);
981 		if (sc->sc_dma_ok == 0) {
982 			printf(", but unused (couldn't query registers)");
983 			break;
984 		}
985 		if ((sc->sc_pp->ide_flags & IDE_16BIT_IOSPACE)
986 		    && addr >= 0x10000) {
987 			sc->sc_dma_ok = 0;
988 			printf(", but unused (registers at unsafe address "
989 			    "%#lx)", (unsigned long)addr);
990 			break;
991 		}
992 		/* FALLTHROUGH */
993 
994 	case PCI_MAPREG_MEM_TYPE_32BIT:
995 		sc->sc_dma_ok = (pci_mapreg_map(pa,
996 		    PCIIDE_REG_BUS_MASTER_DMA, maptype, 0,
997 		    &sc->sc_dma_iot, &sc->sc_dma_ioh, NULL, NULL) == 0);
998 		sc->sc_dmat = pa->pa_dmat;
999 		if (sc->sc_dma_ok == 0) {
1000 			printf(", but unused (couldn't map registers)");
1001 		} else {
1002 			sc->sc_wdcdev.dma_arg = sc;
1003 			sc->sc_wdcdev.dma_init = pciide_dma_init;
1004 			sc->sc_wdcdev.dma_start = pciide_dma_start;
1005 			sc->sc_wdcdev.dma_finish = pciide_dma_finish;
1006 		}
1007 
1008 		if (sc->sc_wdcdev.sc_dev.dv_cfdata->cf_flags &
1009 		    PCIIDE_OPTIONS_NODMA) {
1010 			printf(", but unused (forced off by config file)");
1011 			sc->sc_dma_ok = 0;
1012 		}
1013 		break;
1014 
1015 	default:
1016 		sc->sc_dma_ok = 0;
1017 		printf(", but unsupported register maptype (0x%x)", maptype);
1018 	}
1019 }
1020 
1021 int
1022 pciide_compat_intr(arg)
1023 	void *arg;
1024 {
1025 	struct pciide_channel *cp = arg;
1026 
1027 #ifdef DIAGNOSTIC
1028 	/* should only be called for a compat channel */
1029 	if (cp->compat == 0)
1030 		panic("pciide compat intr called for non-compat chan %p", cp);
1031 #endif
1032 	return (wdcintr(&cp->wdc_channel));
1033 }
1034 
1035 int
1036 pciide_pci_intr(arg)
1037 	void *arg;
1038 {
1039 	struct pciide_softc *sc = arg;
1040 	struct pciide_channel *cp;
1041 	struct channel_softc *wdc_cp;
1042 	int i, rv, crv;
1043 
1044 	rv = 0;
1045 	for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
1046 		cp = &sc->pciide_channels[i];
1047 		wdc_cp = &cp->wdc_channel;
1048 
1049 		/* If a compat channel skip. */
1050 		if (cp->compat)
1051 			continue;
1052 		/* if this channel not waiting for intr, skip */
1053 		if ((wdc_cp->ch_flags & WDCF_IRQ_WAIT) == 0)
1054 			continue;
1055 
1056 		crv = wdcintr(wdc_cp);
1057 		if (crv == 0)
1058 			;		/* leave rv alone */
1059 		else if (crv == 1)
1060 			rv = 1;		/* claim the intr */
1061 		else if (rv == 0)	/* crv should be -1 in this case */
1062 			rv = crv;	/* if we've done no better, take it */
1063 	}
1064 	return (rv);
1065 }
1066 
1067 void
1068 pciide_channel_dma_setup(cp)
1069 	struct pciide_channel *cp;
1070 {
1071 	int drive;
1072 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1073 	struct ata_drive_datas *drvp;
1074 
1075 	for (drive = 0; drive < 2; drive++) {
1076 		drvp = &cp->wdc_channel.ch_drive[drive];
1077 		/* If no drive, skip */
1078 		if ((drvp->drive_flags & DRIVE) == 0)
1079 			continue;
1080 		/* setup DMA if needed */
1081 		if (((drvp->drive_flags & DRIVE_DMA) == 0 &&
1082 		    (drvp->drive_flags & DRIVE_UDMA) == 0) ||
1083 		    sc->sc_dma_ok == 0) {
1084 			drvp->drive_flags &= ~(DRIVE_DMA | DRIVE_UDMA);
1085 			continue;
1086 		}
1087 		if (pciide_dma_table_setup(sc, cp->wdc_channel.channel, drive)
1088 		    != 0) {
1089 			/* Abort DMA setup */
1090 			drvp->drive_flags &= ~(DRIVE_DMA | DRIVE_UDMA);
1091 			continue;
1092 		}
1093 	}
1094 }
1095 
1096 int
1097 pciide_dma_table_setup(sc, channel, drive)
1098 	struct pciide_softc *sc;
1099 	int channel, drive;
1100 {
1101 	bus_dma_segment_t seg;
1102 	int error, rseg;
1103 	const bus_size_t dma_table_size =
1104 	    sizeof(struct idedma_table) * NIDEDMA_TABLES;
1105 	struct pciide_dma_maps *dma_maps =
1106 	    &sc->pciide_channels[channel].dma_maps[drive];
1107 
1108 	/* If table was already allocated, just return */
1109 	if (dma_maps->dma_table)
1110 		return 0;
1111 
1112 	/* Allocate memory for the DMA tables and map it */
1113 	if ((error = bus_dmamem_alloc(sc->sc_dmat, dma_table_size,
1114 	    IDEDMA_TBL_ALIGN, IDEDMA_TBL_ALIGN, &seg, 1, &rseg,
1115 	    BUS_DMA_NOWAIT)) != 0) {
1116 		printf(dmaerrfmt, sc->sc_wdcdev.sc_dev.dv_xname, channel,
1117 		    "allocate", drive, error);
1118 		return error;
1119 	}
1120 	if ((error = bus_dmamem_map(sc->sc_dmat, &seg, rseg,
1121 	    dma_table_size,
1122 	    (caddr_t *)&dma_maps->dma_table,
1123 	    BUS_DMA_NOWAIT|BUS_DMA_COHERENT)) != 0) {
1124 		printf(dmaerrfmt, sc->sc_wdcdev.sc_dev.dv_xname, channel,
1125 		    "map", drive, error);
1126 		return error;
1127 	}
1128 	WDCDEBUG_PRINT(("pciide_dma_table_setup: table at %p len %lu, "
1129 	    "phy 0x%lx\n", dma_maps->dma_table, (u_long)dma_table_size,
1130 	    (unsigned long)seg.ds_addr), DEBUG_PROBE);
1131 	/* Create and load table DMA map for this disk */
1132 	if ((error = bus_dmamap_create(sc->sc_dmat, dma_table_size,
1133 	    1, dma_table_size, IDEDMA_TBL_ALIGN, BUS_DMA_NOWAIT,
1134 	    &dma_maps->dmamap_table)) != 0) {
1135 		printf(dmaerrfmt, sc->sc_wdcdev.sc_dev.dv_xname, channel,
1136 		    "create", drive, error);
1137 		return error;
1138 	}
1139 	if ((error = bus_dmamap_load(sc->sc_dmat,
1140 	    dma_maps->dmamap_table,
1141 	    dma_maps->dma_table,
1142 	    dma_table_size, NULL, BUS_DMA_NOWAIT)) != 0) {
1143 		printf(dmaerrfmt, sc->sc_wdcdev.sc_dev.dv_xname, channel,
1144 		    "load", drive, error);
1145 		return error;
1146 	}
1147 	WDCDEBUG_PRINT(("pciide_dma_table_setup: phy addr of table 0x%lx\n",
1148 	    (unsigned long)dma_maps->dmamap_table->dm_segs[0].ds_addr),
1149 	    DEBUG_PROBE);
1150 	/* Create a xfer DMA map for this drive */
1151 	if ((error = bus_dmamap_create(sc->sc_dmat, IDEDMA_BYTE_COUNT_MAX,
1152 	    NIDEDMA_TABLES, sc->sc_dma_maxsegsz, sc->sc_dma_boundary,
1153 	    BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW,
1154 	    &dma_maps->dmamap_xfer)) != 0) {
1155 		printf(dmaerrfmt, sc->sc_wdcdev.sc_dev.dv_xname, channel,
1156 		    "create xfer", drive, error);
1157 		return error;
1158 	}
1159 	return 0;
1160 }
1161 
1162 int
1163 pciide_dma_init(v, channel, drive, databuf, datalen, flags)
1164 	void *v;
1165 	int channel, drive;
1166 	void *databuf;
1167 	size_t datalen;
1168 	int flags;
1169 {
1170 	struct pciide_softc *sc = v;
1171 	int error, seg;
1172 	struct pciide_dma_maps *dma_maps =
1173 	    &sc->pciide_channels[channel].dma_maps[drive];
1174 
1175 	error = bus_dmamap_load(sc->sc_dmat,
1176 	    dma_maps->dmamap_xfer,
1177 	    databuf, datalen, NULL, BUS_DMA_NOWAIT | BUS_DMA_STREAMING |
1178 	    ((flags & WDC_DMA_READ) ? BUS_DMA_READ : BUS_DMA_WRITE));
1179 	if (error) {
1180 		printf(dmaerrfmt, sc->sc_wdcdev.sc_dev.dv_xname, channel,
1181 		    "load xfer", drive, error);
1182 		return error;
1183 	}
1184 
1185 	bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_xfer, 0,
1186 	    dma_maps->dmamap_xfer->dm_mapsize,
1187 	    (flags & WDC_DMA_READ) ?
1188 	    BUS_DMASYNC_PREREAD : BUS_DMASYNC_PREWRITE);
1189 
1190 	for (seg = 0; seg < dma_maps->dmamap_xfer->dm_nsegs; seg++) {
1191 #ifdef DIAGNOSTIC
1192 		/* A segment must not cross a 64k boundary */
1193 		{
1194 		u_long phys = dma_maps->dmamap_xfer->dm_segs[seg].ds_addr;
1195 		u_long len = dma_maps->dmamap_xfer->dm_segs[seg].ds_len;
1196 		if ((phys & ~IDEDMA_BYTE_COUNT_MASK) !=
1197 		    ((phys + len - 1) & ~IDEDMA_BYTE_COUNT_MASK)) {
1198 			printf("pciide_dma: segment %d physical addr 0x%lx"
1199 			    " len 0x%lx not properly aligned\n",
1200 			    seg, phys, len);
1201 			panic("pciide_dma: buf align");
1202 		}
1203 		}
1204 #endif
1205 		dma_maps->dma_table[seg].base_addr =
1206 		    htole32(dma_maps->dmamap_xfer->dm_segs[seg].ds_addr);
1207 		dma_maps->dma_table[seg].byte_count =
1208 		    htole32(dma_maps->dmamap_xfer->dm_segs[seg].ds_len &
1209 		    IDEDMA_BYTE_COUNT_MASK);
1210 		WDCDEBUG_PRINT(("\t seg %d len %d addr 0x%x\n",
1211 		   seg, le32toh(dma_maps->dma_table[seg].byte_count),
1212 		   le32toh(dma_maps->dma_table[seg].base_addr)), DEBUG_DMA);
1213 
1214 	}
1215 	dma_maps->dma_table[dma_maps->dmamap_xfer->dm_nsegs -1].byte_count |=
1216 	    htole32(IDEDMA_BYTE_COUNT_EOT);
1217 
1218 	bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_table, 0,
1219 	    dma_maps->dmamap_table->dm_mapsize,
1220 	    BUS_DMASYNC_PREWRITE);
1221 
1222 	/* Maps are ready. Start DMA function */
1223 #ifdef DIAGNOSTIC
1224 	if (dma_maps->dmamap_table->dm_segs[0].ds_addr & ~IDEDMA_TBL_MASK) {
1225 		printf("pciide_dma_init: addr 0x%lx not properly aligned\n",
1226 		    (u_long)dma_maps->dmamap_table->dm_segs[0].ds_addr);
1227 		panic("pciide_dma_init: table align");
1228 	}
1229 #endif
1230 
1231 	/* Clear status bits */
1232 	bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1233 	    IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel,
1234 	    bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1235 		IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel));
1236 	/* Write table addr */
1237 	bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh,
1238 	    IDEDMA_TBL + IDEDMA_SCH_OFFSET * channel,
1239 	    dma_maps->dmamap_table->dm_segs[0].ds_addr);
1240 	/* set read/write */
1241 	bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1242 	    IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel,
1243 	    (flags & WDC_DMA_READ) ? IDEDMA_CMD_WRITE: 0);
1244 	/* remember flags */
1245 	dma_maps->dma_flags = flags;
1246 	return 0;
1247 }
1248 
1249 void
1250 pciide_dma_start(v, channel, drive)
1251 	void *v;
1252 	int channel, drive;
1253 {
1254 	struct pciide_softc *sc = v;
1255 
1256 	WDCDEBUG_PRINT(("pciide_dma_start\n"),DEBUG_XFERS);
1257 	bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1258 	    IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel,
1259 	    bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1260 		IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel) | IDEDMA_CMD_START);
1261 }
1262 
1263 int
1264 pciide_dma_finish(v, channel, drive, force)
1265 	void *v;
1266 	int channel, drive;
1267 	int force;
1268 {
1269 	struct pciide_softc *sc = v;
1270 	u_int8_t status;
1271 	int error = 0;
1272 	struct pciide_dma_maps *dma_maps =
1273 	    &sc->pciide_channels[channel].dma_maps[drive];
1274 
1275 	status = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1276 	    IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel);
1277 	WDCDEBUG_PRINT(("pciide_dma_finish: status 0x%x\n", status),
1278 	    DEBUG_XFERS);
1279 
1280 	if (force == 0 && (status & IDEDMA_CTL_INTR) == 0)
1281 		return WDC_DMAST_NOIRQ;
1282 
1283 	/* stop DMA channel */
1284 	bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1285 	    IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel,
1286 	    bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1287 		IDEDMA_CMD + IDEDMA_SCH_OFFSET * channel) & ~IDEDMA_CMD_START);
1288 
1289 	/* Unload the map of the data buffer */
1290 	bus_dmamap_sync(sc->sc_dmat, dma_maps->dmamap_xfer, 0,
1291 	    dma_maps->dmamap_xfer->dm_mapsize,
1292 	    (dma_maps->dma_flags & WDC_DMA_READ) ?
1293 	    BUS_DMASYNC_POSTREAD : BUS_DMASYNC_POSTWRITE);
1294 	bus_dmamap_unload(sc->sc_dmat, dma_maps->dmamap_xfer);
1295 
1296 	if ((status & IDEDMA_CTL_ERR) != 0) {
1297 		printf("%s:%d:%d: bus-master DMA error: status=0x%x\n",
1298 		    sc->sc_wdcdev.sc_dev.dv_xname, channel, drive, status);
1299 		error |= WDC_DMAST_ERR;
1300 	}
1301 
1302 	if ((status & IDEDMA_CTL_INTR) == 0) {
1303 		printf("%s:%d:%d: bus-master DMA error: missing interrupt, "
1304 		    "status=0x%x\n", sc->sc_wdcdev.sc_dev.dv_xname, channel,
1305 		    drive, status);
1306 		error |= WDC_DMAST_NOIRQ;
1307 	}
1308 
1309 	if ((status & IDEDMA_CTL_ACT) != 0) {
1310 		/* data underrun, may be a valid condition for ATAPI */
1311 		error |= WDC_DMAST_UNDER;
1312 	}
1313 	return error;
1314 }
1315 
1316 void
1317 pciide_irqack(chp)
1318 	struct channel_softc *chp;
1319 {
1320 	struct pciide_channel *cp = (struct pciide_channel*)chp;
1321 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1322 
1323 	/* clear status bits in IDE DMA registers */
1324 	bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1325 	    IDEDMA_CTL + IDEDMA_SCH_OFFSET * chp->channel,
1326 	    bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1327 		IDEDMA_CTL + IDEDMA_SCH_OFFSET * chp->channel));
1328 }
1329 
1330 /* some common code used by several chip_map */
1331 int
1332 pciide_chansetup(sc, channel, interface)
1333 	struct pciide_softc *sc;
1334 	int channel;
1335 	pcireg_t interface;
1336 {
1337 	struct pciide_channel *cp = &sc->pciide_channels[channel];
1338 	sc->wdc_chanarray[channel] = &cp->wdc_channel;
1339 	cp->name = PCIIDE_CHANNEL_NAME(channel);
1340 	cp->wdc_channel.channel = channel;
1341 	cp->wdc_channel.wdc = &sc->sc_wdcdev;
1342 	cp->wdc_channel.ch_queue =
1343 	    malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT);
1344 	if (cp->wdc_channel.ch_queue == NULL) {
1345 		printf("%s %s channel: "
1346 		    "can't allocate memory for command queue",
1347 		sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1348 		return 0;
1349 	}
1350 	printf("%s: %s channel %s to %s mode\n",
1351 	    sc->sc_wdcdev.sc_dev.dv_xname, cp->name,
1352 	    (interface & PCIIDE_INTERFACE_SETTABLE(channel)) ?
1353 	    "configured" : "wired",
1354 	    (interface & PCIIDE_INTERFACE_PCI(channel)) ?
1355 	    "native-PCI" : "compatibility");
1356 	return 1;
1357 }
1358 
1359 /* some common code used by several chip channel_map */
1360 void
1361 pciide_mapchan(pa, cp, interface, cmdsizep, ctlsizep, pci_intr)
1362 	struct pci_attach_args *pa;
1363 	struct pciide_channel *cp;
1364 	pcireg_t interface;
1365 	bus_size_t *cmdsizep, *ctlsizep;
1366 	int (*pci_intr) __P((void *));
1367 {
1368 	struct channel_softc *wdc_cp = &cp->wdc_channel;
1369 
1370 	if (interface & PCIIDE_INTERFACE_PCI(wdc_cp->channel))
1371 		cp->hw_ok = pciide_mapregs_native(pa, cp, cmdsizep, ctlsizep,
1372 		    pci_intr);
1373 	else
1374 		cp->hw_ok = pciide_mapregs_compat(pa, cp,
1375 		    wdc_cp->channel, cmdsizep, ctlsizep);
1376 
1377 	if (cp->hw_ok == 0)
1378 		return;
1379 	wdc_cp->data32iot = wdc_cp->cmd_iot;
1380 	wdc_cp->data32ioh = wdc_cp->cmd_ioh;
1381 	wdcattach(wdc_cp);
1382 }
1383 
1384 /*
1385  * Generic code to call to know if a channel can be disabled. Return 1
1386  * if channel can be disabled, 0 if not
1387  */
1388 int
1389 pciide_chan_candisable(cp)
1390 	struct pciide_channel *cp;
1391 {
1392 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1393 	struct channel_softc *wdc_cp = &cp->wdc_channel;
1394 
1395 	if ((wdc_cp->ch_drive[0].drive_flags & DRIVE) == 0 &&
1396 	    (wdc_cp->ch_drive[1].drive_flags & DRIVE) == 0) {
1397 		printf("%s: disabling %s channel (no drives)\n",
1398 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1399 		cp->hw_ok = 0;
1400 		return 1;
1401 	}
1402 	return 0;
1403 }
1404 
1405 /*
1406  * generic code to map the compat intr if hw_ok=1 and it is a compat channel.
1407  * Set hw_ok=0 on failure
1408  */
1409 void
1410 pciide_map_compat_intr(pa, cp, compatchan, interface)
1411 	struct pci_attach_args *pa;
1412 	struct pciide_channel *cp;
1413 	int compatchan, interface;
1414 {
1415 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1416 	struct channel_softc *wdc_cp = &cp->wdc_channel;
1417 
1418 	if (cp->hw_ok == 0)
1419 		return;
1420 	if ((interface & PCIIDE_INTERFACE_PCI(wdc_cp->channel)) != 0)
1421 		return;
1422 
1423 #ifdef __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_ESTABLISH
1424 	cp->ih = pciide_machdep_compat_intr_establish(&sc->sc_wdcdev.sc_dev,
1425 	    pa, compatchan, pciide_compat_intr, cp);
1426 	if (cp->ih == NULL) {
1427 #endif
1428 		printf("%s: no compatibility interrupt for use by %s "
1429 		    "channel\n", sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1430 		cp->hw_ok = 0;
1431 #ifdef __HAVE_PCIIDE_MACHDEP_COMPAT_INTR_ESTABLISH
1432 	}
1433 #endif
1434 }
1435 
1436 void
1437 pciide_print_modes(cp)
1438 	struct pciide_channel *cp;
1439 {
1440 	wdc_print_modes(&cp->wdc_channel);
1441 }
1442 
1443 void
1444 default_chip_map(sc, pa)
1445 	struct pciide_softc *sc;
1446 	struct pci_attach_args *pa;
1447 {
1448 	struct pciide_channel *cp;
1449 	pcireg_t interface = PCI_INTERFACE(pa->pa_class);
1450 	pcireg_t csr;
1451 	int channel, drive;
1452 	struct ata_drive_datas *drvp;
1453 	u_int8_t idedma_ctl;
1454 	bus_size_t cmdsize, ctlsize;
1455 	char *failreason;
1456 
1457 	if (pciide_chipen(sc, pa) == 0)
1458 		return;
1459 
1460 	if (interface & PCIIDE_INTERFACE_BUS_MASTER_DMA) {
1461 		printf("%s: bus-master DMA support present",
1462 		    sc->sc_wdcdev.sc_dev.dv_xname);
1463 		if (sc->sc_pp == &default_product_desc &&
1464 		    (sc->sc_wdcdev.sc_dev.dv_cfdata->cf_flags &
1465 		    PCIIDE_OPTIONS_DMA) == 0) {
1466 			printf(", but unused (no driver support)");
1467 			sc->sc_dma_ok = 0;
1468 		} else {
1469 			pciide_mapreg_dma(sc, pa);
1470 			if (sc->sc_dma_ok != 0)
1471 				printf(", used without full driver "
1472 				    "support");
1473 		}
1474 	} else {
1475 		printf("%s: hardware does not support DMA",
1476 		    sc->sc_wdcdev.sc_dev.dv_xname);
1477 		sc->sc_dma_ok = 0;
1478 	}
1479 	printf("\n");
1480 	if (sc->sc_dma_ok) {
1481 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
1482 		sc->sc_wdcdev.irqack = pciide_irqack;
1483 	}
1484 	sc->sc_wdcdev.PIO_cap = 0;
1485 	sc->sc_wdcdev.DMA_cap = 0;
1486 
1487 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
1488 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
1489 	sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16;
1490 
1491 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
1492 		cp = &sc->pciide_channels[channel];
1493 		if (pciide_chansetup(sc, channel, interface) == 0)
1494 			continue;
1495 		if (interface & PCIIDE_INTERFACE_PCI(channel)) {
1496 			cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize,
1497 			    &ctlsize, pciide_pci_intr);
1498 		} else {
1499 			cp->hw_ok = pciide_mapregs_compat(pa, cp,
1500 			    channel, &cmdsize, &ctlsize);
1501 		}
1502 		if (cp->hw_ok == 0)
1503 			continue;
1504 		/*
1505 		 * Check to see if something appears to be there.
1506 		 */
1507 		failreason = NULL;
1508 		if (!wdcprobe(&cp->wdc_channel)) {
1509 			failreason = "not responding; disabled or no drives?";
1510 			goto next;
1511 		}
1512 		/*
1513 		 * Now, make sure it's actually attributable to this PCI IDE
1514 		 * channel by trying to access the channel again while the
1515 		 * PCI IDE controller's I/O space is disabled.  (If the
1516 		 * channel no longer appears to be there, it belongs to
1517 		 * this controller.)  YUCK!
1518 		 */
1519 		csr = pci_conf_read(sc->sc_pc, sc->sc_tag,
1520 		    PCI_COMMAND_STATUS_REG);
1521 		pci_conf_write(sc->sc_pc, sc->sc_tag, PCI_COMMAND_STATUS_REG,
1522 		    csr & ~PCI_COMMAND_IO_ENABLE);
1523 		if (wdcprobe(&cp->wdc_channel))
1524 			failreason = "other hardware responding at addresses";
1525 		pci_conf_write(sc->sc_pc, sc->sc_tag,
1526 		    PCI_COMMAND_STATUS_REG, csr);
1527 next:
1528 		if (failreason) {
1529 			printf("%s: %s channel ignored (%s)\n",
1530 			    sc->sc_wdcdev.sc_dev.dv_xname, cp->name,
1531 			    failreason);
1532 			cp->hw_ok = 0;
1533 			bus_space_unmap(cp->wdc_channel.cmd_iot,
1534 			    cp->wdc_channel.cmd_ioh, cmdsize);
1535 			if (interface & PCIIDE_INTERFACE_PCI(channel))
1536 				bus_space_unmap(cp->wdc_channel.ctl_iot,
1537 				    cp->ctl_baseioh, ctlsize);
1538 			else
1539 				bus_space_unmap(cp->wdc_channel.ctl_iot,
1540 				    cp->wdc_channel.ctl_ioh, ctlsize);
1541 		} else {
1542 			pciide_map_compat_intr(pa, cp, channel, interface);
1543 		}
1544 		if (cp->hw_ok) {
1545 			cp->wdc_channel.data32iot = cp->wdc_channel.cmd_iot;
1546 			cp->wdc_channel.data32ioh = cp->wdc_channel.cmd_ioh;
1547 			wdcattach(&cp->wdc_channel);
1548 		}
1549 	}
1550 
1551 	if (sc->sc_dma_ok == 0)
1552 		return;
1553 
1554 	/* Allocate DMA maps */
1555 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
1556 		idedma_ctl = 0;
1557 		cp = &sc->pciide_channels[channel];
1558 		for (drive = 0; drive < 2; drive++) {
1559 			drvp = &cp->wdc_channel.ch_drive[drive];
1560 			/* If no drive, skip */
1561 			if ((drvp->drive_flags & DRIVE) == 0)
1562 				continue;
1563 			if ((drvp->drive_flags & DRIVE_DMA) == 0)
1564 				continue;
1565 			if (pciide_dma_table_setup(sc, channel, drive) != 0) {
1566 				/* Abort DMA setup */
1567 				printf("%s:%d:%d: can't allocate DMA maps, "
1568 				    "using PIO transfers\n",
1569 				    sc->sc_wdcdev.sc_dev.dv_xname,
1570 				    channel, drive);
1571 				drvp->drive_flags &= ~DRIVE_DMA;
1572 			}
1573 			printf("%s:%d:%d: using DMA data transfers\n",
1574 			    sc->sc_wdcdev.sc_dev.dv_xname,
1575 			    channel, drive);
1576 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
1577 		}
1578 		if (idedma_ctl != 0) {
1579 			/* Add software bits in status register */
1580 			bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1581 			    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * channel),
1582 			    idedma_ctl);
1583 		}
1584 	}
1585 }
1586 
1587 void
1588 sata_setup_channel(chp)
1589 	struct channel_softc *chp;
1590 {
1591 	struct ata_drive_datas *drvp;
1592 	int drive;
1593 	u_int32_t idedma_ctl;
1594 	struct pciide_channel *cp = (struct pciide_channel*)chp;
1595 	struct pciide_softc *sc = (struct pciide_softc*)cp->wdc_channel.wdc;
1596 
1597 	/* setup DMA if needed */
1598 	pciide_channel_dma_setup(cp);
1599 
1600 	idedma_ctl = 0;
1601 
1602 	for (drive = 0; drive < 2; drive++) {
1603 		drvp = &chp->ch_drive[drive];
1604 		/* If no drive, skip */
1605 		if ((drvp->drive_flags & DRIVE) == 0)
1606 			continue;
1607 		if (drvp->drive_flags & DRIVE_UDMA) {
1608 			/* use Ultra/DMA */
1609 			drvp->drive_flags &= ~DRIVE_DMA;
1610 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
1611 		} else if (drvp->drive_flags & DRIVE_DMA) {
1612 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
1613 		}
1614 	}
1615 
1616 	/*
1617 	 * Nothing to do to setup modes; it is meaningless in S-ATA
1618 	 * (but many S-ATA drives still want to get the SET_FEATURE
1619 	 * command).
1620 	 */
1621 	if (idedma_ctl != 0) {
1622 		/* Add software bits in status register */
1623 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1624 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
1625 		    idedma_ctl);
1626 	}
1627 	pciide_print_modes(cp);
1628 }
1629 
1630 void
1631 piix_chip_map(sc, pa)
1632 	struct pciide_softc *sc;
1633 	struct pci_attach_args *pa;
1634 {
1635 	struct pciide_channel *cp;
1636 	int channel;
1637 	u_int32_t idetim;
1638 	bus_size_t cmdsize, ctlsize;
1639 
1640 	if (pciide_chipen(sc, pa) == 0)
1641 		return;
1642 
1643 	printf("%s: bus-master DMA support present",
1644 	    sc->sc_wdcdev.sc_dev.dv_xname);
1645 	pciide_mapreg_dma(sc, pa);
1646 	printf("\n");
1647 	sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
1648 	    WDC_CAPABILITY_MODE;
1649 	if (sc->sc_dma_ok) {
1650 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
1651 		sc->sc_wdcdev.irqack = pciide_irqack;
1652 		switch(sc->sc_pp->ide_product) {
1653 		case PCI_PRODUCT_INTEL_82371AB_IDE:
1654 		case PCI_PRODUCT_INTEL_82440MX_IDE:
1655 		case PCI_PRODUCT_INTEL_82801AA_IDE:
1656 		case PCI_PRODUCT_INTEL_82801AB_IDE:
1657 		case PCI_PRODUCT_INTEL_82801BA_IDE:
1658 		case PCI_PRODUCT_INTEL_82801BAM_IDE:
1659 		case PCI_PRODUCT_INTEL_82801CA_IDE_1:
1660 		case PCI_PRODUCT_INTEL_82801CA_IDE_2:
1661 		case PCI_PRODUCT_INTEL_82801DB_IDE:
1662 		case PCI_PRODUCT_INTEL_82801DBM_IDE:
1663 			sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
1664 		}
1665 	}
1666 	sc->sc_wdcdev.PIO_cap = 4;
1667 	sc->sc_wdcdev.DMA_cap = 2;
1668 	switch(sc->sc_pp->ide_product) {
1669 	case PCI_PRODUCT_INTEL_82801AA_IDE:
1670 		sc->sc_wdcdev.UDMA_cap = 4;
1671 		break;
1672 	case PCI_PRODUCT_INTEL_82801BA_IDE:
1673 	case PCI_PRODUCT_INTEL_82801BAM_IDE:
1674 	case PCI_PRODUCT_INTEL_82801CA_IDE_1:
1675 	case PCI_PRODUCT_INTEL_82801CA_IDE_2:
1676 	case PCI_PRODUCT_INTEL_82801DB_IDE:
1677 	case PCI_PRODUCT_INTEL_82801DBM_IDE:
1678 		sc->sc_wdcdev.UDMA_cap = 5;
1679 		break;
1680 	default:
1681 		sc->sc_wdcdev.UDMA_cap = 2;
1682 	}
1683 	if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82371FB_IDE)
1684 		sc->sc_wdcdev.set_modes = piix_setup_channel;
1685 	else
1686 		sc->sc_wdcdev.set_modes = piix3_4_setup_channel;
1687 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
1688 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
1689 
1690 	WDCDEBUG_PRINT(("piix_setup_chip: old idetim=0x%x",
1691 	    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM)),
1692 	    DEBUG_PROBE);
1693 	if (sc->sc_pp->ide_product != PCI_PRODUCT_INTEL_82371FB_IDE) {
1694 		WDCDEBUG_PRINT((", sidetim=0x%x",
1695 		    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM)),
1696 		    DEBUG_PROBE);
1697 		if (sc->sc_wdcdev.cap & WDC_CAPABILITY_UDMA) {
1698 			WDCDEBUG_PRINT((", udamreg 0x%x",
1699 			    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG)),
1700 			    DEBUG_PROBE);
1701 		}
1702 		if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE ||
1703 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE ||
1704 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE ||
1705 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE ||
1706 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 ||
1707 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 ||
1708 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE ||
1709 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE) {
1710 			WDCDEBUG_PRINT((", IDE_CONTROL 0x%x",
1711 			    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG)),
1712 			    DEBUG_PROBE);
1713 		}
1714 
1715 	}
1716 	WDCDEBUG_PRINT(("\n"), DEBUG_PROBE);
1717 
1718 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
1719 		cp = &sc->pciide_channels[channel];
1720 		/* PIIX is compat-only */
1721 		if (pciide_chansetup(sc, channel, 0) == 0)
1722 			continue;
1723 		idetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM);
1724 		if ((PIIX_IDETIM_READ(idetim, channel) &
1725 		    PIIX_IDETIM_IDE) == 0) {
1726 			printf("%s: %s channel ignored (disabled)\n",
1727 			    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
1728 			continue;
1729 		}
1730 		/* PIIX are compat-only pciide devices */
1731 		pciide_mapchan(pa, cp, 0, &cmdsize, &ctlsize, pciide_pci_intr);
1732 		if (cp->hw_ok == 0)
1733 			continue;
1734 		if (pciide_chan_candisable(cp)) {
1735 			idetim = PIIX_IDETIM_CLEAR(idetim, PIIX_IDETIM_IDE,
1736 			    channel);
1737 			pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM,
1738 			    idetim);
1739 		}
1740 		pciide_map_compat_intr(pa, cp, channel, 0);
1741 		if (cp->hw_ok == 0)
1742 			continue;
1743 		sc->sc_wdcdev.set_modes(&cp->wdc_channel);
1744 	}
1745 
1746 	WDCDEBUG_PRINT(("piix_setup_chip: idetim=0x%x",
1747 	    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM)),
1748 	    DEBUG_PROBE);
1749 	if (sc->sc_pp->ide_product != PCI_PRODUCT_INTEL_82371FB_IDE) {
1750 		WDCDEBUG_PRINT((", sidetim=0x%x",
1751 		    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM)),
1752 		    DEBUG_PROBE);
1753 		if (sc->sc_wdcdev.cap & WDC_CAPABILITY_UDMA) {
1754 			WDCDEBUG_PRINT((", udamreg 0x%x",
1755 			    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG)),
1756 			    DEBUG_PROBE);
1757 		}
1758 		if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE ||
1759 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE ||
1760 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE ||
1761 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE ||
1762 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 ||
1763 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 ||
1764 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE ||
1765 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE) {
1766 			WDCDEBUG_PRINT((", IDE_CONTROL 0x%x",
1767 			    pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG)),
1768 			    DEBUG_PROBE);
1769 		}
1770 	}
1771 	WDCDEBUG_PRINT(("\n"), DEBUG_PROBE);
1772 }
1773 
1774 void
1775 piix_setup_channel(chp)
1776 	struct channel_softc *chp;
1777 {
1778 	u_int8_t mode[2], drive;
1779 	u_int32_t oidetim, idetim, idedma_ctl;
1780 	struct pciide_channel *cp = (struct pciide_channel*)chp;
1781 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1782 	struct ata_drive_datas *drvp = cp->wdc_channel.ch_drive;
1783 
1784 	oidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM);
1785 	idetim = PIIX_IDETIM_CLEAR(oidetim, 0xffff, chp->channel);
1786 	idedma_ctl = 0;
1787 
1788 	/* set up new idetim: Enable IDE registers decode */
1789 	idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE,
1790 	    chp->channel);
1791 
1792 	/* setup DMA */
1793 	pciide_channel_dma_setup(cp);
1794 
1795 	/*
1796 	 * Here we have to mess up with drives mode: PIIX can't have
1797 	 * different timings for master and slave drives.
1798 	 * We need to find the best combination.
1799 	 */
1800 
1801 	/* If both drives supports DMA, take the lower mode */
1802 	if ((drvp[0].drive_flags & DRIVE_DMA) &&
1803 	    (drvp[1].drive_flags & DRIVE_DMA)) {
1804 		mode[0] = mode[1] =
1805 		    min(drvp[0].DMA_mode, drvp[1].DMA_mode);
1806 		    drvp[0].DMA_mode = mode[0];
1807 		    drvp[1].DMA_mode = mode[1];
1808 		goto ok;
1809 	}
1810 	/*
1811 	 * If only one drive supports DMA, use its mode, and
1812 	 * put the other one in PIO mode 0 if mode not compatible
1813 	 */
1814 	if (drvp[0].drive_flags & DRIVE_DMA) {
1815 		mode[0] = drvp[0].DMA_mode;
1816 		mode[1] = drvp[1].PIO_mode;
1817 		if (piix_isp_pio[mode[1]] != piix_isp_dma[mode[0]] ||
1818 		    piix_rtc_pio[mode[1]] != piix_rtc_dma[mode[0]])
1819 			mode[1] = drvp[1].PIO_mode = 0;
1820 		goto ok;
1821 	}
1822 	if (drvp[1].drive_flags & DRIVE_DMA) {
1823 		mode[1] = drvp[1].DMA_mode;
1824 		mode[0] = drvp[0].PIO_mode;
1825 		if (piix_isp_pio[mode[0]] != piix_isp_dma[mode[1]] ||
1826 		    piix_rtc_pio[mode[0]] != piix_rtc_dma[mode[1]])
1827 			mode[0] = drvp[0].PIO_mode = 0;
1828 		goto ok;
1829 	}
1830 	/*
1831 	 * If both drives are not DMA, takes the lower mode, unless
1832 	 * one of them is PIO mode < 2
1833 	 */
1834 	if (drvp[0].PIO_mode < 2) {
1835 		mode[0] = drvp[0].PIO_mode = 0;
1836 		mode[1] = drvp[1].PIO_mode;
1837 	} else if (drvp[1].PIO_mode < 2) {
1838 		mode[1] = drvp[1].PIO_mode = 0;
1839 		mode[0] = drvp[0].PIO_mode;
1840 	} else {
1841 		mode[0] = mode[1] =
1842 		    min(drvp[1].PIO_mode, drvp[0].PIO_mode);
1843 		drvp[0].PIO_mode = mode[0];
1844 		drvp[1].PIO_mode = mode[1];
1845 	}
1846 ok:	/* The modes are setup */
1847 	for (drive = 0; drive < 2; drive++) {
1848 		if (drvp[drive].drive_flags & DRIVE_DMA) {
1849 			idetim |= piix_setup_idetim_timings(
1850 			    mode[drive], 1, chp->channel);
1851 			goto end;
1852 		}
1853 	}
1854 	/* If we are there, none of the drives are DMA */
1855 	if (mode[0] >= 2)
1856 		idetim |= piix_setup_idetim_timings(
1857 		    mode[0], 0, chp->channel);
1858 	else
1859 		idetim |= piix_setup_idetim_timings(
1860 		    mode[1], 0, chp->channel);
1861 end:	/*
1862 	 * timing mode is now set up in the controller. Enable
1863 	 * it per-drive
1864 	 */
1865 	for (drive = 0; drive < 2; drive++) {
1866 		/* If no drive, skip */
1867 		if ((drvp[drive].drive_flags & DRIVE) == 0)
1868 			continue;
1869 		idetim |= piix_setup_idetim_drvs(&drvp[drive]);
1870 		if (drvp[drive].drive_flags & DRIVE_DMA)
1871 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
1872 	}
1873 	if (idedma_ctl != 0) {
1874 		/* Add software bits in status register */
1875 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
1876 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
1877 		    idedma_ctl);
1878 	}
1879 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, idetim);
1880 	pciide_print_modes(cp);
1881 }
1882 
1883 void
1884 piix3_4_setup_channel(chp)
1885 	struct channel_softc *chp;
1886 {
1887 	struct ata_drive_datas *drvp;
1888 	u_int32_t oidetim, idetim, sidetim, udmareg, ideconf, idedma_ctl;
1889 	struct pciide_channel *cp = (struct pciide_channel*)chp;
1890 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
1891 	int drive;
1892 	int channel = chp->channel;
1893 
1894 	oidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_IDETIM);
1895 	sidetim = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM);
1896 	udmareg = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG);
1897 	ideconf = pci_conf_read(sc->sc_pc, sc->sc_tag, PIIX_CONFIG);
1898 	idetim = PIIX_IDETIM_CLEAR(oidetim, 0xffff, channel);
1899 	sidetim &= ~(PIIX_SIDETIM_ISP_MASK(channel) |
1900 	    PIIX_SIDETIM_RTC_MASK(channel));
1901 
1902 	idedma_ctl = 0;
1903 	/* If channel disabled, no need to go further */
1904 	if ((PIIX_IDETIM_READ(oidetim, channel) & PIIX_IDETIM_IDE) == 0)
1905 		return;
1906 	/* set up new idetim: Enable IDE registers decode */
1907 	idetim = PIIX_IDETIM_SET(idetim, PIIX_IDETIM_IDE, channel);
1908 
1909 	/* setup DMA if needed */
1910 	pciide_channel_dma_setup(cp);
1911 
1912 	for (drive = 0; drive < 2; drive++) {
1913 		udmareg &= ~(PIIX_UDMACTL_DRV_EN(channel, drive) |
1914 		    PIIX_UDMATIM_SET(0x3, channel, drive));
1915 		drvp = &chp->ch_drive[drive];
1916 		/* If no drive, skip */
1917 		if ((drvp->drive_flags & DRIVE) == 0)
1918 			continue;
1919 		if (((drvp->drive_flags & DRIVE_DMA) == 0 &&
1920 		    (drvp->drive_flags & DRIVE_UDMA) == 0))
1921 			goto pio;
1922 
1923 		if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE ||
1924 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AB_IDE ||
1925 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE ||
1926 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE ||
1927 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 ||
1928 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 ||
1929 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE ||
1930 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE) {
1931 			ideconf |= PIIX_CONFIG_PINGPONG;
1932 		}
1933 		if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BA_IDE ||
1934 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801BAM_IDE ||
1935 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_1 ||
1936 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801CA_IDE_2 ||
1937 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DB_IDE ||
1938 		    sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801DBM_IDE) {
1939 			/* setup Ultra/100 */
1940 			if (drvp->UDMA_mode > 2 &&
1941 			    (ideconf & PIIX_CONFIG_CR(channel, drive)) == 0)
1942 				drvp->UDMA_mode = 2;
1943 			if (drvp->UDMA_mode > 4) {
1944 				ideconf |= PIIX_CONFIG_UDMA100(channel, drive);
1945 			} else {
1946 				ideconf &= ~PIIX_CONFIG_UDMA100(channel, drive);
1947 				if (drvp->UDMA_mode > 2) {
1948 					ideconf |= PIIX_CONFIG_UDMA66(channel,
1949 					    drive);
1950 				} else {
1951 					ideconf &= ~PIIX_CONFIG_UDMA66(channel,
1952 					    drive);
1953 				}
1954 			}
1955 		}
1956 		if (sc->sc_pp->ide_product == PCI_PRODUCT_INTEL_82801AA_IDE) {
1957 			/* setup Ultra/66 */
1958 			if (drvp->UDMA_mode > 2 &&
1959 			    (ideconf & PIIX_CONFIG_CR(channel, drive)) == 0)
1960 				drvp->UDMA_mode = 2;
1961 			if (drvp->UDMA_mode > 2)
1962 				ideconf |= PIIX_CONFIG_UDMA66(channel, drive);
1963 			else
1964 				ideconf &= ~PIIX_CONFIG_UDMA66(channel, drive);
1965 		}
1966 		if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) &&
1967 		    (drvp->drive_flags & DRIVE_UDMA)) {
1968 			/* use Ultra/DMA */
1969 			drvp->drive_flags &= ~DRIVE_DMA;
1970 			udmareg |= PIIX_UDMACTL_DRV_EN( channel, drive);
1971 			udmareg |= PIIX_UDMATIM_SET(
1972 			    piix4_sct_udma[drvp->UDMA_mode], channel, drive);
1973 		} else {
1974 			/* use Multiword DMA */
1975 			drvp->drive_flags &= ~DRIVE_UDMA;
1976 			if (drive == 0) {
1977 				idetim |= piix_setup_idetim_timings(
1978 				    drvp->DMA_mode, 1, channel);
1979 			} else {
1980 				sidetim |= piix_setup_sidetim_timings(
1981 					drvp->DMA_mode, 1, channel);
1982 				idetim =PIIX_IDETIM_SET(idetim,
1983 				    PIIX_IDETIM_SITRE, channel);
1984 			}
1985 		}
1986 		idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
1987 
1988 pio:		/* use PIO mode */
1989 		idetim |= piix_setup_idetim_drvs(drvp);
1990 		if (drive == 0) {
1991 			idetim |= piix_setup_idetim_timings(
1992 			    drvp->PIO_mode, 0, channel);
1993 		} else {
1994 			sidetim |= piix_setup_sidetim_timings(
1995 				drvp->PIO_mode, 0, channel);
1996 			idetim =PIIX_IDETIM_SET(idetim,
1997 			    PIIX_IDETIM_SITRE, channel);
1998 		}
1999 	}
2000 	if (idedma_ctl != 0) {
2001 		/* Add software bits in status register */
2002 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
2003 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * channel),
2004 		    idedma_ctl);
2005 	}
2006 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_IDETIM, idetim);
2007 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_SIDETIM, sidetim);
2008 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_UDMAREG, udmareg);
2009 	pci_conf_write(sc->sc_pc, sc->sc_tag, PIIX_CONFIG, ideconf);
2010 	pciide_print_modes(cp);
2011 }
2012 
2013 
2014 /* setup ISP and RTC fields, based on mode */
2015 static u_int32_t
2016 piix_setup_idetim_timings(mode, dma, channel)
2017 	u_int8_t mode;
2018 	u_int8_t dma;
2019 	u_int8_t channel;
2020 {
2021 
2022 	if (dma)
2023 		return PIIX_IDETIM_SET(0,
2024 		    PIIX_IDETIM_ISP_SET(piix_isp_dma[mode]) |
2025 		    PIIX_IDETIM_RTC_SET(piix_rtc_dma[mode]),
2026 		    channel);
2027 	else
2028 		return PIIX_IDETIM_SET(0,
2029 		    PIIX_IDETIM_ISP_SET(piix_isp_pio[mode]) |
2030 		    PIIX_IDETIM_RTC_SET(piix_rtc_pio[mode]),
2031 		    channel);
2032 }
2033 
2034 /* setup DTE, PPE, IE and TIME field based on PIO mode */
2035 static u_int32_t
2036 piix_setup_idetim_drvs(drvp)
2037 	struct ata_drive_datas *drvp;
2038 {
2039 	u_int32_t ret = 0;
2040 	struct channel_softc *chp = drvp->chnl_softc;
2041 	u_int8_t channel = chp->channel;
2042 	u_int8_t drive = drvp->drive;
2043 
2044 	/*
2045 	 * If drive is using UDMA, timings setups are independant
2046 	 * So just check DMA and PIO here.
2047 	 */
2048 	if (drvp->drive_flags & DRIVE_DMA) {
2049 		/* if mode = DMA mode 0, use compatible timings */
2050 		if ((drvp->drive_flags & DRIVE_DMA) &&
2051 		    drvp->DMA_mode == 0) {
2052 			drvp->PIO_mode = 0;
2053 			return ret;
2054 		}
2055 		ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_TIME(drive), channel);
2056 		/*
2057 		 * PIO and DMA timings are the same, use fast timings for PIO
2058 		 * too, else use compat timings.
2059 		 */
2060 		if ((piix_isp_pio[drvp->PIO_mode] !=
2061 		    piix_isp_dma[drvp->DMA_mode]) ||
2062 		    (piix_rtc_pio[drvp->PIO_mode] !=
2063 		    piix_rtc_dma[drvp->DMA_mode]))
2064 			drvp->PIO_mode = 0;
2065 		/* if PIO mode <= 2, use compat timings for PIO */
2066 		if (drvp->PIO_mode <= 2) {
2067 			ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_DTE(drive),
2068 			    channel);
2069 			return ret;
2070 		}
2071 	}
2072 
2073 	/*
2074 	 * Now setup PIO modes. If mode < 2, use compat timings.
2075 	 * Else enable fast timings. Enable IORDY and prefetch/post
2076 	 * if PIO mode >= 3.
2077 	 */
2078 
2079 	if (drvp->PIO_mode < 2)
2080 		return ret;
2081 
2082 	ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_TIME(drive), channel);
2083 	if (drvp->PIO_mode >= 3) {
2084 		ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_IE(drive), channel);
2085 		ret = PIIX_IDETIM_SET(ret, PIIX_IDETIM_PPE(drive), channel);
2086 	}
2087 	return ret;
2088 }
2089 
2090 /* setup values in SIDETIM registers, based on mode */
2091 static u_int32_t
2092 piix_setup_sidetim_timings(mode, dma, channel)
2093 	u_int8_t mode;
2094 	u_int8_t dma;
2095 	u_int8_t channel;
2096 {
2097 	if (dma)
2098 		return PIIX_SIDETIM_ISP_SET(piix_isp_dma[mode], channel) |
2099 		    PIIX_SIDETIM_RTC_SET(piix_rtc_dma[mode], channel);
2100 	else
2101 		return PIIX_SIDETIM_ISP_SET(piix_isp_pio[mode], channel) |
2102 		    PIIX_SIDETIM_RTC_SET(piix_rtc_pio[mode], channel);
2103 }
2104 
2105 void
2106 amd7x6_chip_map(sc, pa)
2107 	struct pciide_softc *sc;
2108 	struct pci_attach_args *pa;
2109 {
2110 	struct pciide_channel *cp;
2111 	pcireg_t interface = PCI_INTERFACE(pa->pa_class);
2112 	int channel;
2113 	pcireg_t chanenable;
2114 	bus_size_t cmdsize, ctlsize;
2115 
2116 	if (pciide_chipen(sc, pa) == 0)
2117 		return;
2118 	printf("%s: bus-master DMA support present",
2119 	    sc->sc_wdcdev.sc_dev.dv_xname);
2120 	pciide_mapreg_dma(sc, pa);
2121 	printf("\n");
2122 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
2123 	    WDC_CAPABILITY_MODE;
2124 	if (sc->sc_dma_ok) {
2125 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
2126 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
2127 		sc->sc_wdcdev.irqack = pciide_irqack;
2128 	}
2129 	sc->sc_wdcdev.PIO_cap = 4;
2130 	sc->sc_wdcdev.DMA_cap = 2;
2131 
2132 	switch (sc->sc_pci_vendor) {
2133 	case PCI_VENDOR_AMD:
2134 		switch (sc->sc_pp->ide_product) {
2135 		case PCI_PRODUCT_AMD_PBC766_IDE:
2136 		case PCI_PRODUCT_AMD_PBC768_IDE:
2137 		case PCI_PRODUCT_AMD_PBC8111_IDE:
2138 			sc->sc_wdcdev.UDMA_cap = 5;
2139 			break;
2140 		default:
2141 			sc->sc_wdcdev.UDMA_cap = 4;
2142 		}
2143 		sc->sc_amd_regbase = AMD7X6_AMD_REGBASE;
2144 		break;
2145 
2146 	case PCI_VENDOR_NVIDIA:
2147 		switch (sc->sc_pp->ide_product) {
2148 		case PCI_PRODUCT_NVIDIA_NFORCE_ATA100:
2149 			sc->sc_wdcdev.UDMA_cap = 5;
2150 			break;
2151 		case PCI_PRODUCT_NVIDIA_NFORCE2_ATA133:
2152 			sc->sc_wdcdev.UDMA_cap = 6;
2153 			break;
2154 		}
2155 		sc->sc_amd_regbase = AMD7X6_NVIDIA_REGBASE;
2156 		break;
2157 
2158 	default:
2159 		panic("amd7x6_chip_map: unknown vendor");
2160 	}
2161 	sc->sc_wdcdev.set_modes = amd7x6_setup_channel;
2162 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
2163 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
2164 	chanenable = pci_conf_read(sc->sc_pc, sc->sc_tag,
2165 	    AMD7X6_CHANSTATUS_EN(sc));
2166 
2167 	WDCDEBUG_PRINT(("amd7x6_chip_map: Channel enable=0x%x\n", chanenable),
2168 	    DEBUG_PROBE);
2169 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
2170 		cp = &sc->pciide_channels[channel];
2171 		if (pciide_chansetup(sc, channel, interface) == 0)
2172 			continue;
2173 
2174 		if ((chanenable & AMD7X6_CHAN_EN(channel)) == 0) {
2175 			printf("%s: %s channel ignored (disabled)\n",
2176 			    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
2177 			continue;
2178 		}
2179 		pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
2180 		    pciide_pci_intr);
2181 
2182 		if (pciide_chan_candisable(cp))
2183 			chanenable &= ~AMD7X6_CHAN_EN(channel);
2184 		pciide_map_compat_intr(pa, cp, channel, interface);
2185 		if (cp->hw_ok == 0)
2186 			continue;
2187 
2188 		amd7x6_setup_channel(&cp->wdc_channel);
2189 	}
2190 	pci_conf_write(sc->sc_pc, sc->sc_tag, AMD7X6_CHANSTATUS_EN(sc),
2191 	    chanenable);
2192 	return;
2193 }
2194 
2195 void
2196 amd7x6_setup_channel(chp)
2197 	struct channel_softc *chp;
2198 {
2199 	u_int32_t udmatim_reg, datatim_reg;
2200 	u_int8_t idedma_ctl;
2201 	int mode, drive;
2202 	struct ata_drive_datas *drvp;
2203 	struct pciide_channel *cp = (struct pciide_channel*)chp;
2204 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
2205 #ifndef PCIIDE_AMD756_ENABLEDMA
2206 	int rev = PCI_REVISION(
2207 	    pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG));
2208 #endif
2209 
2210 	idedma_ctl = 0;
2211 	datatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, AMD7X6_DATATIM(sc));
2212 	udmatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, AMD7X6_UDMA(sc));
2213 	datatim_reg &= ~AMD7X6_DATATIM_MASK(chp->channel);
2214 	udmatim_reg &= ~AMD7X6_UDMA_MASK(chp->channel);
2215 
2216 	/* setup DMA if needed */
2217 	pciide_channel_dma_setup(cp);
2218 
2219 	for (drive = 0; drive < 2; drive++) {
2220 		drvp = &chp->ch_drive[drive];
2221 		/* If no drive, skip */
2222 		if ((drvp->drive_flags & DRIVE) == 0)
2223 			continue;
2224 		/* add timing values, setup DMA if needed */
2225 		if (((drvp->drive_flags & DRIVE_DMA) == 0 &&
2226 		    (drvp->drive_flags & DRIVE_UDMA) == 0)) {
2227 			mode = drvp->PIO_mode;
2228 			goto pio;
2229 		}
2230 		if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) &&
2231 		    (drvp->drive_flags & DRIVE_UDMA)) {
2232 			/* use Ultra/DMA */
2233 			drvp->drive_flags &= ~DRIVE_DMA;
2234 			udmatim_reg |= AMD7X6_UDMA_EN(chp->channel, drive) |
2235 			    AMD7X6_UDMA_EN_MTH(chp->channel, drive) |
2236 			    AMD7X6_UDMA_TIME(chp->channel, drive,
2237 				amd7x6_udma_tim[drvp->UDMA_mode]);
2238 			/* can use PIO timings, MW DMA unused */
2239 			mode = drvp->PIO_mode;
2240 		} else {
2241 			/* use Multiword DMA, but only if revision is OK */
2242 			drvp->drive_flags &= ~DRIVE_UDMA;
2243 #ifndef PCIIDE_AMD756_ENABLEDMA
2244 			/*
2245 			 * The workaround doesn't seem to be necessary
2246 			 * with all drives, so it can be disabled by
2247 			 * PCIIDE_AMD756_ENABLEDMA. It causes a hard hang if
2248 			 * triggered.
2249 			 */
2250 			if (sc->sc_pci_vendor == PCI_VENDOR_AMD &&
2251 			    sc->sc_pp->ide_product ==
2252 			      PCI_PRODUCT_AMD_PBC756_IDE &&
2253 			    AMD756_CHIPREV_DISABLEDMA(rev)) {
2254 				printf("%s:%d:%d: multi-word DMA disabled due "
2255 				    "to chip revision\n",
2256 				    sc->sc_wdcdev.sc_dev.dv_xname,
2257 				    chp->channel, drive);
2258 				mode = drvp->PIO_mode;
2259 				drvp->drive_flags &= ~DRIVE_DMA;
2260 				goto pio;
2261 			}
2262 #endif
2263 			/* mode = min(pio, dma+2) */
2264 			if (drvp->PIO_mode <= (drvp->DMA_mode +2))
2265 				mode = drvp->PIO_mode;
2266 			else
2267 				mode = drvp->DMA_mode + 2;
2268 		}
2269 		idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
2270 
2271 pio:		/* setup PIO mode */
2272 		if (mode <= 2) {
2273 			drvp->DMA_mode = 0;
2274 			drvp->PIO_mode = 0;
2275 			mode = 0;
2276 		} else {
2277 			drvp->PIO_mode = mode;
2278 			drvp->DMA_mode = mode - 2;
2279 		}
2280 		datatim_reg |=
2281 		    AMD7X6_DATATIM_PULSE(chp->channel, drive,
2282 			amd7x6_pio_set[mode]) |
2283 		    AMD7X6_DATATIM_RECOV(chp->channel, drive,
2284 			amd7x6_pio_rec[mode]);
2285 	}
2286 	if (idedma_ctl != 0) {
2287 		/* Add software bits in status register */
2288 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
2289 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
2290 		    idedma_ctl);
2291 	}
2292 	pciide_print_modes(cp);
2293 	pci_conf_write(sc->sc_pc, sc->sc_tag, AMD7X6_DATATIM(sc), datatim_reg);
2294 	pci_conf_write(sc->sc_pc, sc->sc_tag, AMD7X6_UDMA(sc), udmatim_reg);
2295 }
2296 
2297 void
2298 apollo_chip_map(sc, pa)
2299 	struct pciide_softc *sc;
2300 	struct pci_attach_args *pa;
2301 {
2302 	struct pciide_channel *cp;
2303 	pcireg_t interface = PCI_INTERFACE(pa->pa_class);
2304 	int channel;
2305 	u_int32_t ideconf;
2306 	bus_size_t cmdsize, ctlsize;
2307 	pcitag_t pcib_tag;
2308 	pcireg_t pcib_id, pcib_class;
2309 
2310 	if (pciide_chipen(sc, pa) == 0)
2311 		return;
2312 	/* get a PCI tag for the ISA bridge (function 0 of the same device) */
2313 	pcib_tag = pci_make_tag(pa->pa_pc, pa->pa_bus, pa->pa_device, 0);
2314 	/* and read ID and rev of the ISA bridge */
2315 	pcib_id = pci_conf_read(sc->sc_pc, pcib_tag, PCI_ID_REG);
2316 	pcib_class = pci_conf_read(sc->sc_pc, pcib_tag, PCI_CLASS_REG);
2317 	printf(": VIA Technologies ");
2318 	switch (PCI_PRODUCT(pcib_id)) {
2319 	case PCI_PRODUCT_VIATECH_VT82C586_ISA:
2320 		printf("VT82C586 (Apollo VP) ");
2321 		if(PCI_REVISION(pcib_class) >= 0x02) {
2322 			printf("ATA33 controller\n");
2323 			sc->sc_wdcdev.UDMA_cap = 2;
2324 		} else {
2325 			printf("controller\n");
2326 			sc->sc_wdcdev.UDMA_cap = 0;
2327 		}
2328 		break;
2329 	case PCI_PRODUCT_VIATECH_VT82C596A:
2330 		printf("VT82C596A (Apollo Pro) ");
2331 		if (PCI_REVISION(pcib_class) >= 0x12) {
2332 			printf("ATA66 controller\n");
2333 			sc->sc_wdcdev.UDMA_cap = 4;
2334 		} else {
2335 			printf("ATA33 controller\n");
2336 			sc->sc_wdcdev.UDMA_cap = 2;
2337 		}
2338 		break;
2339 	case PCI_PRODUCT_VIATECH_VT82C686A_ISA:
2340 		printf("VT82C686A (Apollo KX133) ");
2341 		if (PCI_REVISION(pcib_class) >= 0x40) {
2342 			printf("ATA100 controller\n");
2343 			sc->sc_wdcdev.UDMA_cap = 5;
2344 		} else {
2345 			printf("ATA66 controller\n");
2346 			sc->sc_wdcdev.UDMA_cap = 4;
2347 		}
2348 		break;
2349 	case PCI_PRODUCT_VIATECH_VT8231:
2350 		printf("VT8231 ATA100 controller\n");
2351 		sc->sc_wdcdev.UDMA_cap = 5;
2352 		break;
2353 	case PCI_PRODUCT_VIATECH_VT8233:
2354 		printf("VT8233 ATA100 controller\n");
2355 		sc->sc_wdcdev.UDMA_cap = 5;
2356 		break;
2357 	case PCI_PRODUCT_VIATECH_VT8233A:
2358 		printf("VT8233A ATA133 controller\n");
2359 		sc->sc_wdcdev.UDMA_cap = 6;
2360 		break;
2361 	case PCI_PRODUCT_VIATECH_VT8235:
2362 		printf("VT8235 ATA133 controller\n");
2363 		sc->sc_wdcdev.UDMA_cap = 6;
2364 		break;
2365 	default:
2366 		printf("unknown ATA controller\n");
2367 		sc->sc_wdcdev.UDMA_cap = 0;
2368 	}
2369 
2370 	printf("%s: bus-master DMA support present",
2371 	    sc->sc_wdcdev.sc_dev.dv_xname);
2372 	pciide_mapreg_dma(sc, pa);
2373 	printf("\n");
2374 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
2375 	    WDC_CAPABILITY_MODE;
2376 	if (sc->sc_dma_ok) {
2377 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
2378 		sc->sc_wdcdev.irqack = pciide_irqack;
2379 		if (sc->sc_wdcdev.UDMA_cap > 0)
2380 			sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
2381 	}
2382 	sc->sc_wdcdev.PIO_cap = 4;
2383 	sc->sc_wdcdev.DMA_cap = 2;
2384 	sc->sc_wdcdev.set_modes = apollo_setup_channel;
2385 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
2386 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
2387 
2388 	WDCDEBUG_PRINT(("apollo_chip_map: old APO_IDECONF=0x%x, "
2389 	    "APO_CTLMISC=0x%x, APO_DATATIM=0x%x, APO_UDMA=0x%x\n",
2390 	    pci_conf_read(sc->sc_pc, sc->sc_tag, APO_IDECONF),
2391 	    pci_conf_read(sc->sc_pc, sc->sc_tag, APO_CTLMISC),
2392 	    pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM),
2393 	    pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA)),
2394 	    DEBUG_PROBE);
2395 
2396 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
2397 		cp = &sc->pciide_channels[channel];
2398 		if (pciide_chansetup(sc, channel, interface) == 0)
2399 			continue;
2400 
2401 		ideconf = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_IDECONF);
2402 		if ((ideconf & APO_IDECONF_EN(channel)) == 0) {
2403 			printf("%s: %s channel ignored (disabled)\n",
2404 			    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
2405 			continue;
2406 		}
2407 		pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
2408 		    pciide_pci_intr);
2409 		if (cp->hw_ok == 0)
2410 			continue;
2411 		if (pciide_chan_candisable(cp)) {
2412 			ideconf &= ~APO_IDECONF_EN(channel);
2413 			pci_conf_write(sc->sc_pc, sc->sc_tag, APO_IDECONF,
2414 			    ideconf);
2415 		}
2416 		pciide_map_compat_intr(pa, cp, channel, interface);
2417 
2418 		if (cp->hw_ok == 0)
2419 			continue;
2420 		apollo_setup_channel(&sc->pciide_channels[channel].wdc_channel);
2421 	}
2422 	WDCDEBUG_PRINT(("apollo_chip_map: APO_DATATIM=0x%x, APO_UDMA=0x%x\n",
2423 	    pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM),
2424 	    pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA)), DEBUG_PROBE);
2425 }
2426 
2427 void
2428 apollo_setup_channel(chp)
2429 	struct channel_softc *chp;
2430 {
2431 	u_int32_t udmatim_reg, datatim_reg;
2432 	u_int8_t idedma_ctl;
2433 	int mode, drive;
2434 	struct ata_drive_datas *drvp;
2435 	struct pciide_channel *cp = (struct pciide_channel*)chp;
2436 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
2437 
2438 	idedma_ctl = 0;
2439 	datatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_DATATIM);
2440 	udmatim_reg = pci_conf_read(sc->sc_pc, sc->sc_tag, APO_UDMA);
2441 	datatim_reg &= ~APO_DATATIM_MASK(chp->channel);
2442 	udmatim_reg &= ~APO_UDMA_MASK(chp->channel);
2443 
2444 	/* setup DMA if needed */
2445 	pciide_channel_dma_setup(cp);
2446 
2447 	for (drive = 0; drive < 2; drive++) {
2448 		drvp = &chp->ch_drive[drive];
2449 		/* If no drive, skip */
2450 		if ((drvp->drive_flags & DRIVE) == 0)
2451 			continue;
2452 		/* add timing values, setup DMA if needed */
2453 		if (((drvp->drive_flags & DRIVE_DMA) == 0 &&
2454 		    (drvp->drive_flags & DRIVE_UDMA) == 0)) {
2455 			mode = drvp->PIO_mode;
2456 			goto pio;
2457 		}
2458 		if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) &&
2459 		    (drvp->drive_flags & DRIVE_UDMA)) {
2460 			/* use Ultra/DMA */
2461 			drvp->drive_flags &= ~DRIVE_DMA;
2462 			udmatim_reg |= APO_UDMA_EN(chp->channel, drive) |
2463 			    APO_UDMA_EN_MTH(chp->channel, drive);
2464 			if (sc->sc_wdcdev.UDMA_cap == 6) {
2465 				/* 8233a */
2466 				udmatim_reg |= APO_UDMA_TIME(chp->channel,
2467 				    drive, apollo_udma133_tim[drvp->UDMA_mode]);
2468 			} else if (sc->sc_wdcdev.UDMA_cap == 5) {
2469 				/* 686b */
2470 				udmatim_reg |= APO_UDMA_TIME(chp->channel,
2471 				    drive, apollo_udma100_tim[drvp->UDMA_mode]);
2472 			} else if (sc->sc_wdcdev.UDMA_cap == 4) {
2473 				/* 596b or 686a */
2474 				udmatim_reg |= APO_UDMA_CLK66(chp->channel);
2475 				udmatim_reg |= APO_UDMA_TIME(chp->channel,
2476 				    drive, apollo_udma66_tim[drvp->UDMA_mode]);
2477 			} else {
2478 				/* 596a or 586b */
2479 				udmatim_reg |= APO_UDMA_TIME(chp->channel,
2480 				    drive, apollo_udma33_tim[drvp->UDMA_mode]);
2481 			}
2482 			/* can use PIO timings, MW DMA unused */
2483 			mode = drvp->PIO_mode;
2484 		} else {
2485 			/* use Multiword DMA */
2486 			drvp->drive_flags &= ~DRIVE_UDMA;
2487 			/* mode = min(pio, dma+2) */
2488 			if (drvp->PIO_mode <= (drvp->DMA_mode +2))
2489 				mode = drvp->PIO_mode;
2490 			else
2491 				mode = drvp->DMA_mode + 2;
2492 		}
2493 		idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
2494 
2495 pio:		/* setup PIO mode */
2496 		if (mode <= 2) {
2497 			drvp->DMA_mode = 0;
2498 			drvp->PIO_mode = 0;
2499 			mode = 0;
2500 		} else {
2501 			drvp->PIO_mode = mode;
2502 			drvp->DMA_mode = mode - 2;
2503 		}
2504 		datatim_reg |=
2505 		    APO_DATATIM_PULSE(chp->channel, drive,
2506 			apollo_pio_set[mode]) |
2507 		    APO_DATATIM_RECOV(chp->channel, drive,
2508 			apollo_pio_rec[mode]);
2509 	}
2510 	if (idedma_ctl != 0) {
2511 		/* Add software bits in status register */
2512 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
2513 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
2514 		    idedma_ctl);
2515 	}
2516 	pciide_print_modes(cp);
2517 	pci_conf_write(sc->sc_pc, sc->sc_tag, APO_DATATIM, datatim_reg);
2518 	pci_conf_write(sc->sc_pc, sc->sc_tag, APO_UDMA, udmatim_reg);
2519 }
2520 
2521 void
2522 cmd_channel_map(pa, sc, channel)
2523 	struct pci_attach_args *pa;
2524 	struct pciide_softc *sc;
2525 	int channel;
2526 {
2527 	struct pciide_channel *cp = &sc->pciide_channels[channel];
2528 	bus_size_t cmdsize, ctlsize;
2529 	u_int8_t ctrl = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_CTRL);
2530 	int interface, one_channel;
2531 
2532 	/*
2533 	 * The 0648/0649 can be told to identify as a RAID controller.
2534 	 * In this case, we have to fake interface
2535 	 */
2536 	if (PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_MASS_STORAGE_IDE) {
2537 		interface = PCIIDE_INTERFACE_SETTABLE(0) |
2538 		    PCIIDE_INTERFACE_SETTABLE(1);
2539 		if (pciide_pci_read(pa->pa_pc, pa->pa_tag, CMD_CONF) &
2540 		    CMD_CONF_DSA1)
2541 			interface |= PCIIDE_INTERFACE_PCI(0) |
2542 			    PCIIDE_INTERFACE_PCI(1);
2543 	} else {
2544 		interface = PCI_INTERFACE(pa->pa_class);
2545 	}
2546 
2547 	sc->wdc_chanarray[channel] = &cp->wdc_channel;
2548 	cp->name = PCIIDE_CHANNEL_NAME(channel);
2549 	cp->wdc_channel.channel = channel;
2550 	cp->wdc_channel.wdc = &sc->sc_wdcdev;
2551 
2552 	/*
2553 	 * Older CMD64X doesn't have independant channels
2554 	 */
2555 	switch (sc->sc_pp->ide_product) {
2556 	case PCI_PRODUCT_CMDTECH_649:
2557 		one_channel = 0;
2558 		break;
2559 	default:
2560 		one_channel = 1;
2561 		break;
2562 	}
2563 
2564 	if (channel > 0 && one_channel) {
2565 		cp->wdc_channel.ch_queue =
2566 		    sc->pciide_channels[0].wdc_channel.ch_queue;
2567 	} else {
2568 		cp->wdc_channel.ch_queue =
2569 		    malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT);
2570 	}
2571 	if (cp->wdc_channel.ch_queue == NULL) {
2572 		printf("%s %s channel: "
2573 		    "can't allocate memory for command queue",
2574 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
2575 		    return;
2576 	}
2577 
2578 	printf("%s: %s channel %s to %s mode\n",
2579 	    sc->sc_wdcdev.sc_dev.dv_xname, cp->name,
2580 	    (interface & PCIIDE_INTERFACE_SETTABLE(channel)) ?
2581 	    "configured" : "wired",
2582 	    (interface & PCIIDE_INTERFACE_PCI(channel)) ?
2583 	    "native-PCI" : "compatibility");
2584 
2585 	/*
2586 	 * with a CMD PCI64x, if we get here, the first channel is enabled:
2587 	 * there's no way to disable the first channel without disabling
2588 	 * the whole device
2589 	 */
2590 	if (channel != 0 && (ctrl & CMD_CTRL_2PORT) == 0) {
2591 		printf("%s: %s channel ignored (disabled)\n",
2592 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
2593 		return;
2594 	}
2595 
2596 	pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, cmd_pci_intr);
2597 	if (cp->hw_ok == 0)
2598 		return;
2599 	if (channel == 1) {
2600 		if (pciide_chan_candisable(cp)) {
2601 			ctrl &= ~CMD_CTRL_2PORT;
2602 			pciide_pci_write(pa->pa_pc, pa->pa_tag,
2603 			    CMD_CTRL, ctrl);
2604 		}
2605 	}
2606 	pciide_map_compat_intr(pa, cp, channel, interface);
2607 }
2608 
2609 int
2610 cmd_pci_intr(arg)
2611 	void *arg;
2612 {
2613 	struct pciide_softc *sc = arg;
2614 	struct pciide_channel *cp;
2615 	struct channel_softc *wdc_cp;
2616 	int i, rv, crv;
2617 	u_int32_t priirq, secirq;
2618 
2619 	rv = 0;
2620 	priirq = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_CONF);
2621 	secirq = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_ARTTIM23);
2622 	for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
2623 		cp = &sc->pciide_channels[i];
2624 		wdc_cp = &cp->wdc_channel;
2625 		/* If a compat channel skip. */
2626 		if (cp->compat)
2627 			continue;
2628 		if ((i == 0 && (priirq & CMD_CONF_DRV0_INTR)) ||
2629 		    (i == 1 && (secirq & CMD_ARTTIM23_IRQ))) {
2630 			crv = wdcintr(wdc_cp);
2631 			if (crv == 0)
2632 				printf("%s:%d: bogus intr\n",
2633 				    sc->sc_wdcdev.sc_dev.dv_xname, i);
2634 			else
2635 				rv = 1;
2636 		}
2637 	}
2638 	return rv;
2639 }
2640 
2641 void
2642 cmd_chip_map(sc, pa)
2643 	struct pciide_softc *sc;
2644 	struct pci_attach_args *pa;
2645 {
2646 	int channel;
2647 
2648 	/*
2649 	 * For a CMD PCI064x, the use of PCI_COMMAND_IO_ENABLE
2650 	 * and base adresses registers can be disabled at
2651 	 * hardware level. In this case, the device is wired
2652 	 * in compat mode and its first channel is always enabled,
2653 	 * but we can't rely on PCI_COMMAND_IO_ENABLE.
2654 	 * In fact, it seems that the first channel of the CMD PCI0640
2655 	 * can't be disabled.
2656 	 */
2657 
2658 #ifdef PCIIDE_CMD064x_DISABLE
2659 	if (pciide_chipen(sc, pa) == 0)
2660 		return;
2661 #endif
2662 
2663 	printf("%s: hardware does not support DMA\n",
2664 	    sc->sc_wdcdev.sc_dev.dv_xname);
2665 	sc->sc_dma_ok = 0;
2666 
2667 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
2668 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
2669 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16;
2670 
2671 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
2672 		cmd_channel_map(pa, sc, channel);
2673 	}
2674 }
2675 
2676 void
2677 cmd0643_9_chip_map(sc, pa)
2678 	struct pciide_softc *sc;
2679 	struct pci_attach_args *pa;
2680 {
2681 	struct pciide_channel *cp;
2682 	int channel;
2683 	pcireg_t rev = PCI_REVISION(pa->pa_class);
2684 
2685 	/*
2686 	 * For a CMD PCI064x, the use of PCI_COMMAND_IO_ENABLE
2687 	 * and base adresses registers can be disabled at
2688 	 * hardware level. In this case, the device is wired
2689 	 * in compat mode and its first channel is always enabled,
2690 	 * but we can't rely on PCI_COMMAND_IO_ENABLE.
2691 	 * In fact, it seems that the first channel of the CMD PCI0640
2692 	 * can't be disabled.
2693 	 */
2694 
2695 #ifdef PCIIDE_CMD064x_DISABLE
2696 	if (pciide_chipen(sc, pa) == 0)
2697 		return;
2698 #endif
2699 	printf("%s: bus-master DMA support present",
2700 	    sc->sc_wdcdev.sc_dev.dv_xname);
2701 	pciide_mapreg_dma(sc, pa);
2702 	printf("\n");
2703 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
2704 	    WDC_CAPABILITY_MODE;
2705 	if (sc->sc_dma_ok) {
2706 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
2707 		switch (sc->sc_pp->ide_product) {
2708 		case PCI_PRODUCT_CMDTECH_649:
2709 			sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
2710 			sc->sc_wdcdev.UDMA_cap = 5;
2711 			sc->sc_wdcdev.irqack = cmd646_9_irqack;
2712 			break;
2713 		case PCI_PRODUCT_CMDTECH_648:
2714 			sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
2715 			sc->sc_wdcdev.UDMA_cap = 4;
2716 			sc->sc_wdcdev.irqack = cmd646_9_irqack;
2717 			break;
2718 		case PCI_PRODUCT_CMDTECH_646:
2719 			if (rev >= CMD0646U2_REV) {
2720 				sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
2721 				sc->sc_wdcdev.UDMA_cap = 2;
2722 			} else if (rev >= CMD0646U_REV) {
2723 			/*
2724 			 * Linux's driver claims that the 646U is broken
2725 			 * with UDMA. Only enable it if we know what we're
2726 			 * doing
2727 			 */
2728 #ifdef PCIIDE_CMD0646U_ENABLEUDMA
2729 				sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
2730 				sc->sc_wdcdev.UDMA_cap = 2;
2731 #endif
2732 				/* explicitly disable UDMA */
2733 				pciide_pci_write(sc->sc_pc, sc->sc_tag,
2734 				    CMD_UDMATIM(0), 0);
2735 				pciide_pci_write(sc->sc_pc, sc->sc_tag,
2736 				    CMD_UDMATIM(1), 0);
2737 			}
2738 			sc->sc_wdcdev.irqack = cmd646_9_irqack;
2739 			break;
2740 		default:
2741 			sc->sc_wdcdev.irqack = pciide_irqack;
2742 		}
2743 	}
2744 
2745 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
2746 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
2747 	sc->sc_wdcdev.PIO_cap = 4;
2748 	sc->sc_wdcdev.DMA_cap = 2;
2749 	sc->sc_wdcdev.set_modes = cmd0643_9_setup_channel;
2750 
2751 	WDCDEBUG_PRINT(("cmd0643_9_chip_map: old timings reg 0x%x 0x%x\n",
2752 		pci_conf_read(sc->sc_pc, sc->sc_tag, 0x54),
2753 		pci_conf_read(sc->sc_pc, sc->sc_tag, 0x58)),
2754 		DEBUG_PROBE);
2755 
2756 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
2757 		cp = &sc->pciide_channels[channel];
2758 		cmd_channel_map(pa, sc, channel);
2759 		if (cp->hw_ok == 0)
2760 			continue;
2761 		cmd0643_9_setup_channel(&cp->wdc_channel);
2762 	}
2763 	/*
2764 	 * note - this also makes sure we clear the irq disable and reset
2765 	 * bits
2766 	 */
2767 	pciide_pci_write(sc->sc_pc, sc->sc_tag, CMD_DMA_MODE, CMD_DMA_MULTIPLE);
2768 	WDCDEBUG_PRINT(("cmd0643_9_chip_map: timings reg now 0x%x 0x%x\n",
2769 	    pci_conf_read(sc->sc_pc, sc->sc_tag, 0x54),
2770 	    pci_conf_read(sc->sc_pc, sc->sc_tag, 0x58)),
2771 	    DEBUG_PROBE);
2772 }
2773 
2774 void
2775 cmd0643_9_setup_channel(chp)
2776 	struct channel_softc *chp;
2777 {
2778 	struct ata_drive_datas *drvp;
2779 	u_int8_t tim;
2780 	u_int32_t idedma_ctl, udma_reg;
2781 	int drive;
2782 	struct pciide_channel *cp = (struct pciide_channel*)chp;
2783 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
2784 
2785 	idedma_ctl = 0;
2786 	/* setup DMA if needed */
2787 	pciide_channel_dma_setup(cp);
2788 
2789 	for (drive = 0; drive < 2; drive++) {
2790 		drvp = &chp->ch_drive[drive];
2791 		/* If no drive, skip */
2792 		if ((drvp->drive_flags & DRIVE) == 0)
2793 			continue;
2794 		/* add timing values, setup DMA if needed */
2795 		tim = cmd0643_9_data_tim_pio[drvp->PIO_mode];
2796 		if (drvp->drive_flags & (DRIVE_DMA | DRIVE_UDMA)) {
2797 			if (drvp->drive_flags & DRIVE_UDMA) {
2798 				/* UltraDMA on a 646U2, 0648 or 0649 */
2799 				drvp->drive_flags &= ~DRIVE_DMA;
2800 				udma_reg = pciide_pci_read(sc->sc_pc,
2801 				    sc->sc_tag, CMD_UDMATIM(chp->channel));
2802 				if (drvp->UDMA_mode > 2 &&
2803 				    (pciide_pci_read(sc->sc_pc, sc->sc_tag,
2804 				    CMD_BICSR) &
2805 				    CMD_BICSR_80(chp->channel)) == 0)
2806 					drvp->UDMA_mode = 2;
2807 				if (drvp->UDMA_mode > 2)
2808 					udma_reg &= ~CMD_UDMATIM_UDMA33(drive);
2809 				else if (sc->sc_wdcdev.UDMA_cap > 2)
2810 					udma_reg |= CMD_UDMATIM_UDMA33(drive);
2811 				udma_reg |= CMD_UDMATIM_UDMA(drive);
2812 				udma_reg &= ~(CMD_UDMATIM_TIM_MASK <<
2813 				    CMD_UDMATIM_TIM_OFF(drive));
2814 				udma_reg |=
2815 				    (cmd0646_9_tim_udma[drvp->UDMA_mode] <<
2816 				    CMD_UDMATIM_TIM_OFF(drive));
2817 				pciide_pci_write(sc->sc_pc, sc->sc_tag,
2818 				    CMD_UDMATIM(chp->channel), udma_reg);
2819 			} else {
2820 				/*
2821 				 * use Multiword DMA.
2822 				 * Timings will be used for both PIO and DMA,
2823 				 * so adjust DMA mode if needed
2824 				 * if we have a 0646U2/8/9, turn off UDMA
2825 				 */
2826 				if (sc->sc_wdcdev.cap & WDC_CAPABILITY_UDMA) {
2827 					udma_reg = pciide_pci_read(sc->sc_pc,
2828 					    sc->sc_tag,
2829 					    CMD_UDMATIM(chp->channel));
2830 					udma_reg &= ~CMD_UDMATIM_UDMA(drive);
2831 					pciide_pci_write(sc->sc_pc, sc->sc_tag,
2832 					    CMD_UDMATIM(chp->channel),
2833 					    udma_reg);
2834 				}
2835 				if (drvp->PIO_mode >= 3 &&
2836 				    (drvp->DMA_mode + 2) > drvp->PIO_mode) {
2837 					drvp->DMA_mode = drvp->PIO_mode - 2;
2838 				}
2839 				tim = cmd0643_9_data_tim_dma[drvp->DMA_mode];
2840 			}
2841 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
2842 		}
2843 		pciide_pci_write(sc->sc_pc, sc->sc_tag,
2844 		    CMD_DATA_TIM(chp->channel, drive), tim);
2845 	}
2846 	if (idedma_ctl != 0) {
2847 		/* Add software bits in status register */
2848 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
2849 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
2850 		    idedma_ctl);
2851 	}
2852 	pciide_print_modes(cp);
2853 }
2854 
2855 void
2856 cmd646_9_irqack(chp)
2857 	struct channel_softc *chp;
2858 {
2859 	u_int32_t priirq, secirq;
2860 	struct pciide_channel *cp = (struct pciide_channel*)chp;
2861 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
2862 
2863 	if (chp->channel == 0) {
2864 		priirq = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_CONF);
2865 		pciide_pci_write(sc->sc_pc, sc->sc_tag, CMD_CONF, priirq);
2866 	} else {
2867 		secirq = pciide_pci_read(sc->sc_pc, sc->sc_tag, CMD_ARTTIM23);
2868 		pciide_pci_write(sc->sc_pc, sc->sc_tag, CMD_ARTTIM23, secirq);
2869 	}
2870 	pciide_irqack(chp);
2871 }
2872 
2873 void
2874 cmd680_chip_map(sc, pa)
2875 	struct pciide_softc *sc;
2876 	struct pci_attach_args *pa;
2877 {
2878 	struct pciide_channel *cp;
2879 	int channel;
2880 
2881 	if (pciide_chipen(sc, pa) == 0)
2882 		return;
2883 	printf("%s: bus-master DMA support present",
2884 	    sc->sc_wdcdev.sc_dev.dv_xname);
2885 	pciide_mapreg_dma(sc, pa);
2886 	printf("\n");
2887 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
2888 	    WDC_CAPABILITY_MODE;
2889 	if (sc->sc_dma_ok) {
2890 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
2891 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
2892 		sc->sc_wdcdev.UDMA_cap = 6;
2893 		sc->sc_wdcdev.irqack = pciide_irqack;
2894 	}
2895 
2896 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
2897 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
2898 	sc->sc_wdcdev.PIO_cap = 4;
2899 	sc->sc_wdcdev.DMA_cap = 2;
2900 	sc->sc_wdcdev.set_modes = cmd680_setup_channel;
2901 
2902 	pciide_pci_write(sc->sc_pc, sc->sc_tag, 0x80, 0x00);
2903 	pciide_pci_write(sc->sc_pc, sc->sc_tag, 0x84, 0x00);
2904 	pciide_pci_write(sc->sc_pc, sc->sc_tag, 0x8a,
2905 	    pciide_pci_read(sc->sc_pc, sc->sc_tag, 0x8a) | 0x01);
2906 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
2907 		cp = &sc->pciide_channels[channel];
2908 		cmd680_channel_map(pa, sc, channel);
2909 		if (cp->hw_ok == 0)
2910 			continue;
2911 		cmd680_setup_channel(&cp->wdc_channel);
2912 	}
2913 }
2914 
2915 void
2916 cmd680_channel_map(pa, sc, channel)
2917 	struct pci_attach_args *pa;
2918 	struct pciide_softc *sc;
2919 	int channel;
2920 {
2921 	struct pciide_channel *cp = &sc->pciide_channels[channel];
2922 	bus_size_t cmdsize, ctlsize;
2923 	int interface, i, reg;
2924 	static const u_int8_t init_val[] =
2925 	    {             0x8a, 0x32, 0x8a, 0x32, 0x8a, 0x32,
2926 	      0x92, 0x43, 0x92, 0x43, 0x09, 0x40, 0x09, 0x40 };
2927 
2928 	if (PCI_SUBCLASS(pa->pa_class) != PCI_SUBCLASS_MASS_STORAGE_IDE) {
2929 		interface = PCIIDE_INTERFACE_SETTABLE(0) |
2930 		    PCIIDE_INTERFACE_SETTABLE(1);
2931 		interface |= PCIIDE_INTERFACE_PCI(0) |
2932 		    PCIIDE_INTERFACE_PCI(1);
2933 	} else {
2934 		interface = PCI_INTERFACE(pa->pa_class);
2935 	}
2936 
2937 	sc->wdc_chanarray[channel] = &cp->wdc_channel;
2938 	cp->name = PCIIDE_CHANNEL_NAME(channel);
2939 	cp->wdc_channel.channel = channel;
2940 	cp->wdc_channel.wdc = &sc->sc_wdcdev;
2941 
2942 	cp->wdc_channel.ch_queue =
2943 	    malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT);
2944 	if (cp->wdc_channel.ch_queue == NULL) {
2945 		printf("%s %s channel: "
2946 		    "can't allocate memory for command queue",
2947 		    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
2948 		    return;
2949 	}
2950 
2951 	/* XXX */
2952 	reg = 0xa2 + channel * 16;
2953 	for (i = 0; i < sizeof(init_val); i++)
2954 		pciide_pci_write(sc->sc_pc, sc->sc_tag, reg + i, init_val[i]);
2955 
2956 	printf("%s: %s channel %s to %s mode\n",
2957 	    sc->sc_wdcdev.sc_dev.dv_xname, cp->name,
2958 	    (interface & PCIIDE_INTERFACE_SETTABLE(channel)) ?
2959 	    "configured" : "wired",
2960 	    (interface & PCIIDE_INTERFACE_PCI(channel)) ?
2961 	    "native-PCI" : "compatibility");
2962 
2963 	pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize, pciide_pci_intr);
2964 	if (cp->hw_ok == 0)
2965 		return;
2966 	pciide_map_compat_intr(pa, cp, channel, interface);
2967 }
2968 
2969 void
2970 cmd680_setup_channel(chp)
2971 	struct channel_softc *chp;
2972 {
2973 	struct ata_drive_datas *drvp;
2974 	u_int8_t mode, off, scsc;
2975 	u_int16_t val;
2976 	u_int32_t idedma_ctl;
2977 	int drive;
2978 	struct pciide_channel *cp = (struct pciide_channel*)chp;
2979 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
2980 	pci_chipset_tag_t pc = sc->sc_pc;
2981 	pcitag_t pa = sc->sc_tag;
2982 	static const u_int8_t udma2_tbl[] =
2983 	    { 0x0f, 0x0b, 0x07, 0x06, 0x03, 0x02, 0x01 };
2984 	static const u_int8_t udma_tbl[] =
2985 	    { 0x0c, 0x07, 0x05, 0x04, 0x02, 0x01, 0x00 };
2986 	static const u_int16_t dma_tbl[] =
2987 	    { 0x2208, 0x10c2, 0x10c1 };
2988 	static const u_int16_t pio_tbl[] =
2989 	    { 0x328a, 0x2283, 0x1104, 0x10c3, 0x10c1 };
2990 
2991 	idedma_ctl = 0;
2992 	pciide_channel_dma_setup(cp);
2993 	mode = pciide_pci_read(pc, pa, 0x80 + chp->channel * 4);
2994 
2995 	for (drive = 0; drive < 2; drive++) {
2996 		drvp = &chp->ch_drive[drive];
2997 		/* If no drive, skip */
2998 		if ((drvp->drive_flags & DRIVE) == 0)
2999 			continue;
3000 		mode &= ~(0x03 << (drive * 4));
3001 		if (drvp->drive_flags & DRIVE_UDMA) {
3002 			drvp->drive_flags &= ~DRIVE_DMA;
3003 			off = 0xa0 + chp->channel * 16;
3004 			if (drvp->UDMA_mode > 2 &&
3005 			    (pciide_pci_read(pc, pa, off) & 0x01) == 0)
3006 				drvp->UDMA_mode = 2;
3007 			scsc = pciide_pci_read(pc, pa, 0x8a);
3008 			if (drvp->UDMA_mode == 6 && (scsc & 0x30) == 0) {
3009 				pciide_pci_write(pc, pa, 0x8a, scsc | 0x01);
3010 				scsc = pciide_pci_read(pc, pa, 0x8a);
3011 				if ((scsc & 0x30) == 0)
3012 					drvp->UDMA_mode = 5;
3013 			}
3014 			mode |= 0x03 << (drive * 4);
3015 			off = 0xac + chp->channel * 16 + drive * 2;
3016 			val = pciide_pci_read(pc, pa, off) & ~0x3f;
3017 			if (scsc & 0x30)
3018 				val |= udma2_tbl[drvp->UDMA_mode];
3019 			else
3020 				val |= udma_tbl[drvp->UDMA_mode];
3021 			pciide_pci_write(pc, pa, off, val);
3022 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3023 		} else if (drvp->drive_flags & DRIVE_DMA) {
3024 			mode |= 0x02 << (drive * 4);
3025 			off = 0xa8 + chp->channel * 16 + drive * 2;
3026 			val = dma_tbl[drvp->DMA_mode];
3027 			pciide_pci_write(pc, pa, off, val & 0xff);
3028 			pciide_pci_write(pc, pa, off, val >> 8);
3029 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3030 		} else {
3031 			mode |= 0x01 << (drive * 4);
3032 			off = 0xa4 + chp->channel * 16 + drive * 2;
3033 			val = pio_tbl[drvp->PIO_mode];
3034 			pciide_pci_write(pc, pa, off, val & 0xff);
3035 			pciide_pci_write(pc, pa, off, val >> 8);
3036 		}
3037 	}
3038 
3039 	pciide_pci_write(pc, pa, 0x80 + chp->channel * 4, mode);
3040 	if (idedma_ctl != 0) {
3041 		/* Add software bits in status register */
3042 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
3043 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
3044 		    idedma_ctl);
3045 	}
3046 	pciide_print_modes(cp);
3047 }
3048 
3049 void
3050 cmd3112_chip_map(sc, pa)
3051 	struct pciide_softc *sc;
3052 	struct pci_attach_args *pa;
3053 {
3054 	struct pciide_channel *cp;
3055 	bus_size_t cmdsize, ctlsize;
3056 	pcireg_t interface;
3057 	int channel;
3058 
3059 	if (pciide_chipen(sc, pa) == 0)
3060 		return;
3061 
3062 	printf("%s: bus-master DMA support present",
3063 	    sc->sc_wdcdev.sc_dev.dv_xname);
3064 	pciide_mapreg_dma(sc, pa);
3065 	printf("\n");
3066 
3067 	/*
3068 	 * Rev. <= 0x01 of the 3112 have a bug that can cause data
3069 	 * corruption if DMA transfers cross an 8K boundary.  This is
3070 	 * apparently hard to tickle, but we'll go ahead and play it
3071 	 * safe.
3072 	 */
3073 	if (PCI_REVISION(pa->pa_class) <= 0x01) {
3074 		sc->sc_dma_maxsegsz = 8192;
3075 		sc->sc_dma_boundary = 8192;
3076 	}
3077 
3078 	sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
3079 	    WDC_CAPABILITY_MODE;
3080 	sc->sc_wdcdev.PIO_cap = 4;
3081 	if (sc->sc_dma_ok) {
3082 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
3083 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
3084 		sc->sc_wdcdev.irqack = pciide_irqack;
3085 		sc->sc_wdcdev.DMA_cap = 2;
3086 		sc->sc_wdcdev.UDMA_cap = 6;
3087 	}
3088 	sc->sc_wdcdev.set_modes = cmd3112_setup_channel;
3089 
3090 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
3091 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
3092 
3093 	/*
3094 	 * The 3112 can be told to identify as a RAID controller.
3095 	 * In this case, we have to fake interface
3096 	 */
3097 	if (PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_IDE) {
3098 		interface = PCI_INTERFACE(pa->pa_class);
3099 	} else {
3100 		interface = PCIIDE_INTERFACE_BUS_MASTER_DMA |
3101 		    PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1);
3102 	}
3103 
3104 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
3105 		cp = &sc->pciide_channels[channel];
3106 		if (pciide_chansetup(sc, channel, interface) == 0)
3107 			continue;
3108 		pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
3109 		    pciide_pci_intr);
3110 		if (cp->hw_ok == 0)
3111 			continue;
3112 		pciide_map_compat_intr(pa, cp, channel, interface);
3113 		cmd3112_setup_channel(&cp->wdc_channel);
3114 	}
3115 }
3116 
3117 void
3118 cmd3112_setup_channel(chp)
3119 	struct channel_softc *chp;
3120 {
3121 	struct ata_drive_datas *drvp;
3122 	int drive;
3123 	u_int32_t idedma_ctl, dtm;
3124 	struct pciide_channel *cp = (struct pciide_channel*)chp;
3125 	struct pciide_softc *sc = (struct pciide_softc*)cp->wdc_channel.wdc;
3126 
3127 	/* setup DMA if needed */
3128 	pciide_channel_dma_setup(cp);
3129 
3130 	idedma_ctl = 0;
3131 	dtm = 0;
3132 
3133 	for (drive = 0; drive < 2; drive++) {
3134 		drvp = &chp->ch_drive[drive];
3135 		/* If no drive, skip */
3136 		if ((drvp->drive_flags & DRIVE) == 0)
3137 			continue;
3138 		if (drvp->drive_flags & DRIVE_UDMA) {
3139 			/* use Ultra/DMA */
3140 			drvp->drive_flags &= ~DRIVE_DMA;
3141 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3142 			dtm |= DTM_IDEx_DMA;
3143 		} else if (drvp->drive_flags & DRIVE_DMA) {
3144 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3145 			dtm |= DTM_IDEx_DMA;
3146 		} else {
3147 			dtm |= DTM_IDEx_PIO;
3148 		}
3149 	}
3150 
3151 	/*
3152 	 * Nothing to do to setup modes; it is meaningless in S-ATA
3153 	 * (but many S-ATA drives still want to get the SET_FEATURE
3154 	 * command).
3155 	 */
3156 	if (idedma_ctl != 0) {
3157 		/* Add software bits in status register */
3158 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
3159 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
3160 		    idedma_ctl);
3161 	}
3162 	pci_conf_write(sc->sc_pc, sc->sc_tag,
3163 	    chp->channel == 0 ? SII3112_DTM_IDE0 : SII3112_DTM_IDE1, dtm);
3164 	pciide_print_modes(cp);
3165 }
3166 
3167 void
3168 cy693_chip_map(sc, pa)
3169 	struct pciide_softc *sc;
3170 	struct pci_attach_args *pa;
3171 {
3172 	struct pciide_channel *cp;
3173 	pcireg_t interface = PCI_INTERFACE(pa->pa_class);
3174 	bus_size_t cmdsize, ctlsize;
3175 
3176 	if (pciide_chipen(sc, pa) == 0)
3177 		return;
3178 	/*
3179 	 * this chip has 2 PCI IDE functions, one for primary and one for
3180 	 * secondary. So we need to call pciide_mapregs_compat() with
3181 	 * the real channel
3182 	 */
3183 	if (pa->pa_function == 1) {
3184 		sc->sc_cy_compatchan = 0;
3185 	} else if (pa->pa_function == 2) {
3186 		sc->sc_cy_compatchan = 1;
3187 	} else {
3188 		printf("%s: unexpected PCI function %d\n",
3189 		    sc->sc_wdcdev.sc_dev.dv_xname, pa->pa_function);
3190 		return;
3191 	}
3192 	if (interface & PCIIDE_INTERFACE_BUS_MASTER_DMA) {
3193 		printf("%s: bus-master DMA support present",
3194 		    sc->sc_wdcdev.sc_dev.dv_xname);
3195 		pciide_mapreg_dma(sc, pa);
3196 	} else {
3197 		printf("%s: hardware does not support DMA",
3198 		    sc->sc_wdcdev.sc_dev.dv_xname);
3199 		sc->sc_dma_ok = 0;
3200 	}
3201 	printf("\n");
3202 
3203 	sc->sc_cy_handle = cy82c693_init(pa->pa_iot);
3204 	if (sc->sc_cy_handle == NULL) {
3205 		printf("%s: unable to map hyperCache control registers\n",
3206 		    sc->sc_wdcdev.sc_dev.dv_xname);
3207 		sc->sc_dma_ok = 0;
3208 	}
3209 
3210 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
3211 	    WDC_CAPABILITY_MODE;
3212 	if (sc->sc_dma_ok) {
3213 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
3214 		sc->sc_wdcdev.irqack = pciide_irqack;
3215 	}
3216 	sc->sc_wdcdev.PIO_cap = 4;
3217 	sc->sc_wdcdev.DMA_cap = 2;
3218 	sc->sc_wdcdev.set_modes = cy693_setup_channel;
3219 
3220 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
3221 	sc->sc_wdcdev.nchannels = 1;
3222 
3223 	/* Only one channel for this chip; if we are here it's enabled */
3224 	cp = &sc->pciide_channels[0];
3225 	sc->wdc_chanarray[0] = &cp->wdc_channel;
3226 	cp->name = PCIIDE_CHANNEL_NAME(0);
3227 	cp->wdc_channel.channel = 0;
3228 	cp->wdc_channel.wdc = &sc->sc_wdcdev;
3229 	cp->wdc_channel.ch_queue =
3230 	    malloc(sizeof(struct channel_queue), M_DEVBUF, M_NOWAIT);
3231 	if (cp->wdc_channel.ch_queue == NULL) {
3232 		printf("%s primary channel: "
3233 		    "can't allocate memory for command queue",
3234 		sc->sc_wdcdev.sc_dev.dv_xname);
3235 		return;
3236 	}
3237 	printf("%s: primary channel %s to ",
3238 	    sc->sc_wdcdev.sc_dev.dv_xname,
3239 	    (interface & PCIIDE_INTERFACE_SETTABLE(0)) ?
3240 	    "configured" : "wired");
3241 	if (interface & PCIIDE_INTERFACE_PCI(0)) {
3242 		printf("native-PCI");
3243 		cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize, &ctlsize,
3244 		    pciide_pci_intr);
3245 	} else {
3246 		printf("compatibility");
3247 		cp->hw_ok = pciide_mapregs_compat(pa, cp, sc->sc_cy_compatchan,
3248 		    &cmdsize, &ctlsize);
3249 	}
3250 	printf(" mode\n");
3251 	cp->wdc_channel.data32iot = cp->wdc_channel.cmd_iot;
3252 	cp->wdc_channel.data32ioh = cp->wdc_channel.cmd_ioh;
3253 	wdcattach(&cp->wdc_channel);
3254 	if (pciide_chan_candisable(cp)) {
3255 		pci_conf_write(sc->sc_pc, sc->sc_tag,
3256 		    PCI_COMMAND_STATUS_REG, 0);
3257 	}
3258 	pciide_map_compat_intr(pa, cp, sc->sc_cy_compatchan, interface);
3259 	if (cp->hw_ok == 0)
3260 		return;
3261 	WDCDEBUG_PRINT(("cy693_chip_map: old timings reg 0x%x\n",
3262 	    pci_conf_read(sc->sc_pc, sc->sc_tag, CY_CMD_CTRL)),DEBUG_PROBE);
3263 	cy693_setup_channel(&cp->wdc_channel);
3264 	WDCDEBUG_PRINT(("cy693_chip_map: new timings reg 0x%x\n",
3265 	    pci_conf_read(sc->sc_pc, sc->sc_tag, CY_CMD_CTRL)), DEBUG_PROBE);
3266 }
3267 
3268 void
3269 cy693_setup_channel(chp)
3270 	struct channel_softc *chp;
3271 {
3272 	struct ata_drive_datas *drvp;
3273 	int drive;
3274 	u_int32_t cy_cmd_ctrl;
3275 	u_int32_t idedma_ctl;
3276 	struct pciide_channel *cp = (struct pciide_channel*)chp;
3277 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
3278 	int dma_mode = -1;
3279 
3280 	cy_cmd_ctrl = idedma_ctl = 0;
3281 
3282 	/* setup DMA if needed */
3283 	pciide_channel_dma_setup(cp);
3284 
3285 	for (drive = 0; drive < 2; drive++) {
3286 		drvp = &chp->ch_drive[drive];
3287 		/* If no drive, skip */
3288 		if ((drvp->drive_flags & DRIVE) == 0)
3289 			continue;
3290 		/* add timing values, setup DMA if needed */
3291 		if (drvp->drive_flags & DRIVE_DMA) {
3292 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3293 			/* use Multiword DMA */
3294 			if (dma_mode == -1 || dma_mode > drvp->DMA_mode)
3295 				dma_mode = drvp->DMA_mode;
3296 		}
3297 		cy_cmd_ctrl |= (cy_pio_pulse[drvp->PIO_mode] <<
3298 		    CY_CMD_CTRL_IOW_PULSE_OFF(drive));
3299 		cy_cmd_ctrl |= (cy_pio_rec[drvp->PIO_mode] <<
3300 		    CY_CMD_CTRL_IOW_REC_OFF(drive));
3301 		cy_cmd_ctrl |= (cy_pio_pulse[drvp->PIO_mode] <<
3302 		    CY_CMD_CTRL_IOR_PULSE_OFF(drive));
3303 		cy_cmd_ctrl |= (cy_pio_rec[drvp->PIO_mode] <<
3304 		    CY_CMD_CTRL_IOR_REC_OFF(drive));
3305 	}
3306 	pci_conf_write(sc->sc_pc, sc->sc_tag, CY_CMD_CTRL, cy_cmd_ctrl);
3307 	chp->ch_drive[0].DMA_mode = dma_mode;
3308 	chp->ch_drive[1].DMA_mode = dma_mode;
3309 
3310 	if (dma_mode == -1)
3311 		dma_mode = 0;
3312 
3313 	if (sc->sc_cy_handle != NULL) {
3314 		/* Note: `multiple' is implied. */
3315 		cy82c693_write(sc->sc_cy_handle,
3316 		    (sc->sc_cy_compatchan == 0) ?
3317 		    CY_DMA_IDX_PRIMARY : CY_DMA_IDX_SECONDARY, dma_mode);
3318 	}
3319 
3320 	pciide_print_modes(cp);
3321 
3322 	if (idedma_ctl != 0) {
3323 		/* Add software bits in status register */
3324 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
3325 		    IDEDMA_CTL, idedma_ctl);
3326 	}
3327 }
3328 
3329 static struct sis_hostbr_type {
3330 	u_int16_t id;
3331 	u_int8_t rev;
3332 	u_int8_t udma_mode;
3333 	char *name;
3334 	u_int8_t type;
3335 #define SIS_TYPE_NOUDMA	0
3336 #define SIS_TYPE_66	1
3337 #define SIS_TYPE_100OLD	2
3338 #define SIS_TYPE_100NEW 3
3339 #define SIS_TYPE_133OLD 4
3340 #define SIS_TYPE_133NEW 5
3341 #define SIS_TYPE_SOUTH	6
3342 } sis_hostbr_type[] = {
3343 	/* Most infos here are from sos@freebsd.org */
3344 	{PCI_PRODUCT_SIS_530HB, 0x00, 4, "530", SIS_TYPE_66},
3345 #if 0
3346 	/*
3347 	 * controllers associated to a rev 0x2 530 Host to PCI Bridge
3348 	 * have problems with UDMA (info provided by Christos)
3349 	 */
3350 	{PCI_PRODUCT_SIS_530HB, 0x02, 0, "530 (buggy)", SIS_TYPE_NOUDMA},
3351 #endif
3352 	{PCI_PRODUCT_SIS_540HB, 0x00, 4, "540", SIS_TYPE_66},
3353 	{PCI_PRODUCT_SIS_550HB, 0x00, 4, "550", SIS_TYPE_66},
3354 	{PCI_PRODUCT_SIS_620,   0x00, 4, "620", SIS_TYPE_66},
3355 	{PCI_PRODUCT_SIS_630,   0x00, 4, "630", SIS_TYPE_66},
3356 	{PCI_PRODUCT_SIS_630,   0x30, 5, "630S", SIS_TYPE_100NEW},
3357 	{PCI_PRODUCT_SIS_633,   0x00, 5, "633", SIS_TYPE_100NEW},
3358 	{PCI_PRODUCT_SIS_635,   0x00, 5, "635", SIS_TYPE_100NEW},
3359 	{PCI_PRODUCT_SIS_640,   0x00, 4, "640", SIS_TYPE_SOUTH},
3360 	{PCI_PRODUCT_SIS_645,   0x00, 6, "645", SIS_TYPE_SOUTH},
3361 	{PCI_PRODUCT_SIS_646,   0x00, 6, "645DX", SIS_TYPE_SOUTH},
3362 	{PCI_PRODUCT_SIS_648,   0x00, 6, "648", SIS_TYPE_SOUTH},
3363 	{PCI_PRODUCT_SIS_650,   0x00, 6, "650", SIS_TYPE_SOUTH},
3364 	{PCI_PRODUCT_SIS_651,   0x00, 6, "651", SIS_TYPE_SOUTH},
3365 	{PCI_PRODUCT_SIS_652,   0x00, 6, "652", SIS_TYPE_SOUTH},
3366 	{PCI_PRODUCT_SIS_655,   0x00, 6, "655", SIS_TYPE_SOUTH},
3367 	{PCI_PRODUCT_SIS_658,   0x00, 6, "658", SIS_TYPE_SOUTH},
3368 	{PCI_PRODUCT_SIS_730,   0x00, 5, "730", SIS_TYPE_100OLD},
3369 	{PCI_PRODUCT_SIS_733,   0x00, 5, "733", SIS_TYPE_100NEW},
3370 	{PCI_PRODUCT_SIS_735,   0x00, 5, "735", SIS_TYPE_100NEW},
3371 	{PCI_PRODUCT_SIS_740,   0x00, 5, "740", SIS_TYPE_SOUTH},
3372 	{PCI_PRODUCT_SIS_745,   0x00, 5, "745", SIS_TYPE_100NEW},
3373 	{PCI_PRODUCT_SIS_746,   0x00, 6, "746", SIS_TYPE_SOUTH},
3374 	{PCI_PRODUCT_SIS_748,   0x00, 6, "748", SIS_TYPE_SOUTH},
3375 	{PCI_PRODUCT_SIS_750,   0x00, 6, "750", SIS_TYPE_SOUTH},
3376 	{PCI_PRODUCT_SIS_751,   0x00, 6, "751", SIS_TYPE_SOUTH},
3377 	{PCI_PRODUCT_SIS_752,   0x00, 6, "752", SIS_TYPE_SOUTH},
3378 	{PCI_PRODUCT_SIS_755,   0x00, 6, "755", SIS_TYPE_SOUTH},
3379 	/*
3380 	 * From sos@freebsd.org: the 0x961 ID will never be found in real world
3381 	 * {PCI_PRODUCT_SIS_961,   0x00, 6, "961", SIS_TYPE_133NEW},
3382 	 */
3383 	{PCI_PRODUCT_SIS_962,   0x00, 6, "962", SIS_TYPE_133NEW},
3384 	{PCI_PRODUCT_SIS_963,   0x00, 6, "963", SIS_TYPE_133NEW},
3385 };
3386 
3387 static struct sis_hostbr_type *sis_hostbr_type_match;
3388 
3389 static int
3390 sis_hostbr_match(pa)
3391 	struct pci_attach_args *pa;
3392 {
3393 	int i;
3394 	if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_SIS)
3395 		return 0;
3396 	sis_hostbr_type_match = NULL;
3397 	for (i = 0;
3398 	    i < sizeof(sis_hostbr_type) / sizeof(sis_hostbr_type[0]);
3399 	    i++) {
3400 		if (PCI_PRODUCT(pa->pa_id) == sis_hostbr_type[i].id &&
3401 		    PCI_REVISION(pa->pa_class) >= sis_hostbr_type[i].rev)
3402 			sis_hostbr_type_match = &sis_hostbr_type[i];
3403 	}
3404 	return (sis_hostbr_type_match != NULL);
3405 }
3406 
3407 static int sis_south_match(pa)
3408 	struct pci_attach_args *pa;
3409 {
3410 	return(PCI_VENDOR(pa->pa_id) == PCI_VENDOR_SIS &&
3411 		PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_SIS_85C503 &&
3412 		PCI_REVISION(pa->pa_class) >= 0x10);
3413 }
3414 
3415 void
3416 sis_chip_map(sc, pa)
3417 	struct pciide_softc *sc;
3418 	struct pci_attach_args *pa;
3419 {
3420 	struct pciide_channel *cp;
3421 	int channel;
3422 	u_int8_t sis_ctr0 = pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_CTRL0);
3423 	pcireg_t interface = PCI_INTERFACE(pa->pa_class);
3424 	pcireg_t rev = PCI_REVISION(pa->pa_class);
3425 	bus_size_t cmdsize, ctlsize;
3426 
3427 	if (pciide_chipen(sc, pa) == 0)
3428 		return;
3429 	printf(": Silicon Integrated System ");
3430 	pci_find_device(NULL, sis_hostbr_match);
3431 	if (sis_hostbr_type_match) {
3432 		if (sis_hostbr_type_match->type == SIS_TYPE_SOUTH) {
3433 			pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_REG_57,
3434 			    pciide_pci_read(sc->sc_pc, sc->sc_tag,
3435 			    SIS_REG_57) & 0x7f);
3436 			if (PCI_PRODUCT(pci_conf_read(sc->sc_pc, sc->sc_tag,
3437 			    PCI_ID_REG)) == SIS_PRODUCT_5518) {
3438 				printf("96X UDMA%d",
3439 				    sis_hostbr_type_match->udma_mode);
3440 				sc->sis_type = SIS_TYPE_133NEW;
3441 				sc->sc_wdcdev.UDMA_cap =
3442 			    	    sis_hostbr_type_match->udma_mode;
3443 			} else {
3444 				if (pci_find_device(NULL, sis_south_match)) {
3445 					sc->sis_type = SIS_TYPE_133OLD;
3446 					sc->sc_wdcdev.UDMA_cap =
3447 				    	    sis_hostbr_type_match->udma_mode;
3448 				} else {
3449 					sc->sis_type = SIS_TYPE_100NEW;
3450 					sc->sc_wdcdev.UDMA_cap =
3451 					    sis_hostbr_type_match->udma_mode;
3452 				}
3453 			}
3454 		} else {
3455 			sc->sis_type = sis_hostbr_type_match->type;
3456 			sc->sc_wdcdev.UDMA_cap =
3457 		    	    sis_hostbr_type_match->udma_mode;
3458 		}
3459 		printf(sis_hostbr_type_match->name);
3460 	} else {
3461 		printf("5597/5598");
3462 		if (rev >= 0xd0) {
3463 			sc->sc_wdcdev.UDMA_cap = 2;
3464 			sc->sis_type = SIS_TYPE_66;
3465 		} else {
3466 			sc->sc_wdcdev.UDMA_cap = 0;
3467 			sc->sis_type = SIS_TYPE_NOUDMA;
3468 		}
3469 	}
3470 	printf(" IDE controller (rev. 0x%02x)\n", PCI_REVISION(pa->pa_class));
3471 	printf("%s: bus-master DMA support present",
3472 	    sc->sc_wdcdev.sc_dev.dv_xname);
3473 	pciide_mapreg_dma(sc, pa);
3474 	printf("\n");
3475 
3476 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
3477 	    WDC_CAPABILITY_MODE;
3478 	if (sc->sc_dma_ok) {
3479 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
3480 		sc->sc_wdcdev.irqack = pciide_irqack;
3481 		if (sc->sis_type >= SIS_TYPE_66)
3482 			sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
3483 	}
3484 
3485 	sc->sc_wdcdev.PIO_cap = 4;
3486 	sc->sc_wdcdev.DMA_cap = 2;
3487 
3488 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
3489 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
3490 	switch(sc->sis_type) {
3491 	case SIS_TYPE_NOUDMA:
3492 	case SIS_TYPE_66:
3493 	case SIS_TYPE_100OLD:
3494 		sc->sc_wdcdev.set_modes = sis_setup_channel;
3495 		pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_MISC,
3496 		    pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_MISC) |
3497 		    SIS_MISC_TIM_SEL | SIS_MISC_FIFO_SIZE | SIS_MISC_GTC);
3498 		break;
3499 	case SIS_TYPE_100NEW:
3500 	case SIS_TYPE_133OLD:
3501 		sc->sc_wdcdev.set_modes = sis_setup_channel;
3502 		pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_REG_49,
3503 		    pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_REG_49) | 0x01);
3504 		break;
3505 	case SIS_TYPE_133NEW:
3506 		sc->sc_wdcdev.set_modes = sis96x_setup_channel;
3507 		pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_REG_50,
3508 		    pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_REG_50) & 0xf7);
3509 		pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_REG_52,
3510 		    pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_REG_52) & 0xf7);
3511 		break;
3512 	}
3513 
3514 
3515 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
3516 		cp = &sc->pciide_channels[channel];
3517 		if (pciide_chansetup(sc, channel, interface) == 0)
3518 			continue;
3519 		if ((channel == 0 && (sis_ctr0 & SIS_CTRL0_CHAN0_EN) == 0) ||
3520 		    (channel == 1 && (sis_ctr0 & SIS_CTRL0_CHAN1_EN) == 0)) {
3521 			printf("%s: %s channel ignored (disabled)\n",
3522 			    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
3523 			continue;
3524 		}
3525 		pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
3526 		    pciide_pci_intr);
3527 		if (cp->hw_ok == 0)
3528 			continue;
3529 		if (pciide_chan_candisable(cp)) {
3530 			if (channel == 0)
3531 				sis_ctr0 &= ~SIS_CTRL0_CHAN0_EN;
3532 			else
3533 				sis_ctr0 &= ~SIS_CTRL0_CHAN1_EN;
3534 			pciide_pci_write(sc->sc_pc, sc->sc_tag, SIS_CTRL0,
3535 			    sis_ctr0);
3536 		}
3537 		pciide_map_compat_intr(pa, cp, channel, interface);
3538 		if (cp->hw_ok == 0)
3539 			continue;
3540 		sc->sc_wdcdev.set_modes(&cp->wdc_channel);
3541 	}
3542 }
3543 
3544 void
3545 sis96x_setup_channel(chp)
3546 	struct channel_softc *chp;
3547 {
3548 	struct ata_drive_datas *drvp;
3549 	int drive;
3550 	u_int32_t sis_tim;
3551 	u_int32_t idedma_ctl;
3552 	int regtim;
3553 	struct pciide_channel *cp = (struct pciide_channel*)chp;
3554 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
3555 
3556 	sis_tim = 0;
3557 	idedma_ctl = 0;
3558 	/* setup DMA if needed */
3559 	pciide_channel_dma_setup(cp);
3560 
3561 	for (drive = 0; drive < 2; drive++) {
3562 		regtim = SIS_TIM133(
3563 		    pciide_pci_read(sc->sc_pc, sc->sc_tag, SIS_REG_57),
3564 		    chp->channel, drive);
3565 		drvp = &chp->ch_drive[drive];
3566 		/* If no drive, skip */
3567 		if ((drvp->drive_flags & DRIVE) == 0)
3568 			continue;
3569 		/* add timing values, setup DMA if needed */
3570 		if (drvp->drive_flags & DRIVE_UDMA) {
3571 			/* use Ultra/DMA */
3572 			drvp->drive_flags &= ~DRIVE_DMA;
3573 			if (pciide_pci_read(sc->sc_pc, sc->sc_tag,
3574 			    SIS96x_REG_CBL(chp->channel)) & SIS96x_REG_CBL_33) {
3575 				if (drvp->UDMA_mode > 2)
3576 					drvp->UDMA_mode = 2;
3577 			}
3578 			sis_tim |= sis_udma133new_tim[drvp->UDMA_mode];
3579 			sis_tim |= sis_pio133new_tim[drvp->PIO_mode];
3580 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3581 		} else if (drvp->drive_flags & DRIVE_DMA) {
3582 			/*
3583 			 * use Multiword DMA
3584 			 * Timings will be used for both PIO and DMA,
3585 			 * so adjust DMA mode if needed
3586 			 */
3587 			if (drvp->PIO_mode > (drvp->DMA_mode + 2))
3588 				drvp->PIO_mode = drvp->DMA_mode + 2;
3589 			if (drvp->DMA_mode + 2 > (drvp->PIO_mode))
3590 				drvp->DMA_mode = (drvp->PIO_mode > 2) ?
3591 				    drvp->PIO_mode - 2 : 0;
3592 			sis_tim |= sis_dma133new_tim[drvp->DMA_mode];
3593 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3594 		} else {
3595 			sis_tim |= sis_pio133new_tim[drvp->PIO_mode];
3596 		}
3597 		WDCDEBUG_PRINT(("sis96x_setup_channel: new timings reg for "
3598 		    "channel %d drive %d: 0x%x (reg 0x%x)\n",
3599 		    chp->channel, drive, sis_tim, regtim), DEBUG_PROBE);
3600 		pci_conf_write(sc->sc_pc, sc->sc_tag, regtim, sis_tim);
3601 	}
3602 	if (idedma_ctl != 0) {
3603 		/* Add software bits in status register */
3604 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
3605 		    IDEDMA_CTL+ (IDEDMA_SCH_OFFSET * chp->channel),
3606 		    idedma_ctl);
3607 	}
3608 	pciide_print_modes(cp);
3609 }
3610 
3611 void
3612 sis_setup_channel(chp)
3613 	struct channel_softc *chp;
3614 {
3615 	struct ata_drive_datas *drvp;
3616 	int drive;
3617 	u_int32_t sis_tim;
3618 	u_int32_t idedma_ctl;
3619 	struct pciide_channel *cp = (struct pciide_channel*)chp;
3620 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
3621 
3622 	WDCDEBUG_PRINT(("sis_setup_channel: old timings reg for "
3623 	    "channel %d 0x%x\n", chp->channel,
3624 	    pci_conf_read(sc->sc_pc, sc->sc_tag, SIS_TIM(chp->channel))),
3625 	    DEBUG_PROBE);
3626 	sis_tim = 0;
3627 	idedma_ctl = 0;
3628 	/* setup DMA if needed */
3629 	pciide_channel_dma_setup(cp);
3630 
3631 	for (drive = 0; drive < 2; drive++) {
3632 		drvp = &chp->ch_drive[drive];
3633 		/* If no drive, skip */
3634 		if ((drvp->drive_flags & DRIVE) == 0)
3635 			continue;
3636 		/* add timing values, setup DMA if needed */
3637 		if ((drvp->drive_flags & DRIVE_DMA) == 0 &&
3638 		    (drvp->drive_flags & DRIVE_UDMA) == 0)
3639 			goto pio;
3640 
3641 		if (drvp->drive_flags & DRIVE_UDMA) {
3642 			/* use Ultra/DMA */
3643 			drvp->drive_flags &= ~DRIVE_DMA;
3644 			if (pciide_pci_read(sc->sc_pc, sc->sc_tag,
3645 			    SIS_REG_CBL) & SIS_REG_CBL_33(chp->channel)) {
3646 				if (drvp->UDMA_mode > 2)
3647 					drvp->UDMA_mode = 2;
3648 			}
3649 			switch (sc->sis_type) {
3650 			case SIS_TYPE_66:
3651 			case SIS_TYPE_100OLD:
3652 				sis_tim |= sis_udma66_tim[drvp->UDMA_mode] <<
3653 				    SIS_TIM66_UDMA_TIME_OFF(drive);
3654 				break;
3655 			case SIS_TYPE_100NEW:
3656 				sis_tim |=
3657 				    sis_udma100new_tim[drvp->UDMA_mode] <<
3658 				    SIS_TIM100_UDMA_TIME_OFF(drive);
3659 			case SIS_TYPE_133OLD:
3660 				sis_tim |=
3661 				    sis_udma133old_tim[drvp->UDMA_mode] <<
3662 				    SIS_TIM100_UDMA_TIME_OFF(drive);
3663 				break;
3664 			default:
3665 				printf("unknown SiS IDE type %d\n",
3666 				    sc->sis_type);
3667 			}
3668 		} else {
3669 			/*
3670 			 * use Multiword DMA
3671 			 * Timings will be used for both PIO and DMA,
3672 			 * so adjust DMA mode if needed
3673 			 */
3674 			if (drvp->PIO_mode > (drvp->DMA_mode + 2))
3675 				drvp->PIO_mode = drvp->DMA_mode + 2;
3676 			if (drvp->DMA_mode + 2 > (drvp->PIO_mode))
3677 				drvp->DMA_mode = (drvp->PIO_mode > 2) ?
3678 				    drvp->PIO_mode - 2 : 0;
3679 			if (drvp->DMA_mode == 0)
3680 				drvp->PIO_mode = 0;
3681 		}
3682 		idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3683 pio:		switch (sc->sis_type) {
3684 		case SIS_TYPE_NOUDMA:
3685 		case SIS_TYPE_66:
3686 		case SIS_TYPE_100OLD:
3687 			sis_tim |= sis_pio_act[drvp->PIO_mode] <<
3688 			    SIS_TIM66_ACT_OFF(drive);
3689 			sis_tim |= sis_pio_rec[drvp->PIO_mode] <<
3690 			    SIS_TIM66_REC_OFF(drive);
3691 			break;
3692 		case SIS_TYPE_100NEW:
3693 		case SIS_TYPE_133OLD:
3694 			sis_tim |= sis_pio_act[drvp->PIO_mode] <<
3695 			    SIS_TIM100_ACT_OFF(drive);
3696 			sis_tim |= sis_pio_rec[drvp->PIO_mode] <<
3697 			    SIS_TIM100_REC_OFF(drive);
3698 			break;
3699 		default:
3700 			printf("unknown SiS IDE type %d\n",
3701 			    sc->sis_type);
3702 		}
3703 	}
3704 	WDCDEBUG_PRINT(("sis_setup_channel: new timings reg for "
3705 	    "channel %d 0x%x\n", chp->channel, sis_tim), DEBUG_PROBE);
3706 	pci_conf_write(sc->sc_pc, sc->sc_tag, SIS_TIM(chp->channel), sis_tim);
3707 	if (idedma_ctl != 0) {
3708 		/* Add software bits in status register */
3709 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
3710 		    IDEDMA_CTL+ (IDEDMA_SCH_OFFSET * chp->channel),
3711 		    idedma_ctl);
3712 	}
3713 	pciide_print_modes(cp);
3714 }
3715 
3716 void
3717 acer_chip_map(sc, pa)
3718 	struct pciide_softc *sc;
3719 	struct pci_attach_args *pa;
3720 {
3721 	struct pciide_channel *cp;
3722 	int channel;
3723 	pcireg_t cr, interface;
3724 	bus_size_t cmdsize, ctlsize;
3725 	pcireg_t rev = PCI_REVISION(pa->pa_class);
3726 
3727 	if (pciide_chipen(sc, pa) == 0)
3728 		return;
3729 	printf("%s: bus-master DMA support present",
3730 	    sc->sc_wdcdev.sc_dev.dv_xname);
3731 	pciide_mapreg_dma(sc, pa);
3732 	printf("\n");
3733 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
3734 	    WDC_CAPABILITY_MODE;
3735 	if (sc->sc_dma_ok) {
3736 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA;
3737 		if (rev >= 0x20) {
3738 			sc->sc_wdcdev.cap |= WDC_CAPABILITY_UDMA;
3739 			if (rev >= 0xC4)
3740 				sc->sc_wdcdev.UDMA_cap = 5;
3741 			else if (rev >= 0xC2)
3742 				sc->sc_wdcdev.UDMA_cap = 4;
3743 			else
3744 				sc->sc_wdcdev.UDMA_cap = 2;
3745 		}
3746 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
3747 		sc->sc_wdcdev.irqack = pciide_irqack;
3748 	}
3749 
3750 	sc->sc_wdcdev.PIO_cap = 4;
3751 	sc->sc_wdcdev.DMA_cap = 2;
3752 	sc->sc_wdcdev.set_modes = acer_setup_channel;
3753 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
3754 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
3755 
3756 	pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_CDRC,
3757 	    (pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CDRC) |
3758 		ACER_CDRC_DMA_EN) & ~ACER_CDRC_FIFO_DISABLE);
3759 
3760 	/* Enable "microsoft register bits" R/W. */
3761 	pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_CCAR3,
3762 	    pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CCAR3) | ACER_CCAR3_PI);
3763 	pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_CCAR1,
3764 	    pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CCAR1) &
3765 	    ~(ACER_CHANSTATUS_RO|PCIIDE_CHAN_RO(0)|PCIIDE_CHAN_RO(1)));
3766 	pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_CCAR2,
3767 	    pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CCAR2) &
3768 	    ~ACER_CHANSTATUSREGS_RO);
3769 	cr = pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG);
3770 	cr |= (PCIIDE_CHANSTATUS_EN << PCI_INTERFACE_SHIFT);
3771 	pci_conf_write(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG, cr);
3772 	/* Don't use cr, re-read the real register content instead */
3773 	interface = PCI_INTERFACE(pci_conf_read(sc->sc_pc, sc->sc_tag,
3774 	    PCI_CLASS_REG));
3775 
3776 	/* From linux: enable "Cable Detection" */
3777 	if (rev >= 0xC2) {
3778 		pciide_pci_write(sc->sc_pc, sc->sc_tag, ACER_0x4B,
3779 		    pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_0x4B)
3780 		    | ACER_0x4B_CDETECT);
3781 	}
3782 
3783 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
3784 		cp = &sc->pciide_channels[channel];
3785 		if (pciide_chansetup(sc, channel, interface) == 0)
3786 			continue;
3787 		if ((interface & PCIIDE_CHAN_EN(channel)) == 0) {
3788 			printf("%s: %s channel ignored (disabled)\n",
3789 			    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
3790 			continue;
3791 		}
3792 		/* newer controllers seems to lack the ACER_CHIDS. Sigh */
3793 		pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
3794 		     (rev >= 0xC2) ? pciide_pci_intr : acer_pci_intr);
3795 		if (cp->hw_ok == 0)
3796 			continue;
3797 		if (pciide_chan_candisable(cp)) {
3798 			cr &= ~(PCIIDE_CHAN_EN(channel) << PCI_INTERFACE_SHIFT);
3799 			pci_conf_write(sc->sc_pc, sc->sc_tag,
3800 			    PCI_CLASS_REG, cr);
3801 		}
3802 		pciide_map_compat_intr(pa, cp, channel, interface);
3803 		acer_setup_channel(&cp->wdc_channel);
3804 	}
3805 }
3806 
3807 void
3808 acer_setup_channel(chp)
3809 	struct channel_softc *chp;
3810 {
3811 	struct ata_drive_datas *drvp;
3812 	int drive;
3813 	u_int32_t acer_fifo_udma;
3814 	u_int32_t idedma_ctl;
3815 	struct pciide_channel *cp = (struct pciide_channel*)chp;
3816 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
3817 
3818 	idedma_ctl = 0;
3819 	acer_fifo_udma = pci_conf_read(sc->sc_pc, sc->sc_tag, ACER_FTH_UDMA);
3820 	WDCDEBUG_PRINT(("acer_setup_channel: old fifo/udma reg 0x%x\n",
3821 	    acer_fifo_udma), DEBUG_PROBE);
3822 	/* setup DMA if needed */
3823 	pciide_channel_dma_setup(cp);
3824 
3825 	if ((chp->ch_drive[0].drive_flags | chp->ch_drive[1].drive_flags) &
3826 	    DRIVE_UDMA) { /* check 80 pins cable */
3827 		if (pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_0x4A) &
3828 		    ACER_0x4A_80PIN(chp->channel)) {
3829 			if (chp->ch_drive[0].UDMA_mode > 2)
3830 				chp->ch_drive[0].UDMA_mode = 2;
3831 			if (chp->ch_drive[1].UDMA_mode > 2)
3832 				chp->ch_drive[1].UDMA_mode = 2;
3833 		}
3834 	}
3835 
3836 	for (drive = 0; drive < 2; drive++) {
3837 		drvp = &chp->ch_drive[drive];
3838 		/* If no drive, skip */
3839 		if ((drvp->drive_flags & DRIVE) == 0)
3840 			continue;
3841 		WDCDEBUG_PRINT(("acer_setup_channel: old timings reg for "
3842 		    "channel %d drive %d 0x%x\n", chp->channel, drive,
3843 		    pciide_pci_read(sc->sc_pc, sc->sc_tag,
3844 		    ACER_IDETIM(chp->channel, drive))), DEBUG_PROBE);
3845 		/* clear FIFO/DMA mode */
3846 		acer_fifo_udma &= ~(ACER_FTH_OPL(chp->channel, drive, 0x3) |
3847 		    ACER_UDMA_EN(chp->channel, drive) |
3848 		    ACER_UDMA_TIM(chp->channel, drive, 0x7));
3849 
3850 		/* add timing values, setup DMA if needed */
3851 		if ((drvp->drive_flags & DRIVE_DMA) == 0 &&
3852 		    (drvp->drive_flags & DRIVE_UDMA) == 0) {
3853 			acer_fifo_udma |=
3854 			    ACER_FTH_OPL(chp->channel, drive, 0x1);
3855 			goto pio;
3856 		}
3857 
3858 		acer_fifo_udma |= ACER_FTH_OPL(chp->channel, drive, 0x2);
3859 		if (drvp->drive_flags & DRIVE_UDMA) {
3860 			/* use Ultra/DMA */
3861 			drvp->drive_flags &= ~DRIVE_DMA;
3862 			acer_fifo_udma |= ACER_UDMA_EN(chp->channel, drive);
3863 			acer_fifo_udma |=
3864 			    ACER_UDMA_TIM(chp->channel, drive,
3865 				acer_udma[drvp->UDMA_mode]);
3866 			/* XXX disable if one drive < UDMA3 ? */
3867 			if (drvp->UDMA_mode >= 3) {
3868 				pciide_pci_write(sc->sc_pc, sc->sc_tag,
3869 				    ACER_0x4B,
3870 				    pciide_pci_read(sc->sc_pc, sc->sc_tag,
3871 					ACER_0x4B) | ACER_0x4B_UDMA66);
3872 			}
3873 		} else {
3874 			/*
3875 			 * use Multiword DMA
3876 			 * Timings will be used for both PIO and DMA,
3877 			 * so adjust DMA mode if needed
3878 			 */
3879 			if (drvp->PIO_mode > (drvp->DMA_mode + 2))
3880 				drvp->PIO_mode = drvp->DMA_mode + 2;
3881 			if (drvp->DMA_mode + 2 > (drvp->PIO_mode))
3882 				drvp->DMA_mode = (drvp->PIO_mode > 2) ?
3883 				    drvp->PIO_mode - 2 : 0;
3884 			if (drvp->DMA_mode == 0)
3885 				drvp->PIO_mode = 0;
3886 		}
3887 		idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
3888 pio:		pciide_pci_write(sc->sc_pc, sc->sc_tag,
3889 		    ACER_IDETIM(chp->channel, drive),
3890 		    acer_pio[drvp->PIO_mode]);
3891 	}
3892 	WDCDEBUG_PRINT(("acer_setup_channel: new fifo/udma reg 0x%x\n",
3893 	    acer_fifo_udma), DEBUG_PROBE);
3894 	pci_conf_write(sc->sc_pc, sc->sc_tag, ACER_FTH_UDMA, acer_fifo_udma);
3895 	if (idedma_ctl != 0) {
3896 		/* Add software bits in status register */
3897 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
3898 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
3899 		    idedma_ctl);
3900 	}
3901 	pciide_print_modes(cp);
3902 }
3903 
3904 int
3905 acer_pci_intr(arg)
3906 	void *arg;
3907 {
3908 	struct pciide_softc *sc = arg;
3909 	struct pciide_channel *cp;
3910 	struct channel_softc *wdc_cp;
3911 	int i, rv, crv;
3912 	u_int32_t chids;
3913 
3914 	rv = 0;
3915 	chids = pciide_pci_read(sc->sc_pc, sc->sc_tag, ACER_CHIDS);
3916 	for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
3917 		cp = &sc->pciide_channels[i];
3918 		wdc_cp = &cp->wdc_channel;
3919 		/* If a compat channel skip. */
3920 		if (cp->compat)
3921 			continue;
3922 		if (chids & ACER_CHIDS_INT(i)) {
3923 			crv = wdcintr(wdc_cp);
3924 			if (crv == 0)
3925 				printf("%s:%d: bogus intr\n",
3926 				    sc->sc_wdcdev.sc_dev.dv_xname, i);
3927 			else
3928 				rv = 1;
3929 		}
3930 	}
3931 	return rv;
3932 }
3933 
3934 void
3935 hpt_chip_map(sc, pa)
3936 	struct pciide_softc *sc;
3937 	struct pci_attach_args *pa;
3938 {
3939 	struct pciide_channel *cp;
3940 	int i, compatchan, revision;
3941 	pcireg_t interface;
3942 	bus_size_t cmdsize, ctlsize;
3943 
3944 	if (pciide_chipen(sc, pa) == 0)
3945 		return;
3946 	revision = PCI_REVISION(pa->pa_class);
3947 	printf(": Triones/Highpoint ");
3948 	if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374)
3949 		printf("HPT374 IDE Controller\n");
3950 	else if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372)
3951 		printf("HPT372 IDE Controller\n");
3952 	else if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366) {
3953 		if (revision == HPT372_REV)
3954 			printf("HPT372 IDE Controller\n");
3955 		else if (revision == HPT370_REV)
3956 			printf("HPT370 IDE Controller\n");
3957 		else if (revision == HPT370A_REV)
3958 			printf("HPT370A IDE Controller\n");
3959 		else if (revision == HPT366_REV)
3960 			printf("HPT366 IDE Controller\n");
3961 		else
3962 			printf("unknown HPT IDE controller rev %d\n", revision);
3963 	} else
3964 		printf("unknown HPT IDE controller 0x%x\n",
3965 		    sc->sc_pp->ide_product);
3966 
3967 	/*
3968 	 * when the chip is in native mode it identifies itself as a
3969 	 * 'misc mass storage'. Fake interface in this case.
3970 	 */
3971 	if (PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_IDE) {
3972 		interface = PCI_INTERFACE(pa->pa_class);
3973 	} else {
3974 		interface = PCIIDE_INTERFACE_BUS_MASTER_DMA |
3975 		    PCIIDE_INTERFACE_PCI(0);
3976 		if ((sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 &&
3977 		    (revision == HPT370_REV || revision == HPT370A_REV ||
3978 		     revision == HPT372_REV)) ||
3979 		    sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372 ||
3980 		    sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374)
3981 			interface |= PCIIDE_INTERFACE_PCI(1);
3982 	}
3983 
3984 	printf("%s: bus-master DMA support present",
3985 		sc->sc_wdcdev.sc_dev.dv_xname);
3986 	pciide_mapreg_dma(sc, pa);
3987 	printf("\n");
3988 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
3989 	    WDC_CAPABILITY_MODE;
3990 	if (sc->sc_dma_ok) {
3991 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
3992 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
3993 		sc->sc_wdcdev.irqack = pciide_irqack;
3994 	}
3995 	sc->sc_wdcdev.PIO_cap = 4;
3996 	sc->sc_wdcdev.DMA_cap = 2;
3997 
3998 	sc->sc_wdcdev.set_modes = hpt_setup_channel;
3999 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
4000 	if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 &&
4001 	    revision == HPT366_REV) {
4002 		sc->sc_wdcdev.UDMA_cap = 4;
4003 		/*
4004 		 * The 366 has 2 PCI IDE functions, one for primary and one
4005 		 * for secondary. So we need to call pciide_mapregs_compat()
4006 		 * with the real channel
4007 		 */
4008 		if (pa->pa_function == 0) {
4009 			compatchan = 0;
4010 		} else if (pa->pa_function == 1) {
4011 			compatchan = 1;
4012 		} else {
4013 			printf("%s: unexpected PCI function %d\n",
4014 			    sc->sc_wdcdev.sc_dev.dv_xname, pa->pa_function);
4015 			return;
4016 		}
4017 		sc->sc_wdcdev.nchannels = 1;
4018 	} else {
4019 		sc->sc_wdcdev.nchannels = 2;
4020 		if (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374 ||
4021 		    sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372 ||
4022 		    (sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 &&
4023 		    revision == HPT372_REV))
4024 			sc->sc_wdcdev.UDMA_cap = 6;
4025 		else
4026 			sc->sc_wdcdev.UDMA_cap = 5;
4027 	}
4028 	for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
4029 		cp = &sc->pciide_channels[i];
4030 		if (sc->sc_wdcdev.nchannels > 1) {
4031 			compatchan = i;
4032 			if((pciide_pci_read(sc->sc_pc, sc->sc_tag,
4033 			   HPT370_CTRL1(i)) & HPT370_CTRL1_EN) == 0) {
4034 				printf("%s: %s channel ignored (disabled)\n",
4035 				    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
4036 				continue;
4037 			}
4038 		}
4039 		if (pciide_chansetup(sc, i, interface) == 0)
4040 			continue;
4041 		if (interface & PCIIDE_INTERFACE_PCI(i)) {
4042 			cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize,
4043 			    &ctlsize, hpt_pci_intr);
4044 		} else {
4045 			cp->hw_ok = pciide_mapregs_compat(pa, cp, compatchan,
4046 			    &cmdsize, &ctlsize);
4047 		}
4048 		if (cp->hw_ok == 0)
4049 			return;
4050 		cp->wdc_channel.data32iot = cp->wdc_channel.cmd_iot;
4051 		cp->wdc_channel.data32ioh = cp->wdc_channel.cmd_ioh;
4052 		wdcattach(&cp->wdc_channel);
4053 		hpt_setup_channel(&cp->wdc_channel);
4054 	}
4055 	if ((sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 &&
4056 	    (revision == HPT370_REV || revision == HPT370A_REV ||
4057 	     revision == HPT372_REV)) ||
4058 	    sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372 ||
4059 	    sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374) {
4060 		/*
4061 		 * HPT370_REV and highter has a bit to disable interrupts,
4062 		 * make sure to clear it
4063 		 */
4064 		pciide_pci_write(sc->sc_pc, sc->sc_tag, HPT_CSEL,
4065 		    pciide_pci_read(sc->sc_pc, sc->sc_tag, HPT_CSEL) &
4066 		    ~HPT_CSEL_IRQDIS);
4067 	}
4068 	/* set clocks, etc (mandatory on 372/4, optional otherwise) */
4069 	if ((sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT366 &&
4070 	     revision == HPT372_REV ) ||
4071 	    sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT372 ||
4072 	    sc->sc_pp->ide_product == PCI_PRODUCT_TRIONES_HPT374)
4073 		pciide_pci_write(sc->sc_pc, sc->sc_tag, HPT_SC2,
4074 		    (pciide_pci_read(sc->sc_pc, sc->sc_tag, HPT_SC2) &
4075 		     HPT_SC2_MAEN) | HPT_SC2_OSC_EN);
4076 	return;
4077 }
4078 
4079 void
4080 hpt_setup_channel(chp)
4081 	struct channel_softc *chp;
4082 {
4083 	struct ata_drive_datas *drvp;
4084 	int drive;
4085 	int cable;
4086 	u_int32_t before, after;
4087 	u_int32_t idedma_ctl;
4088 	struct pciide_channel *cp = (struct pciide_channel*)chp;
4089 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
4090 	int revision =
4091 	     PCI_REVISION(pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_CLASS_REG));
4092 
4093 	cable = pciide_pci_read(sc->sc_pc, sc->sc_tag, HPT_CSEL);
4094 
4095 	/* setup DMA if needed */
4096 	pciide_channel_dma_setup(cp);
4097 
4098 	idedma_ctl = 0;
4099 
4100 	/* Per drive settings */
4101 	for (drive = 0; drive < 2; drive++) {
4102 		drvp = &chp->ch_drive[drive];
4103 		/* If no drive, skip */
4104 		if ((drvp->drive_flags & DRIVE) == 0)
4105 			continue;
4106 		before = pci_conf_read(sc->sc_pc, sc->sc_tag,
4107 					HPT_IDETIM(chp->channel, drive));
4108 
4109 		/* add timing values, setup DMA if needed */
4110 		if (drvp->drive_flags & DRIVE_UDMA) {
4111 			/* use Ultra/DMA */
4112 			drvp->drive_flags &= ~DRIVE_DMA;
4113 			if ((cable & HPT_CSEL_CBLID(chp->channel)) != 0 &&
4114 			    drvp->UDMA_mode > 2)
4115 				drvp->UDMA_mode = 2;
4116 			switch (sc->sc_pp->ide_product) {
4117 			case PCI_PRODUCT_TRIONES_HPT374:
4118 				after = hpt374_udma[drvp->UDMA_mode];
4119 				break;
4120 			case PCI_PRODUCT_TRIONES_HPT372:
4121 				after = hpt372_udma[drvp->UDMA_mode];
4122 				break;
4123 			case PCI_PRODUCT_TRIONES_HPT366:
4124 			default:
4125 				switch(revision) {
4126 				case HPT372_REV:
4127 					after = hpt372_udma[drvp->UDMA_mode];
4128 					break;
4129 				case HPT370_REV:
4130 				case HPT370A_REV:
4131 					after = hpt370_udma[drvp->UDMA_mode];
4132 					break;
4133 				case HPT366_REV:
4134 				default:
4135 					after = hpt366_udma[drvp->UDMA_mode];
4136 					break;
4137 				}
4138 			}
4139 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
4140 		} else if (drvp->drive_flags & DRIVE_DMA) {
4141 			/*
4142 			 * use Multiword DMA.
4143 			 * Timings will be used for both PIO and DMA, so adjust
4144 			 * DMA mode if needed
4145 			 */
4146 			if (drvp->PIO_mode >= 3 &&
4147 			    (drvp->DMA_mode + 2) > drvp->PIO_mode) {
4148 				drvp->DMA_mode = drvp->PIO_mode - 2;
4149 			}
4150 			switch (sc->sc_pp->ide_product) {
4151 			case PCI_PRODUCT_TRIONES_HPT374:
4152 				after = hpt374_dma[drvp->DMA_mode];
4153 				break;
4154 			case PCI_PRODUCT_TRIONES_HPT372:
4155 				after = hpt372_dma[drvp->DMA_mode];
4156 				break;
4157 			case PCI_PRODUCT_TRIONES_HPT366:
4158 			default:
4159 				switch(revision) {
4160 				case HPT372_REV:
4161 					after = hpt372_dma[drvp->DMA_mode];
4162 					break;
4163 				case HPT370_REV:
4164 				case HPT370A_REV:
4165 					after = hpt370_dma[drvp->DMA_mode];
4166 					break;
4167 				case HPT366_REV:
4168 				default:
4169 					after = hpt366_dma[drvp->DMA_mode];
4170 					break;
4171 				}
4172 			}
4173 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
4174 		} else {
4175 			/* PIO only */
4176 			switch (sc->sc_pp->ide_product) {
4177 			case PCI_PRODUCT_TRIONES_HPT374:
4178 				after = hpt374_pio[drvp->PIO_mode];
4179 				break;
4180 			case PCI_PRODUCT_TRIONES_HPT372:
4181 				after = hpt372_pio[drvp->PIO_mode];
4182 				break;
4183 			case PCI_PRODUCT_TRIONES_HPT366:
4184 			default:
4185 				switch(revision) {
4186 				case HPT372_REV:
4187 					after = hpt372_pio[drvp->PIO_mode];
4188 					break;
4189 				case HPT370_REV:
4190 				case HPT370A_REV:
4191 					after = hpt370_pio[drvp->PIO_mode];
4192 					break;
4193 				case HPT366_REV:
4194 				default:
4195 					after = hpt366_pio[drvp->PIO_mode];
4196 					break;
4197 				}
4198 			}
4199 		}
4200 		pci_conf_write(sc->sc_pc, sc->sc_tag,
4201 		    HPT_IDETIM(chp->channel, drive), after);
4202 		WDCDEBUG_PRINT(("%s: bus speed register set to 0x%08x "
4203 		    "(BIOS 0x%08x)\n", drvp->drv_softc->dv_xname,
4204 		    after, before), DEBUG_PROBE);
4205 	}
4206 	if (idedma_ctl != 0) {
4207 		/* Add software bits in status register */
4208 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
4209 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
4210 		    idedma_ctl);
4211 	}
4212 	pciide_print_modes(cp);
4213 }
4214 
4215 int
4216 hpt_pci_intr(arg)
4217 	void *arg;
4218 {
4219 	struct pciide_softc *sc = arg;
4220 	struct pciide_channel *cp;
4221 	struct channel_softc *wdc_cp;
4222 	int rv = 0;
4223 	int dmastat, i, crv;
4224 
4225 	for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
4226 		dmastat = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
4227 		    IDEDMA_CTL + IDEDMA_SCH_OFFSET * i);
4228 		if((dmastat & ( IDEDMA_CTL_ACT | IDEDMA_CTL_INTR)) !=
4229 		    IDEDMA_CTL_INTR)
4230 			continue;
4231 		cp = &sc->pciide_channels[i];
4232 		wdc_cp = &cp->wdc_channel;
4233 		crv = wdcintr(wdc_cp);
4234 		if (crv == 0) {
4235 			printf("%s:%d: bogus intr\n",
4236 			    sc->sc_wdcdev.sc_dev.dv_xname, i);
4237 			bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
4238 			    IDEDMA_CTL + IDEDMA_SCH_OFFSET * i, dmastat);
4239 		} else
4240 			rv = 1;
4241 	}
4242 	return rv;
4243 }
4244 
4245 
4246 /* Macros to test product */
4247 #define PDC_IS_262(sc)							\
4248 	((sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA66 ||	\
4249 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100 ||	\
4250 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100X ||	\
4251 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100TX2 ||	\
4252 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100TX2v2 || \
4253 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133 ||	\
4254 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2 ||	\
4255 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_MBULTRA133 || \
4256 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2v2 || \
4257 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_FASTTRAK133LITE)
4258 #define PDC_IS_265(sc)							\
4259 	((sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100 ||	\
4260 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100X ||	\
4261 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100TX2 ||	\
4262 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100TX2v2 || \
4263 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133 ||	\
4264 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2 ||	\
4265 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_MBULTRA133 || \
4266 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2v2 || \
4267 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_FASTTRAK133LITE)
4268 #define PDC_IS_268(sc)							\
4269 	((sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100TX2 ||	\
4270 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100TX2v2 || \
4271 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133 ||	\
4272 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2 ||	\
4273 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_MBULTRA133 || \
4274 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2v2 || \
4275 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_FASTTRAK133LITE)
4276 #define PDC_IS_276(sc)							\
4277 	((sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133 ||	\
4278 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2 ||	\
4279 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_MBULTRA133 || \
4280 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA133TX2v2 || \
4281 	(sc)->sc_pp->ide_product == PCI_PRODUCT_PROMISE_FASTTRAK133LITE)
4282 
4283 void
4284 pdc202xx_chip_map(sc, pa)
4285 	struct pciide_softc *sc;
4286 	struct pci_attach_args *pa;
4287 {
4288 	struct pciide_channel *cp;
4289 	int channel;
4290 	pcireg_t interface, st, mode;
4291 	bus_size_t cmdsize, ctlsize;
4292 
4293 	if (!PDC_IS_268(sc)) {
4294 		st = pci_conf_read(sc->sc_pc, sc->sc_tag, PDC2xx_STATE);
4295 		WDCDEBUG_PRINT(("pdc202xx_setup_chip: controller state 0x%x\n",
4296 		    st), DEBUG_PROBE);
4297 	}
4298 	if (pciide_chipen(sc, pa) == 0)
4299 		return;
4300 
4301 	/* turn off  RAID mode */
4302 	if (!PDC_IS_268(sc))
4303 		st &= ~PDC2xx_STATE_IDERAID;
4304 
4305 	/*
4306 	 * can't rely on the PCI_CLASS_REG content if the chip was in raid
4307 	 * mode. We have to fake interface
4308 	 */
4309 	interface = PCIIDE_INTERFACE_SETTABLE(0) | PCIIDE_INTERFACE_SETTABLE(1);
4310 	if (PDC_IS_268(sc) || (st & PDC2xx_STATE_NATIVE))
4311 		interface |= PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1);
4312 
4313 	printf("%s: bus-master DMA support present",
4314 	    sc->sc_wdcdev.sc_dev.dv_xname);
4315 	pciide_mapreg_dma(sc, pa);
4316 	printf("\n");
4317 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
4318 	    WDC_CAPABILITY_MODE;
4319 	if (sc->sc_dma_ok) {
4320 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
4321 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
4322 		sc->sc_wdcdev.irqack = pciide_irqack;
4323 	}
4324 	if (PCI_CLASS(pa->pa_class) == PCI_CLASS_MASS_STORAGE &&
4325 	    PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_RAID)
4326 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_RAID;
4327 	sc->sc_wdcdev.PIO_cap = 4;
4328 	sc->sc_wdcdev.DMA_cap = 2;
4329 	if (PDC_IS_276(sc))
4330 		sc->sc_wdcdev.UDMA_cap = 6;
4331 	else if (PDC_IS_265(sc))
4332 		sc->sc_wdcdev.UDMA_cap = 5;
4333 	else if (PDC_IS_262(sc))
4334 		sc->sc_wdcdev.UDMA_cap = 4;
4335 	else
4336 		sc->sc_wdcdev.UDMA_cap = 2;
4337 	sc->sc_wdcdev.set_modes = PDC_IS_268(sc) ?
4338 			pdc20268_setup_channel : pdc202xx_setup_channel;
4339 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
4340 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
4341 
4342 	if (sc->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA66 ||
4343 	    sc->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100 ||
4344 	    sc->sc_pp->ide_product == PCI_PRODUCT_PROMISE_ULTRA100X) {
4345 		sc->sc_wdcdev.dma_start = pdc20262_dma_start;
4346 		sc->sc_wdcdev.dma_finish = pdc20262_dma_finish;
4347 	}
4348 
4349 	if (!PDC_IS_268(sc)) {
4350 		/* setup failsafe defaults */
4351 		mode = 0;
4352 		mode = PDC2xx_TIM_SET_PA(mode, pdc2xx_pa[0]);
4353 		mode = PDC2xx_TIM_SET_PB(mode, pdc2xx_pb[0]);
4354 		mode = PDC2xx_TIM_SET_MB(mode, pdc2xx_dma_mb[0]);
4355 		mode = PDC2xx_TIM_SET_MC(mode, pdc2xx_dma_mc[0]);
4356 		for (channel = 0;
4357 		     channel < sc->sc_wdcdev.nchannels;
4358 		     channel++) {
4359 			WDCDEBUG_PRINT(("pdc202xx_setup_chip: channel %d "
4360 			    "drive 0 initial timings  0x%x, now 0x%x\n",
4361 			    channel, pci_conf_read(sc->sc_pc, sc->sc_tag,
4362 			    PDC2xx_TIM(channel, 0)), mode | PDC2xx_TIM_IORDYp),
4363 			    DEBUG_PROBE);
4364 			pci_conf_write(sc->sc_pc, sc->sc_tag,
4365 			    PDC2xx_TIM(channel, 0), mode | PDC2xx_TIM_IORDYp);
4366 			WDCDEBUG_PRINT(("pdc202xx_setup_chip: channel %d "
4367 			    "drive 1 initial timings  0x%x, now 0x%x\n",
4368 			    channel, pci_conf_read(sc->sc_pc, sc->sc_tag,
4369 			    PDC2xx_TIM(channel, 1)), mode), DEBUG_PROBE);
4370 			pci_conf_write(sc->sc_pc, sc->sc_tag,
4371 			    PDC2xx_TIM(channel, 1), mode);
4372 		}
4373 
4374 		mode = PDC2xx_SCR_DMA;
4375 		if (PDC_IS_262(sc)) {
4376 			mode = PDC2xx_SCR_SET_GEN(mode, PDC262_SCR_GEN_LAT);
4377 		} else {
4378 			/* the BIOS set it up this way */
4379 			mode = PDC2xx_SCR_SET_GEN(mode, 0x1);
4380 		}
4381 		mode = PDC2xx_SCR_SET_I2C(mode, 0x3); /* ditto */
4382 		mode = PDC2xx_SCR_SET_POLL(mode, 0x1); /* ditto */
4383 		WDCDEBUG_PRINT(("pdc202xx_setup_chip: initial SCR  0x%x, "
4384 		    "now 0x%x\n",
4385 		    bus_space_read_4(sc->sc_dma_iot, sc->sc_dma_ioh,
4386 			PDC2xx_SCR),
4387 		    mode), DEBUG_PROBE);
4388 		bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh,
4389 		    PDC2xx_SCR, mode);
4390 
4391 		/* controller initial state register is OK even without BIOS */
4392 		/* Set DMA mode to IDE DMA compatibility */
4393 		mode =
4394 		    bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_PM);
4395 		WDCDEBUG_PRINT(("pdc202xx_setup_chip: primary mode 0x%x", mode),
4396 		    DEBUG_PROBE);
4397 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_PM,
4398 		    mode | 0x1);
4399 		mode =
4400 		    bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_SM);
4401 		WDCDEBUG_PRINT((", secondary mode 0x%x\n", mode ), DEBUG_PROBE);
4402 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_SM,
4403 		    mode | 0x1);
4404 	}
4405 
4406 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
4407 		cp = &sc->pciide_channels[channel];
4408 		if (pciide_chansetup(sc, channel, interface) == 0)
4409 			continue;
4410 		if (!PDC_IS_268(sc) && (st & (PDC_IS_262(sc) ?
4411 		    PDC262_STATE_EN(channel):PDC246_STATE_EN(channel))) == 0) {
4412 			printf("%s: %s channel ignored (disabled)\n",
4413 			    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
4414 			continue;
4415 		}
4416 		if (PDC_IS_265(sc))
4417 			pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
4418 			    pdc20265_pci_intr);
4419 		else
4420 			pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
4421 			    pdc202xx_pci_intr);
4422 		if (cp->hw_ok == 0)
4423 			continue;
4424 		if (!PDC_IS_268(sc) && pciide_chan_candisable(cp))
4425 			st &= ~(PDC_IS_262(sc) ?
4426 			    PDC262_STATE_EN(channel):PDC246_STATE_EN(channel));
4427 		pciide_map_compat_intr(pa, cp, channel, interface);
4428 		sc->sc_wdcdev.set_modes(&cp->wdc_channel);
4429 	}
4430 	if (!PDC_IS_268(sc)) {
4431 		WDCDEBUG_PRINT(("pdc202xx_setup_chip: new controller state "
4432 		    "0x%x\n", st), DEBUG_PROBE);
4433 		pci_conf_write(sc->sc_pc, sc->sc_tag, PDC2xx_STATE, st);
4434 	}
4435 	return;
4436 }
4437 
4438 void
4439 pdc202xx_setup_channel(chp)
4440 	struct channel_softc *chp;
4441 {
4442 	struct ata_drive_datas *drvp;
4443 	int drive;
4444 	pcireg_t mode, st;
4445 	u_int32_t idedma_ctl, scr, atapi;
4446 	struct pciide_channel *cp = (struct pciide_channel*)chp;
4447 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
4448 	int channel = chp->channel;
4449 
4450 	/* setup DMA if needed */
4451 	pciide_channel_dma_setup(cp);
4452 
4453 	idedma_ctl = 0;
4454 	WDCDEBUG_PRINT(("pdc202xx_setup_channel %s: scr 0x%x\n",
4455 	    sc->sc_wdcdev.sc_dev.dv_xname,
4456 	    bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh, PDC262_U66)),
4457 	    DEBUG_PROBE);
4458 
4459 	/* Per channel settings */
4460 	if (PDC_IS_262(sc)) {
4461 		scr = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
4462 		    PDC262_U66);
4463 		st = pci_conf_read(sc->sc_pc, sc->sc_tag, PDC2xx_STATE);
4464 		/* Trim UDMA mode */
4465 		if ((st & PDC262_STATE_80P(channel)) != 0 ||
4466 		    (chp->ch_drive[0].drive_flags & DRIVE_UDMA &&
4467 		    chp->ch_drive[0].UDMA_mode <= 2) ||
4468 		    (chp->ch_drive[1].drive_flags & DRIVE_UDMA &&
4469 		    chp->ch_drive[1].UDMA_mode <= 2)) {
4470 			if (chp->ch_drive[0].UDMA_mode > 2)
4471 				chp->ch_drive[0].UDMA_mode = 2;
4472 			if (chp->ch_drive[1].UDMA_mode > 2)
4473 				chp->ch_drive[1].UDMA_mode = 2;
4474 		}
4475 		/* Set U66 if needed */
4476 		if ((chp->ch_drive[0].drive_flags & DRIVE_UDMA &&
4477 		    chp->ch_drive[0].UDMA_mode > 2) ||
4478 		    (chp->ch_drive[1].drive_flags & DRIVE_UDMA &&
4479 		    chp->ch_drive[1].UDMA_mode > 2))
4480 			scr |= PDC262_U66_EN(channel);
4481 		else
4482 			scr &= ~PDC262_U66_EN(channel);
4483 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
4484 		    PDC262_U66, scr);
4485 		WDCDEBUG_PRINT(("pdc202xx_setup_channel %s:%d: ATAPI 0x%x\n",
4486 		    sc->sc_wdcdev.sc_dev.dv_xname, channel,
4487 		    bus_space_read_4(sc->sc_dma_iot, sc->sc_dma_ioh,
4488 		    PDC262_ATAPI(channel))), DEBUG_PROBE);
4489 		if (chp->ch_drive[0].drive_flags & DRIVE_ATAPI ||
4490 			chp->ch_drive[1].drive_flags & DRIVE_ATAPI) {
4491 			if (((chp->ch_drive[0].drive_flags & DRIVE_UDMA) &&
4492 			    !(chp->ch_drive[1].drive_flags & DRIVE_UDMA) &&
4493 			    (chp->ch_drive[1].drive_flags & DRIVE_DMA)) ||
4494 			    ((chp->ch_drive[1].drive_flags & DRIVE_UDMA) &&
4495 			    !(chp->ch_drive[0].drive_flags & DRIVE_UDMA) &&
4496 			    (chp->ch_drive[0].drive_flags & DRIVE_DMA)))
4497 				atapi = 0;
4498 			else
4499 				atapi = PDC262_ATAPI_UDMA;
4500 			bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh,
4501 			    PDC262_ATAPI(channel), atapi);
4502 		}
4503 	}
4504 	for (drive = 0; drive < 2; drive++) {
4505 		drvp = &chp->ch_drive[drive];
4506 		/* If no drive, skip */
4507 		if ((drvp->drive_flags & DRIVE) == 0)
4508 			continue;
4509 		mode = 0;
4510 		if (drvp->drive_flags & DRIVE_UDMA) {
4511 			/* use Ultra/DMA */
4512 			drvp->drive_flags &= ~DRIVE_DMA;
4513 			mode = PDC2xx_TIM_SET_MB(mode,
4514 			    pdc2xx_udma_mb[drvp->UDMA_mode]);
4515 			mode = PDC2xx_TIM_SET_MC(mode,
4516 			    pdc2xx_udma_mc[drvp->UDMA_mode]);
4517 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
4518 		} else if (drvp->drive_flags & DRIVE_DMA) {
4519 			mode = PDC2xx_TIM_SET_MB(mode,
4520 			    pdc2xx_dma_mb[drvp->DMA_mode]);
4521 			mode = PDC2xx_TIM_SET_MC(mode,
4522 			    pdc2xx_dma_mc[drvp->DMA_mode]);
4523 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
4524 		} else {
4525 			mode = PDC2xx_TIM_SET_MB(mode,
4526 			    pdc2xx_dma_mb[0]);
4527 			mode = PDC2xx_TIM_SET_MC(mode,
4528 			    pdc2xx_dma_mc[0]);
4529 		}
4530 		mode = PDC2xx_TIM_SET_PA(mode, pdc2xx_pa[drvp->PIO_mode]);
4531 		mode = PDC2xx_TIM_SET_PB(mode, pdc2xx_pb[drvp->PIO_mode]);
4532 		if (drvp->drive_flags & DRIVE_ATA)
4533 			mode |= PDC2xx_TIM_PRE;
4534 		mode |= PDC2xx_TIM_SYNC | PDC2xx_TIM_ERRDY;
4535 		if (drvp->PIO_mode >= 3) {
4536 			mode |= PDC2xx_TIM_IORDY;
4537 			if (drive == 0)
4538 				mode |= PDC2xx_TIM_IORDYp;
4539 		}
4540 		WDCDEBUG_PRINT(("pdc202xx_setup_channel: %s:%d:%d "
4541 		    "timings 0x%x\n",
4542 		    sc->sc_wdcdev.sc_dev.dv_xname,
4543 		    chp->channel, drive, mode), DEBUG_PROBE);
4544 		pci_conf_write(sc->sc_pc, sc->sc_tag,
4545 		    PDC2xx_TIM(chp->channel, drive), mode);
4546 	}
4547 	if (idedma_ctl != 0) {
4548 		/* Add software bits in status register */
4549 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
4550 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
4551 		    idedma_ctl);
4552 	}
4553 	pciide_print_modes(cp);
4554 }
4555 
4556 void
4557 pdc20268_setup_channel(chp)
4558 	struct channel_softc *chp;
4559 {
4560 	struct ata_drive_datas *drvp;
4561 	int drive;
4562 	u_int32_t idedma_ctl;
4563 	struct pciide_channel *cp = (struct pciide_channel*)chp;
4564 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
4565 	int u100;
4566 
4567 	/* setup DMA if needed */
4568 	pciide_channel_dma_setup(cp);
4569 
4570 	idedma_ctl = 0;
4571 
4572 	/* I don't know what this is for, FreeBSD does it ... */
4573 	bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
4574 	    IDEDMA_CMD + 0x1, 0x0b);
4575 
4576 	/*
4577 	 * I don't know what this is for; FreeBSD checks this ... this is not
4578 	 * cable type detect.
4579 	 */
4580 	u100 = (bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
4581 	    IDEDMA_CMD + 0x3) & 0x04) ? 0 : 1;
4582 
4583 	for (drive = 0; drive < 2; drive++) {
4584 		drvp = &chp->ch_drive[drive];
4585 		/* If no drive, skip */
4586 		if ((drvp->drive_flags & DRIVE) == 0)
4587 			continue;
4588 		if (drvp->drive_flags & DRIVE_UDMA) {
4589 			/* use Ultra/DMA */
4590 			drvp->drive_flags &= ~DRIVE_DMA;
4591 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
4592 			if (drvp->UDMA_mode > 2 && u100 == 0)
4593 				drvp->UDMA_mode = 2;
4594 		} else if (drvp->drive_flags & DRIVE_DMA) {
4595 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
4596 		}
4597 	}
4598 	/* nothing to do to setup modes, the controller snoop SET_FEATURE cmd */
4599 	if (idedma_ctl != 0) {
4600 		/* Add software bits in status register */
4601 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
4602 		    IDEDMA_CTL + (IDEDMA_SCH_OFFSET * chp->channel),
4603 		    idedma_ctl);
4604 	}
4605 	pciide_print_modes(cp);
4606 }
4607 
4608 int
4609 pdc202xx_pci_intr(arg)
4610 	void *arg;
4611 {
4612 	struct pciide_softc *sc = arg;
4613 	struct pciide_channel *cp;
4614 	struct channel_softc *wdc_cp;
4615 	int i, rv, crv;
4616 	u_int32_t scr;
4617 
4618 	rv = 0;
4619 	scr = bus_space_read_4(sc->sc_dma_iot, sc->sc_dma_ioh, PDC2xx_SCR);
4620 	for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
4621 		cp = &sc->pciide_channels[i];
4622 		wdc_cp = &cp->wdc_channel;
4623 		/* If a compat channel skip. */
4624 		if (cp->compat)
4625 			continue;
4626 		if (scr & PDC2xx_SCR_INT(i)) {
4627 			crv = wdcintr(wdc_cp);
4628 			if (crv == 0)
4629 				printf("%s:%d: bogus intr (reg 0x%x)\n",
4630 				    sc->sc_wdcdev.sc_dev.dv_xname, i, scr);
4631 			else
4632 				rv = 1;
4633 		}
4634 	}
4635 	return rv;
4636 }
4637 
4638 int
4639 pdc20265_pci_intr(arg)
4640 	void *arg;
4641 {
4642 	struct pciide_softc *sc = arg;
4643 	struct pciide_channel *cp;
4644 	struct channel_softc *wdc_cp;
4645 	int i, rv, crv;
4646 	u_int32_t dmastat;
4647 
4648 	rv = 0;
4649 	for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
4650 		cp = &sc->pciide_channels[i];
4651 		wdc_cp = &cp->wdc_channel;
4652 		/* If a compat channel skip. */
4653 		if (cp->compat)
4654 			continue;
4655 		/*
4656 		 * The Ultra/100 seems to assert PDC2xx_SCR_INT * spuriously,
4657 		 * however it asserts INT in IDEDMA_CTL even for non-DMA ops.
4658 		 * So use it instead (requires 2 reg reads instead of 1,
4659 		 * but we can't do it another way).
4660 		 */
4661 		dmastat = bus_space_read_1(sc->sc_dma_iot,
4662 		    sc->sc_dma_ioh, IDEDMA_CTL + IDEDMA_SCH_OFFSET * i);
4663 		if((dmastat & IDEDMA_CTL_INTR) == 0)
4664 			continue;
4665 		crv = wdcintr(wdc_cp);
4666 		if (crv == 0)
4667 			printf("%s:%d: bogus intr\n",
4668 			    sc->sc_wdcdev.sc_dev.dv_xname, i);
4669 		else
4670 			rv = 1;
4671 	}
4672 	return rv;
4673 }
4674 
4675 static void
4676 pdc20262_dma_start(v, channel, drive)
4677 	void *v;
4678 	int channel, drive;
4679 {
4680 	struct pciide_softc *sc = v;
4681 	struct pciide_dma_maps *dma_maps =
4682 	    &sc->pciide_channels[channel].dma_maps[drive];
4683 	int atapi;
4684 
4685 	if (dma_maps->dma_flags & WDC_DMA_LBA48) {
4686 		atapi = (dma_maps->dma_flags & WDC_DMA_READ) ?
4687 		    PDC262_ATAPI_LBA48_READ : PDC262_ATAPI_LBA48_WRITE;
4688 		atapi |= dma_maps->dmamap_xfer->dm_mapsize >> 1;
4689 		bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh,
4690 		    PDC262_ATAPI(channel), atapi);
4691 	}
4692 
4693 	pciide_dma_start(v, channel, drive);
4694 }
4695 
4696 int
4697 pdc20262_dma_finish(v, channel, drive, force)
4698 	void *v;
4699 	int channel, drive;
4700 	int force;
4701 {
4702 	struct pciide_softc *sc = v;
4703 	struct pciide_dma_maps *dma_maps =
4704 	    &sc->pciide_channels[channel].dma_maps[drive];
4705 	struct channel_softc *chp;
4706 	int atapi, error;
4707 
4708 	error = pciide_dma_finish(v, channel, drive, force);
4709 
4710 	if (dma_maps->dma_flags & WDC_DMA_LBA48) {
4711 		chp = sc->wdc_chanarray[channel];
4712 		atapi = 0;
4713 		if (chp->ch_drive[0].drive_flags & DRIVE_ATAPI ||
4714 		    chp->ch_drive[1].drive_flags & DRIVE_ATAPI) {
4715 			if ((!(chp->ch_drive[0].drive_flags & DRIVE_UDMA) ||
4716 			    (chp->ch_drive[1].drive_flags & DRIVE_UDMA) ||
4717 			    !(chp->ch_drive[1].drive_flags & DRIVE_DMA)) &&
4718 			    (!(chp->ch_drive[1].drive_flags & DRIVE_UDMA) ||
4719 			    (chp->ch_drive[0].drive_flags & DRIVE_UDMA) ||
4720 			    !(chp->ch_drive[0].drive_flags & DRIVE_DMA)))
4721 				atapi = PDC262_ATAPI_UDMA;
4722 		}
4723 		bus_space_write_4(sc->sc_dma_iot, sc->sc_dma_ioh,
4724 		    PDC262_ATAPI(channel), atapi);
4725 	}
4726 
4727 	return error;
4728 }
4729 
4730 void
4731 opti_chip_map(sc, pa)
4732 	struct pciide_softc *sc;
4733 	struct pci_attach_args *pa;
4734 {
4735 	struct pciide_channel *cp;
4736 	bus_size_t cmdsize, ctlsize;
4737 	pcireg_t interface;
4738 	u_int8_t init_ctrl;
4739 	int channel;
4740 
4741 	if (pciide_chipen(sc, pa) == 0)
4742 		return;
4743 	printf("%s: bus-master DMA support present",
4744 	    sc->sc_wdcdev.sc_dev.dv_xname);
4745 
4746 	/*
4747 	 * XXXSCW:
4748 	 * There seem to be a couple of buggy revisions/implementations
4749 	 * of the OPTi pciide chipset. This kludge seems to fix one of
4750 	 * the reported problems (PR/11644) but still fails for the
4751 	 * other (PR/13151), although the latter may be due to other
4752 	 * issues too...
4753 	 */
4754 	if (PCI_REVISION(pa->pa_class) <= 0x12) {
4755 		printf(" but disabled due to chip rev. <= 0x12");
4756 		sc->sc_dma_ok = 0;
4757 	} else
4758 		pciide_mapreg_dma(sc, pa);
4759 
4760 	printf("\n");
4761 
4762 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA32 | WDC_CAPABILITY_DATA16 |
4763 		WDC_CAPABILITY_MODE;
4764 	sc->sc_wdcdev.PIO_cap = 4;
4765 	if (sc->sc_dma_ok) {
4766 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
4767 		sc->sc_wdcdev.irqack = pciide_irqack;
4768 		sc->sc_wdcdev.DMA_cap = 2;
4769 	}
4770 	sc->sc_wdcdev.set_modes = opti_setup_channel;
4771 
4772 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
4773 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
4774 
4775 	init_ctrl = pciide_pci_read(sc->sc_pc, sc->sc_tag,
4776 	    OPTI_REG_INIT_CONTROL);
4777 
4778 	interface = PCI_INTERFACE(pa->pa_class);
4779 
4780 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
4781 		cp = &sc->pciide_channels[channel];
4782 		if (pciide_chansetup(sc, channel, interface) == 0)
4783 			continue;
4784 		if (channel == 1 &&
4785 		    (init_ctrl & OPTI_INIT_CONTROL_CH2_DISABLE) != 0) {
4786 			printf("%s: %s channel ignored (disabled)\n",
4787 			    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
4788 			continue;
4789 		}
4790 		pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
4791 		    pciide_pci_intr);
4792 		if (cp->hw_ok == 0)
4793 			continue;
4794 		pciide_map_compat_intr(pa, cp, channel, interface);
4795 		if (cp->hw_ok == 0)
4796 			continue;
4797 		opti_setup_channel(&cp->wdc_channel);
4798 	}
4799 }
4800 
4801 void
4802 opti_setup_channel(chp)
4803 	struct channel_softc *chp;
4804 {
4805 	struct ata_drive_datas *drvp;
4806 	struct pciide_channel *cp = (struct pciide_channel*)chp;
4807 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
4808 	int drive, spd;
4809 	int mode[2];
4810 	u_int8_t rv, mr;
4811 
4812 	/*
4813 	 * The `Delay' and `Address Setup Time' fields of the
4814 	 * Miscellaneous Register are always zero initially.
4815 	 */
4816 	mr = opti_read_config(chp, OPTI_REG_MISC) & ~OPTI_MISC_INDEX_MASK;
4817 	mr &= ~(OPTI_MISC_DELAY_MASK |
4818 		OPTI_MISC_ADDR_SETUP_MASK |
4819 		OPTI_MISC_INDEX_MASK);
4820 
4821 	/* Prime the control register before setting timing values */
4822 	opti_write_config(chp, OPTI_REG_CONTROL, OPTI_CONTROL_DISABLE);
4823 
4824 	/* Determine the clockrate of the PCIbus the chip is attached to */
4825 	spd = (int) opti_read_config(chp, OPTI_REG_STRAP);
4826 	spd &= OPTI_STRAP_PCI_SPEED_MASK;
4827 
4828 	/* setup DMA if needed */
4829 	pciide_channel_dma_setup(cp);
4830 
4831 	for (drive = 0; drive < 2; drive++) {
4832 		drvp = &chp->ch_drive[drive];
4833 		/* If no drive, skip */
4834 		if ((drvp->drive_flags & DRIVE) == 0) {
4835 			mode[drive] = -1;
4836 			continue;
4837 		}
4838 
4839 		if ((drvp->drive_flags & DRIVE_DMA)) {
4840 			/*
4841 			 * Timings will be used for both PIO and DMA,
4842 			 * so adjust DMA mode if needed
4843 			 */
4844 			if (drvp->PIO_mode > (drvp->DMA_mode + 2))
4845 				drvp->PIO_mode = drvp->DMA_mode + 2;
4846 			if (drvp->DMA_mode + 2 > (drvp->PIO_mode))
4847 				drvp->DMA_mode = (drvp->PIO_mode > 2) ?
4848 				    drvp->PIO_mode - 2 : 0;
4849 			if (drvp->DMA_mode == 0)
4850 				drvp->PIO_mode = 0;
4851 
4852 			mode[drive] = drvp->DMA_mode + 5;
4853 		} else
4854 			mode[drive] = drvp->PIO_mode;
4855 
4856 		if (drive && mode[0] >= 0 &&
4857 		    (opti_tim_as[spd][mode[0]] != opti_tim_as[spd][mode[1]])) {
4858 			/*
4859 			 * Can't have two drives using different values
4860 			 * for `Address Setup Time'.
4861 			 * Slow down the faster drive to compensate.
4862 			 */
4863 			int d = (opti_tim_as[spd][mode[0]] >
4864 				 opti_tim_as[spd][mode[1]]) ?  0 : 1;
4865 
4866 			mode[d] = mode[1-d];
4867 			chp->ch_drive[d].PIO_mode = chp->ch_drive[1-d].PIO_mode;
4868 			chp->ch_drive[d].DMA_mode = 0;
4869 			chp->ch_drive[d].drive_flags &= ~DRIVE_DMA;
4870 		}
4871 	}
4872 
4873 	for (drive = 0; drive < 2; drive++) {
4874 		int m;
4875 		if ((m = mode[drive]) < 0)
4876 			continue;
4877 
4878 		/* Set the Address Setup Time and select appropriate index */
4879 		rv = opti_tim_as[spd][m] << OPTI_MISC_ADDR_SETUP_SHIFT;
4880 		rv |= OPTI_MISC_INDEX(drive);
4881 		opti_write_config(chp, OPTI_REG_MISC, mr | rv);
4882 
4883 		/* Set the pulse width and recovery timing parameters */
4884 		rv  = opti_tim_cp[spd][m] << OPTI_PULSE_WIDTH_SHIFT;
4885 		rv |= opti_tim_rt[spd][m] << OPTI_RECOVERY_TIME_SHIFT;
4886 		opti_write_config(chp, OPTI_REG_READ_CYCLE_TIMING, rv);
4887 		opti_write_config(chp, OPTI_REG_WRITE_CYCLE_TIMING, rv);
4888 
4889 		/* Set the Enhanced Mode register appropriately */
4890 	    	rv = pciide_pci_read(sc->sc_pc, sc->sc_tag, OPTI_REG_ENH_MODE);
4891 		rv &= ~OPTI_ENH_MODE_MASK(chp->channel, drive);
4892 		rv |= OPTI_ENH_MODE(chp->channel, drive, opti_tim_em[m]);
4893 		pciide_pci_write(sc->sc_pc, sc->sc_tag, OPTI_REG_ENH_MODE, rv);
4894 	}
4895 
4896 	/* Finally, enable the timings */
4897 	opti_write_config(chp, OPTI_REG_CONTROL, OPTI_CONTROL_ENABLE);
4898 
4899 	pciide_print_modes(cp);
4900 }
4901 
4902 #define	ACARD_IS_850(sc)						\
4903 	((sc)->sc_pp->ide_product == PCI_PRODUCT_ACARD_ATP850U)
4904 
4905 void
4906 acard_chip_map(sc, pa)
4907 	struct pciide_softc *sc;
4908 	struct pci_attach_args *pa;
4909 {
4910 	struct pciide_channel *cp;
4911 	int i;
4912 	pcireg_t interface;
4913 	bus_size_t cmdsize, ctlsize;
4914 
4915 	if (pciide_chipen(sc, pa) == 0)
4916 		return;
4917 
4918 	/*
4919 	 * when the chip is in native mode it identifies itself as a
4920 	 * 'misc mass storage'. Fake interface in this case.
4921 	 */
4922 	if (PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_IDE) {
4923 		interface = PCI_INTERFACE(pa->pa_class);
4924 	} else {
4925 		interface = PCIIDE_INTERFACE_BUS_MASTER_DMA |
4926 		    PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1);
4927 	}
4928 
4929 	printf("%s: bus-master DMA support present",
4930 	    sc->sc_wdcdev.sc_dev.dv_xname);
4931 	pciide_mapreg_dma(sc, pa);
4932 	printf("\n");
4933 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
4934 	    WDC_CAPABILITY_MODE;
4935 
4936 	if (sc->sc_dma_ok) {
4937 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
4938 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
4939 		sc->sc_wdcdev.irqack = pciide_irqack;
4940 	}
4941 	sc->sc_wdcdev.PIO_cap = 4;
4942 	sc->sc_wdcdev.DMA_cap = 2;
4943 	sc->sc_wdcdev.UDMA_cap = ACARD_IS_850(sc) ? 2 : 4;
4944 
4945 	sc->sc_wdcdev.set_modes = acard_setup_channel;
4946 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
4947 	sc->sc_wdcdev.nchannels = 2;
4948 
4949 	for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
4950 		cp = &sc->pciide_channels[i];
4951 		if (pciide_chansetup(sc, i, interface) == 0)
4952 			continue;
4953 		if (interface & PCIIDE_INTERFACE_PCI(i)) {
4954 			cp->hw_ok = pciide_mapregs_native(pa, cp, &cmdsize,
4955 			    &ctlsize, pciide_pci_intr);
4956 		} else {
4957 			cp->hw_ok = pciide_mapregs_compat(pa, cp, i,
4958 			    &cmdsize, &ctlsize);
4959 		}
4960 		if (cp->hw_ok == 0)
4961 			return;
4962 		cp->wdc_channel.data32iot = cp->wdc_channel.cmd_iot;
4963 		cp->wdc_channel.data32ioh = cp->wdc_channel.cmd_ioh;
4964 		wdcattach(&cp->wdc_channel);
4965 		acard_setup_channel(&cp->wdc_channel);
4966 	}
4967 	if (!ACARD_IS_850(sc)) {
4968 		u_int32_t reg;
4969 		reg = pci_conf_read(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL);
4970 		reg &= ~ATP860_CTRL_INT;
4971 		pci_conf_write(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL, reg);
4972 	}
4973 }
4974 
4975 void
4976 acard_setup_channel(chp)
4977 	struct channel_softc *chp;
4978 {
4979 	struct ata_drive_datas *drvp;
4980 	struct pciide_channel *cp = (struct pciide_channel*)chp;
4981 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
4982 	int channel = chp->channel;
4983 	int drive;
4984 	u_int32_t idetime, udma_mode;
4985 	u_int32_t idedma_ctl;
4986 
4987 	/* setup DMA if needed */
4988 	pciide_channel_dma_setup(cp);
4989 
4990 	if (ACARD_IS_850(sc)) {
4991 		idetime = 0;
4992 		udma_mode = pci_conf_read(sc->sc_pc, sc->sc_tag, ATP850_UDMA);
4993 		udma_mode &= ~ATP850_UDMA_MASK(channel);
4994 	} else {
4995 		idetime = pci_conf_read(sc->sc_pc, sc->sc_tag, ATP860_IDETIME);
4996 		idetime &= ~ATP860_SETTIME_MASK(channel);
4997 		udma_mode = pci_conf_read(sc->sc_pc, sc->sc_tag, ATP860_UDMA);
4998 		udma_mode &= ~ATP860_UDMA_MASK(channel);
4999 
5000 		/* check 80 pins cable */
5001 		if ((chp->ch_drive[0].drive_flags & DRIVE_UDMA) ||
5002 		    (chp->ch_drive[1].drive_flags & DRIVE_UDMA)) {
5003 			if (pci_conf_read(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL)
5004 			    & ATP860_CTRL_80P(chp->channel)) {
5005 				if (chp->ch_drive[0].UDMA_mode > 2)
5006 					chp->ch_drive[0].UDMA_mode = 2;
5007 				if (chp->ch_drive[1].UDMA_mode > 2)
5008 					chp->ch_drive[1].UDMA_mode = 2;
5009 			}
5010 		}
5011 	}
5012 
5013 	idedma_ctl = 0;
5014 
5015 	/* Per drive settings */
5016 	for (drive = 0; drive < 2; drive++) {
5017 		drvp = &chp->ch_drive[drive];
5018 		/* If no drive, skip */
5019 		if ((drvp->drive_flags & DRIVE) == 0)
5020 			continue;
5021 		/* add timing values, setup DMA if needed */
5022 		if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) &&
5023 		    (drvp->drive_flags & DRIVE_UDMA)) {
5024 			/* use Ultra/DMA */
5025 			if (ACARD_IS_850(sc)) {
5026 				idetime |= ATP850_SETTIME(drive,
5027 				    acard_act_udma[drvp->UDMA_mode],
5028 				    acard_rec_udma[drvp->UDMA_mode]);
5029 				udma_mode |= ATP850_UDMA_MODE(channel, drive,
5030 				    acard_udma_conf[drvp->UDMA_mode]);
5031 			} else {
5032 				idetime |= ATP860_SETTIME(channel, drive,
5033 				    acard_act_udma[drvp->UDMA_mode],
5034 				    acard_rec_udma[drvp->UDMA_mode]);
5035 				udma_mode |= ATP860_UDMA_MODE(channel, drive,
5036 				    acard_udma_conf[drvp->UDMA_mode]);
5037 			}
5038 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
5039 		} else if ((chp->wdc->cap & WDC_CAPABILITY_DMA) &&
5040 		    (drvp->drive_flags & DRIVE_DMA)) {
5041 			/* use Multiword DMA */
5042 			drvp->drive_flags &= ~DRIVE_UDMA;
5043 			if (ACARD_IS_850(sc)) {
5044 				idetime |= ATP850_SETTIME(drive,
5045 				    acard_act_dma[drvp->DMA_mode],
5046 				    acard_rec_dma[drvp->DMA_mode]);
5047 			} else {
5048 				idetime |= ATP860_SETTIME(channel, drive,
5049 				    acard_act_dma[drvp->DMA_mode],
5050 				    acard_rec_dma[drvp->DMA_mode]);
5051 			}
5052 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
5053 		} else {
5054 			/* PIO only */
5055 			drvp->drive_flags &= ~(DRIVE_UDMA | DRIVE_DMA);
5056 			if (ACARD_IS_850(sc)) {
5057 				idetime |= ATP850_SETTIME(drive,
5058 				    acard_act_pio[drvp->PIO_mode],
5059 				    acard_rec_pio[drvp->PIO_mode]);
5060 			} else {
5061 				idetime |= ATP860_SETTIME(channel, drive,
5062 				    acard_act_pio[drvp->PIO_mode],
5063 				    acard_rec_pio[drvp->PIO_mode]);
5064 			}
5065 		pci_conf_write(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL,
5066 		    pci_conf_read(sc->sc_pc, sc->sc_tag, ATP8x0_CTRL)
5067 		    | ATP8x0_CTRL_EN(channel));
5068 		}
5069 	}
5070 
5071 	if (idedma_ctl != 0) {
5072 		/* Add software bits in status register */
5073 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5074 		    IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel, idedma_ctl);
5075 	}
5076 	pciide_print_modes(cp);
5077 
5078 	if (ACARD_IS_850(sc)) {
5079 		pci_conf_write(sc->sc_pc, sc->sc_tag,
5080 		    ATP850_IDETIME(channel), idetime);
5081 		pci_conf_write(sc->sc_pc, sc->sc_tag, ATP850_UDMA, udma_mode);
5082 	} else {
5083 		pci_conf_write(sc->sc_pc, sc->sc_tag, ATP860_IDETIME, idetime);
5084 		pci_conf_write(sc->sc_pc, sc->sc_tag, ATP860_UDMA, udma_mode);
5085 	}
5086 }
5087 
5088 int
5089 acard_pci_intr(arg)
5090 	void *arg;
5091 {
5092 	struct pciide_softc *sc = arg;
5093 	struct pciide_channel *cp;
5094 	struct channel_softc *wdc_cp;
5095 	int rv = 0;
5096 	int dmastat, i, crv;
5097 
5098 	for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
5099 		dmastat = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5100 		    IDEDMA_CTL + IDEDMA_SCH_OFFSET * i);
5101 		if ((dmastat & IDEDMA_CTL_INTR) == 0)
5102 			continue;
5103 		cp = &sc->pciide_channels[i];
5104 		wdc_cp = &cp->wdc_channel;
5105 		if ((wdc_cp->ch_flags & WDCF_IRQ_WAIT) == 0) {
5106 			(void)wdcintr(wdc_cp);
5107 			bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5108 			    IDEDMA_CTL + IDEDMA_SCH_OFFSET * i, dmastat);
5109 			continue;
5110 		}
5111 		crv = wdcintr(wdc_cp);
5112 		if (crv == 0)
5113 			printf("%s:%d: bogus intr\n",
5114 			    sc->sc_wdcdev.sc_dev.dv_xname, i);
5115 		else if (crv == 1)
5116 			rv = 1;
5117 		else if (rv == 0)
5118 			rv = crv;
5119 	}
5120 	return rv;
5121 }
5122 
5123 static int
5124 sl82c105_bugchk(struct pci_attach_args *pa)
5125 {
5126 
5127 	if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_WINBOND ||
5128 	    PCI_PRODUCT(pa->pa_id) != PCI_PRODUCT_WINBOND_W83C553F_0)
5129 		return (0);
5130 
5131 	if (PCI_REVISION(pa->pa_class) <= 0x05)
5132 		return (1);
5133 
5134 	return (0);
5135 }
5136 
5137 void
5138 sl82c105_chip_map(sc, pa)
5139 	struct pciide_softc *sc;
5140 	struct pci_attach_args *pa;
5141 {
5142 	struct pciide_channel *cp;
5143 	bus_size_t cmdsize, ctlsize;
5144 	pcireg_t interface, idecr;
5145 	int channel;
5146 
5147 	if (pciide_chipen(sc, pa) == 0)
5148 		return;
5149 
5150 	printf("%s: bus-master DMA support present",
5151 	    sc->sc_wdcdev.sc_dev.dv_xname);
5152 
5153 	/*
5154 	 * Check to see if we're part of the Winbond 83c553 Southbridge.
5155 	 * If so, we need to disable DMA on rev. <= 5 of that chip.
5156 	 */
5157 	if (pci_find_device(pa, sl82c105_bugchk)) {
5158 		printf(" but disabled due to 83c553 rev. <= 0x05");
5159 		sc->sc_dma_ok = 0;
5160 	} else
5161 		pciide_mapreg_dma(sc, pa);
5162 	printf("\n");
5163 
5164 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA32 | WDC_CAPABILITY_DATA16 |
5165 	    WDC_CAPABILITY_MODE;
5166 	sc->sc_wdcdev.PIO_cap = 4;
5167 	if (sc->sc_dma_ok) {
5168 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_IRQACK;
5169 		sc->sc_wdcdev.irqack = pciide_irqack;
5170 		sc->sc_wdcdev.DMA_cap = 2;
5171 	}
5172 	sc->sc_wdcdev.set_modes = sl82c105_setup_channel;
5173 
5174 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
5175 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
5176 
5177 	idecr = pci_conf_read(sc->sc_pc, sc->sc_tag, SYMPH_IDECSR);
5178 
5179 	interface = PCI_INTERFACE(pa->pa_class);
5180 
5181 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
5182 		cp = &sc->pciide_channels[channel];
5183 		if (pciide_chansetup(sc, channel, interface) == 0)
5184 			continue;
5185 		if ((channel == 0 && (idecr & IDECR_P0EN) == 0) ||
5186 		    (channel == 1 && (idecr & IDECR_P1EN) == 0)) {
5187 			printf("%s: %s channel ignored (disabled)\n",
5188 			    sc->sc_wdcdev.sc_dev.dv_xname, cp->name);
5189 			continue;
5190 		}
5191 		pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
5192 		    pciide_pci_intr);
5193 		if (cp->hw_ok == 0)
5194 			continue;
5195 		pciide_map_compat_intr(pa, cp, channel, interface);
5196 		if (cp->hw_ok == 0)
5197 			continue;
5198 		sl82c105_setup_channel(&cp->wdc_channel);
5199 	}
5200 }
5201 
5202 void
5203 sl82c105_setup_channel(chp)
5204 	struct channel_softc *chp;
5205 {
5206 	struct ata_drive_datas *drvp;
5207 	struct pciide_channel *cp = (struct pciide_channel*)chp;
5208 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
5209 	int pxdx_reg, drive;
5210 	pcireg_t pxdx;
5211 
5212 	/* Set up DMA if needed. */
5213 	pciide_channel_dma_setup(cp);
5214 
5215 	for (drive = 0; drive < 2; drive++) {
5216 		pxdx_reg = ((chp->channel == 0) ? SYMPH_P0D0CR
5217 						: SYMPH_P1D0CR) + (drive * 4);
5218 
5219 		pxdx = pci_conf_read(sc->sc_pc, sc->sc_tag, pxdx_reg);
5220 
5221 		pxdx &= ~(PxDx_CMD_ON_MASK|PxDx_CMD_OFF_MASK);
5222 		pxdx &= ~(PxDx_PWEN|PxDx_RDYEN|PxDx_RAEN);
5223 
5224 		drvp = &chp->ch_drive[drive];
5225 		/* If no drive, skip. */
5226 		if ((drvp->drive_flags & DRIVE) == 0) {
5227 			pci_conf_write(sc->sc_pc, sc->sc_tag, pxdx_reg, pxdx);
5228 			continue;
5229 		}
5230 
5231 		if (drvp->drive_flags & DRIVE_DMA) {
5232 			/*
5233 			 * Timings will be used for both PIO and DMA,
5234 			 * so adjust DMA mode if needed.
5235 			 */
5236 			if (drvp->PIO_mode >= 3) {
5237 				if ((drvp->DMA_mode + 2) > drvp->PIO_mode)
5238 					drvp->DMA_mode = drvp->PIO_mode - 2;
5239 				if (drvp->DMA_mode < 1) {
5240 					/*
5241 					 * Can't mix both PIO and DMA.
5242 					 * Disable DMA.
5243 					 */
5244 					drvp->drive_flags &= ~DRIVE_DMA;
5245 				}
5246 			} else {
5247 				/*
5248 				 * Can't mix both PIO and DMA.  Disable
5249 				 * DMA.
5250 				 */
5251 				drvp->drive_flags &= ~DRIVE_DMA;
5252 			}
5253 		}
5254 
5255 		if (drvp->drive_flags & DRIVE_DMA) {
5256 			/* Use multi-word DMA. */
5257 			pxdx |= symph_mw_dma_times[drvp->DMA_mode].cmd_on <<
5258 			    PxDx_CMD_ON_SHIFT;
5259 			pxdx |= symph_mw_dma_times[drvp->DMA_mode].cmd_off;
5260 		} else {
5261 			pxdx |= symph_pio_times[drvp->PIO_mode].cmd_on <<
5262 			    PxDx_CMD_ON_SHIFT;
5263 			pxdx |= symph_pio_times[drvp->PIO_mode].cmd_off;
5264 		}
5265 
5266 		/* XXX PxDx_PWEN? PxDx_RDYEN? PxDx_RAEN? */
5267 
5268 		/* ...and set the mode for this drive. */
5269 		pci_conf_write(sc->sc_pc, sc->sc_tag, pxdx_reg, pxdx);
5270 	}
5271 
5272 	pciide_print_modes(cp);
5273 }
5274 
5275 void
5276 serverworks_chip_map(sc, pa)
5277 	struct pciide_softc *sc;
5278 	struct pci_attach_args *pa;
5279 {
5280 	struct pciide_channel *cp;
5281 	pcireg_t interface = PCI_INTERFACE(pa->pa_class);
5282 	pcitag_t pcib_tag;
5283 	int channel;
5284 	bus_size_t cmdsize, ctlsize;
5285 
5286 	if (pciide_chipen(sc, pa) == 0)
5287 		return;
5288 
5289 	printf("%s: bus-master DMA support present",
5290 	    sc->sc_wdcdev.sc_dev.dv_xname);
5291 	pciide_mapreg_dma(sc, pa);
5292 	printf("\n");
5293 	sc->sc_wdcdev.cap = WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
5294 	    WDC_CAPABILITY_MODE;
5295 
5296 	if (sc->sc_dma_ok) {
5297 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
5298 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
5299 		sc->sc_wdcdev.irqack = pciide_irqack;
5300 	}
5301 	sc->sc_wdcdev.PIO_cap = 4;
5302 	sc->sc_wdcdev.DMA_cap = 2;
5303 	switch (sc->sc_pp->ide_product) {
5304 	case PCI_PRODUCT_SERVERWORKS_OSB4_IDE:
5305 		sc->sc_wdcdev.UDMA_cap = 2;
5306 		break;
5307 	case PCI_PRODUCT_SERVERWORKS_CSB5_IDE:
5308 		if (PCI_REVISION(pa->pa_class) < 0x92)
5309 			sc->sc_wdcdev.UDMA_cap = 4;
5310 		else
5311 			sc->sc_wdcdev.UDMA_cap = 5;
5312 		break;
5313 	case PCI_PRODUCT_SERVERWORKS_CSB6_IDE:
5314 		sc->sc_wdcdev.UDMA_cap = 5;
5315 		break;
5316 	}
5317 
5318 	sc->sc_wdcdev.set_modes = serverworks_setup_channel;
5319 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
5320 	sc->sc_wdcdev.nchannels = 2;
5321 
5322 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
5323 		cp = &sc->pciide_channels[channel];
5324 		if (pciide_chansetup(sc, channel, interface) == 0)
5325 			continue;
5326 		pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
5327 		    serverworks_pci_intr);
5328 		if (cp->hw_ok == 0)
5329 			return;
5330 		pciide_map_compat_intr(pa, cp, channel, interface);
5331 		if (cp->hw_ok == 0)
5332 			return;
5333 		serverworks_setup_channel(&cp->wdc_channel);
5334 	}
5335 
5336 	pcib_tag = pci_make_tag(pa->pa_pc, pa->pa_bus, pa->pa_device, 0);
5337 	pci_conf_write(pa->pa_pc, pcib_tag, 0x64,
5338 	    (pci_conf_read(pa->pa_pc, pcib_tag, 0x64) & ~0x2000) | 0x4000);
5339 }
5340 
5341 void
5342 serverworks_setup_channel(chp)
5343 	struct channel_softc *chp;
5344 {
5345 	struct ata_drive_datas *drvp;
5346 	struct pciide_channel *cp = (struct pciide_channel*)chp;
5347 	struct pciide_softc *sc = (struct pciide_softc *)cp->wdc_channel.wdc;
5348 	int channel = chp->channel;
5349 	int drive, unit;
5350 	u_int32_t pio_time, dma_time, pio_mode, udma_mode;
5351 	u_int32_t idedma_ctl;
5352 	static const u_int8_t pio_modes[5] = {0x5d, 0x47, 0x34, 0x22, 0x20};
5353 	static const u_int8_t dma_modes[3] = {0x77, 0x21, 0x20};
5354 
5355 	/* setup DMA if needed */
5356 	pciide_channel_dma_setup(cp);
5357 
5358 	pio_time = pci_conf_read(sc->sc_pc, sc->sc_tag, 0x40);
5359 	dma_time = pci_conf_read(sc->sc_pc, sc->sc_tag, 0x44);
5360 	pio_mode = pci_conf_read(sc->sc_pc, sc->sc_tag, 0x48);
5361 	udma_mode = pci_conf_read(sc->sc_pc, sc->sc_tag, 0x54);
5362 
5363 	pio_time &= ~(0xffff << (16 * channel));
5364 	dma_time &= ~(0xffff << (16 * channel));
5365 	pio_mode &= ~(0xff << (8 * channel + 16));
5366 	udma_mode &= ~(0xff << (8 * channel + 16));
5367 	udma_mode &= ~(3 << (2 * channel));
5368 
5369 	idedma_ctl = 0;
5370 
5371 	/* Per drive settings */
5372 	for (drive = 0; drive < 2; drive++) {
5373 		drvp = &chp->ch_drive[drive];
5374 		/* If no drive, skip */
5375 		if ((drvp->drive_flags & DRIVE) == 0)
5376 			continue;
5377 		unit = drive + 2 * channel;
5378 		/* add timing values, setup DMA if needed */
5379 		pio_time |= pio_modes[drvp->PIO_mode] << (8 * (unit^1));
5380 		pio_mode |= drvp->PIO_mode << (4 * unit + 16);
5381 		if ((chp->wdc->cap & WDC_CAPABILITY_UDMA) &&
5382 		    (drvp->drive_flags & DRIVE_UDMA)) {
5383 			/* use Ultra/DMA, check for 80-pin cable */
5384 			if (drvp->UDMA_mode > 2 &&
5385 			    (PCI_PRODUCT(pci_conf_read(sc->sc_pc, sc->sc_tag, PCI_SUBSYS_ID_REG)) & (1 << (14 + channel))) == 0)
5386 				drvp->UDMA_mode = 2;
5387 			dma_time |= dma_modes[drvp->DMA_mode] << (8 * (unit^1));
5388 			udma_mode |= drvp->UDMA_mode << (4 * unit + 16);
5389 			udma_mode |= 1 << unit;
5390 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
5391 		} else if ((chp->wdc->cap & WDC_CAPABILITY_DMA) &&
5392 		    (drvp->drive_flags & DRIVE_DMA)) {
5393 			/* use Multiword DMA */
5394 			drvp->drive_flags &= ~DRIVE_UDMA;
5395 			dma_time |= dma_modes[drvp->DMA_mode] << (8 * (unit^1));
5396 			idedma_ctl |= IDEDMA_CTL_DRV_DMA(drive);
5397 		} else {
5398 			/* PIO only */
5399 			drvp->drive_flags &= ~(DRIVE_UDMA | DRIVE_DMA);
5400 		}
5401 	}
5402 
5403 	pci_conf_write(sc->sc_pc, sc->sc_tag, 0x40, pio_time);
5404 	pci_conf_write(sc->sc_pc, sc->sc_tag, 0x44, dma_time);
5405 	if (sc->sc_pp->ide_product != PCI_PRODUCT_SERVERWORKS_OSB4_IDE)
5406 		pci_conf_write(sc->sc_pc, sc->sc_tag, 0x48, pio_mode);
5407 	pci_conf_write(sc->sc_pc, sc->sc_tag, 0x54, udma_mode);
5408 
5409 	if (idedma_ctl != 0) {
5410 		/* Add software bits in status register */
5411 		bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5412 		    IDEDMA_CTL + IDEDMA_SCH_OFFSET * channel, idedma_ctl);
5413 	}
5414 	pciide_print_modes(cp);
5415 }
5416 
5417 int
5418 serverworks_pci_intr(arg)
5419 	void *arg;
5420 {
5421 	struct pciide_softc *sc = arg;
5422 	struct pciide_channel *cp;
5423 	struct channel_softc *wdc_cp;
5424 	int rv = 0;
5425 	int dmastat, i, crv;
5426 
5427 	for (i = 0; i < sc->sc_wdcdev.nchannels; i++) {
5428 		dmastat = bus_space_read_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5429 		    IDEDMA_CTL + IDEDMA_SCH_OFFSET * i);
5430 		if ((dmastat & (IDEDMA_CTL_ACT | IDEDMA_CTL_INTR)) !=
5431 		    IDEDMA_CTL_INTR)
5432 			continue;
5433 		cp = &sc->pciide_channels[i];
5434 		wdc_cp = &cp->wdc_channel;
5435 		crv = wdcintr(wdc_cp);
5436 		if (crv == 0) {
5437 			printf("%s:%d: bogus intr\n",
5438 			    sc->sc_wdcdev.sc_dev.dv_xname, i);
5439 			bus_space_write_1(sc->sc_dma_iot, sc->sc_dma_ioh,
5440 			    IDEDMA_CTL + IDEDMA_SCH_OFFSET * i, dmastat);
5441 		} else
5442 			rv = 1;
5443 	}
5444 	return rv;
5445 }
5446 
5447 void
5448 artisea_chip_map(sc, pa)
5449 	struct pciide_softc *sc;
5450 	struct pci_attach_args *pa;
5451 {
5452 	struct pciide_channel *cp;
5453 	bus_size_t cmdsize, ctlsize;
5454 	pcireg_t interface;
5455 	int channel;
5456 
5457 	if (pciide_chipen(sc, pa) == 0)
5458 		return;
5459 
5460 	printf("%s: bus-master DMA support resent",
5461 	    sc->sc_wdcdev.sc_dev.dv_xname);
5462 #ifndef PCIIDE_I31244_ENABLEDMA
5463 	if (PCI_REVISION(pa->pa_class) == 0) {
5464 		printf(" but disabled due to rev. 0");
5465 		sc->sc_dma_ok = 0;
5466 	} else
5467 #endif
5468 		pciide_mapreg_dma(sc, pa);
5469 	printf("\n");
5470 
5471 	/*
5472 	 * XXX Configure LEDs to show activity.
5473 	 */
5474 
5475 	sc->sc_wdcdev.cap |= WDC_CAPABILITY_DATA16 | WDC_CAPABILITY_DATA32 |
5476 	    WDC_CAPABILITY_MODE;
5477 	sc->sc_wdcdev.PIO_cap = 4;
5478 	if (sc->sc_dma_ok) {
5479 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_DMA | WDC_CAPABILITY_UDMA;
5480 		sc->sc_wdcdev.cap |= WDC_CAPABILITY_IRQACK;
5481 		sc->sc_wdcdev.irqack = pciide_irqack;
5482 		sc->sc_wdcdev.DMA_cap = 2;
5483 		sc->sc_wdcdev.UDMA_cap = 6;
5484 	}
5485 	sc->sc_wdcdev.set_modes = sata_setup_channel;
5486 
5487 	sc->sc_wdcdev.channels = sc->wdc_chanarray;
5488 	sc->sc_wdcdev.nchannels = PCIIDE_NUM_CHANNELS;
5489 
5490 	interface = PCI_INTERFACE(pa->pa_class);
5491 
5492 	for (channel = 0; channel < sc->sc_wdcdev.nchannels; channel++) {
5493 		cp = &sc->pciide_channels[channel];
5494 		if (pciide_chansetup(sc, channel, interface) == 0)
5495 			continue;
5496 		pciide_mapchan(pa, cp, interface, &cmdsize, &ctlsize,
5497 		    pciide_pci_intr);
5498 		if (cp->hw_ok == 0)
5499 			continue;
5500 		pciide_map_compat_intr(pa, cp, channel, interface);
5501 		sata_setup_channel(&cp->wdc_channel);
5502 	}
5503 }
5504