2 * Copyright (c) 1998,1999,2000,2001,2002 Søren Schmidt <sos@FreeBSD.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer,
10 * without modification, immediately at the beginning of the file.
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * 3. The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 * $FreeBSD: src/sys/dev/ata/ata-pci.c,v 1.32.2.15 2003/06/06 13:27:05 fjoe Exp $
29 * $DragonFly: src/sys/dev/disk/ata/ata-pci.c,v 1.24 2006/10/12 04:02:37 y0netan1 Exp $
32 #include <sys/param.h>
33 #include <sys/systm.h>
34 #include <sys/kernel.h>
36 #include <sys/module.h>
39 #include <sys/malloc.h>
40 #include <sys/devicestat.h>
41 #include <sys/sysctl.h>
42 #include <machine/stdarg.h>
43 #include <machine/resource.h>
44 #include <machine/bus.h>
45 #include <machine/clock.h>
47 #include <bus/pci/pcivar.h>
48 #include <bus/pci/pcireg.h>
51 /* device structures */
52 struct ata_pci_controller
{
53 struct resource
*bmio
;
60 #define IOMASK 0xfffffffc
61 #define GRANDPARENT(dev) device_get_parent(device_get_parent(dev))
62 #define ATA_MASTERDEV(dev) ((pci_get_progif(dev) & 0x80) && \
63 (pci_get_progif(dev) & 0x05) != 0x05)
66 ata_find_dev(device_t dev
, u_int32_t devid
, u_int32_t revid
)
71 if (device_get_children(device_get_parent(dev
), &children
, &nchildren
))
74 for (i
= 0; i
< nchildren
; i
++) {
75 if (pci_get_devid(children
[i
]) == devid
&&
76 pci_get_revid(children
[i
]) >= revid
) {
77 kfree(children
, M_TEMP
);
81 kfree(children
, M_TEMP
);
86 ata_via_southbridge_fixup(device_t dev
)
91 if (device_get_children(device_get_parent(dev
), &children
, &nchildren
))
94 for (i
= 0; i
< nchildren
; i
++) {
95 if (pci_get_devid(children
[i
]) == 0x03051106 || /* VIA VT8363 */
96 pci_get_devid(children
[i
]) == 0x03911106 || /* VIA VT8371 */
97 pci_get_devid(children
[i
]) == 0x31021106 || /* VIA VT8662 */
98 pci_get_devid(children
[i
]) == 0x31121106) { /* VIA VT8361 */
99 u_int8_t reg76
= pci_read_config(children
[i
], 0x76, 1);
101 if ((reg76
& 0xf0) != 0xd0) {
103 "Correcting VIA config for southbridge data corruption bug\n");
104 pci_write_config(children
[i
], 0x75, 0x80, 1);
105 pci_write_config(children
[i
], 0x76, (reg76
& 0x0f) | 0xd0, 1);
110 kfree(children
, M_TEMP
);
114 ata_pci_match(device_t dev
)
116 if (pci_get_class(dev
) != PCIC_STORAGE
)
119 switch (pci_get_devid(dev
)) {
120 /* supported chipsets */
122 return "Intel PIIX ATA controller";
125 return "Intel PIIX3 ATA controller";
130 return "Intel PIIX4 ATA33 controller";
133 return "Intel ICH0 ATA33 controller";
137 return "Intel ICH ATA66 controller";
141 return "Intel ICH2 ATA100 controller";
145 return "Intel ICH3 ATA100 controller";
149 return "Intel ICH4 ATA100 controller";
152 return "Intel ICH5 SATA150 controller";
155 return "Intel ICH5 ATA100 controller";
158 return "Intel ICH6/W SATA150 controller";
161 return "Intel ICH6R/RW SATA150 controller";
164 return "Intel ICH6R/RW ATA100 controller";
167 return "Intel ICH7 ATA controller";
170 return "Intel ICH7M SATA controller";
173 if (pci_get_revid(dev
) >= 0xc4)
174 return "AcerLabs Aladdin ATA100 controller";
175 else if (pci_get_revid(dev
) >= 0xc2)
176 return "AcerLabs Aladdin ATA66 controller";
177 else if (pci_get_revid(dev
) >= 0x20)
178 return "AcerLabs Aladdin ATA33 controller";
180 return "AcerLabs Aladdin ATA controller";
183 if (ata_find_dev(dev
, 0x05861106, 0x02))
184 return "VIA 82C586 ATA33 controller";
185 if (ata_find_dev(dev
, 0x05861106, 0))
186 return "VIA 82C586 ATA controller";
187 if (ata_find_dev(dev
, 0x05961106, 0x12))
188 return "VIA 82C596 ATA66 controller";
189 if (ata_find_dev(dev
, 0x05961106, 0))
190 return "VIA 82C596 ATA33 controller";
191 if (ata_find_dev(dev
, 0x06861106, 0x40))
192 return "VIA 82C686 ATA100 controller";
193 if (ata_find_dev(dev
, 0x06861106, 0x10))
194 return "VIA 82C686 ATA66 controller";
195 if (ata_find_dev(dev
, 0x06861106, 0))
196 return "VIA 82C686 ATA33 controller";
197 if (ata_find_dev(dev
, 0x82311106, 0))
198 return "VIA 8231 ATA100 controller";
199 if (ata_find_dev(dev
, 0x30741106, 0) ||
200 ata_find_dev(dev
, 0x31091106, 0))
201 return "VIA 8233 ATA100 controller";
202 if (ata_find_dev(dev
, 0x31471106, 0))
203 return "VIA 8233 ATA133 controller";
204 if (ata_find_dev(dev
, 0x31771106, 0))
205 return "VIA 8235 ATA133 controller";
206 if (ata_find_dev(dev
, 0x31491106, 0))
207 return "VIA 8237 ATA133 controller";
208 return "VIA Apollo ATA controller";
211 return "VIA 8237 SATA 150 controller";
214 if (ata_find_dev(dev
, 0x07461039, 0))
215 return "SiS 5591 ATA133 controller";
216 if (ata_find_dev(dev
, 0x06301039, 0x30) ||
217 ata_find_dev(dev
, 0x06331039, 0) ||
218 ata_find_dev(dev
, 0x06351039, 0) ||
219 ata_find_dev(dev
, 0x06401039, 0) ||
220 ata_find_dev(dev
, 0x06451039, 0) ||
221 ata_find_dev(dev
, 0x06461039, 0) ||
222 ata_find_dev(dev
, 0x06481039, 0) ||
223 ata_find_dev(dev
, 0x06501039, 0) ||
224 ata_find_dev(dev
, 0x07301039, 0) ||
225 ata_find_dev(dev
, 0x07331039, 0) ||
226 ata_find_dev(dev
, 0x07351039, 0) ||
227 ata_find_dev(dev
, 0x07401039, 0) ||
228 ata_find_dev(dev
, 0x07451039, 0) ||
229 ata_find_dev(dev
, 0x07501039, 0))
230 return "SiS 5591 ATA100 controller";
231 else if (ata_find_dev(dev
, 0x05301039, 0) ||
232 ata_find_dev(dev
, 0x05401039, 0) ||
233 ata_find_dev(dev
, 0x06201039, 0) ||
234 ata_find_dev(dev
, 0x06301039, 0))
235 return "SiS 5591 ATA66 controller";
237 return "SiS 5591 ATA33 controller";
240 return "SiI 3512 SATA controller";
243 return "SiI 3112 SATA controller";
246 return "SiI 3114 SATA controller";
249 return "SiI 3124 SATA controller";
252 return "SiI 0680 ATA133 controller";
255 return "CMD 649 ATA100 controller";
258 return "CMD 648 ATA66 controller";
261 return "CMD 646 ATA controller";
264 if (pci_get_subclass(dev
) == PCIS_STORAGE_IDE
)
265 return "Cypress 82C693 ATA controller";
269 return "Cyrix 5530 ATA33 controller";
272 return "AMD 756 ATA66 controller";
275 return "AMD 766 ATA100 controller";
278 return "AMD 768 ATA100 controller";
281 return "AMD 8111 UltraATA/133 controller";
284 return "nVIDIA nForce1 ATA100 controller";
287 return "nVIDIA nForce2 ATA133 controller";
290 return "nVIDIA nForce3 ATA133 controller";
293 return "nVIDIA nForce3 PRO S1 controller";
296 return "nVIDIA nForce3 PRO controller";
299 return "ServerWorks ROSB4 ATA33 controller";
302 if (pci_get_revid(dev
) >= 0x92)
303 return "ServerWorks CSB5 ATA100 controller";
305 return "ServerWorks CSB5 ATA66 controller";
308 return "ServerWorks CSB6 ATA100 controller (channel 0+1)";
311 return "ServerWorks CSB6 ATA66 controller (channel 2)";
314 return "Promise ATA33 controller";
318 return "Promise ATA66 controller";
322 return "Promise ATA100 controller";
326 if (pci_get_devid(GRANDPARENT(dev
)) == 0x00221011 &&
327 pci_get_class(GRANDPARENT(dev
)) == PCIC_BRIDGE
) {
328 static long start
= 0, end
= 0;
330 /* we belive we are on a TX4, now do our (simple) magic */
331 if (pci_get_slot(dev
) == 1) {
332 bus_get_resource(dev
, SYS_RES_IRQ
, 0, &start
, &end
);
333 return "Promise TX4 ATA100 controller (channel 0+1)";
335 else if (pci_get_slot(dev
) == 2 && start
&& end
) {
336 bus_set_resource(dev
, SYS_RES_IRQ
, 0, start
, end
);
338 return "Promise TX4 ATA100 controller (channel 2+3)";
343 return "Promise TX2 ATA100 controller";
349 return "Promise TX2 ATA133 controller";
352 switch (pci_get_revid(dev
)) {
355 return "HighPoint HPT366 ATA66 controller";
357 return "HighPoint HPT368 ATA66 controller";
360 return "HighPoint HPT370 ATA100 controller";
362 return "HighPoint HPT372 ATA133 controller";
367 switch (pci_get_revid(dev
)) {
370 return "HighPoint HPT372 ATA133 controller";
375 switch (pci_get_revid(dev
)) {
377 return "HighPoint HPT374 ATA133 controller";
382 return "Cenatek Rocket Drive controller";
384 /* unsupported but known chipsets, generic DMA only */
387 return "RZ 100? ATA controller !WARNING! buggy chip data loss possible";
390 return "CMD 640 ATA controller !WARNING! buggy chip data loss possible";
392 /* unknown chipsets, try generic DMA if it seems possible */
394 if (pci_get_class(dev
) == PCIC_STORAGE
&&
395 (pci_get_subclass(dev
) == PCIS_STORAGE_IDE
))
396 return "Generic PCI ATA controller";
402 ata_pci_probe(device_t dev
)
404 const char *desc
= ata_pci_match(dev
);
407 device_set_desc(dev
, desc
);
415 ata_pci_add_child(device_t dev
, int unit
)
419 /* check if this is located at one of the std addresses */
420 if (ATA_MASTERDEV(dev
)) {
421 if (!(child
= device_add_child(dev
, "ata", unit
)))
425 if (!(child
= device_add_child(dev
, "ata", 2)))
432 ata_pci_attach(device_t dev
)
434 struct ata_pci_controller
*controller
= device_get_softc(dev
);
435 u_int8_t
class, subclass
;
440 /* set up vendor-specific stuff */
441 type
= pci_get_devid(dev
);
442 class = pci_get_class(dev
);
443 subclass
= pci_get_subclass(dev
);
444 cmd
= pci_read_config(dev
, PCIR_COMMAND
, 4);
446 if (!(cmd
& PCIM_CMD_PORTEN
)) {
447 device_printf(dev
, "ATA channel disabled by BIOS\n");
451 /* is busmastering supported ? */
452 if ((cmd
& (PCIM_CMD_PORTEN
| PCIM_CMD_BUSMASTEREN
)) ==
453 (PCIM_CMD_PORTEN
| PCIM_CMD_BUSMASTEREN
)) {
455 /* is there a valid port range to connect to ? */
457 controller
->bmio
= bus_alloc_resource(dev
, SYS_RES_IOPORT
, &rid
,
458 0, ~0, 1, RF_ACTIVE
);
459 if (!controller
->bmio
)
460 device_printf(dev
, "Busmastering DMA not configured\n");
463 device_printf(dev
, "Busmastering DMA not supported\n");
465 /* do extra chipset specific setups */
469 case 0x522910b9: /* Aladdin need to activate the ATAPI FIFO */
470 pci_write_config(dev
, 0x53,
471 (pci_read_config(dev
, 0x53, 1) & ~0x01) | 0x02, 1);
474 case 0x4d38105a: /* Promise 66 & 100 (before TX2) need the clock changed */
477 ATA_OUTB(controller
->bmio
, 0x11, ATA_INB(controller
->bmio
, 0x11)|0x0a);
480 case 0x4d33105a: /* Promise (before TX2) need burst mode turned on */
481 ATA_OUTB(controller
->bmio
, 0x1f, ATA_INB(controller
->bmio
, 0x1f)|0x01);
484 case 0x00041103: /* HighPoint HPT366/368/370/372 */
485 if (pci_get_revid(dev
) < 2) { /* HPT 366 */
486 /* turn off interrupt prediction */
487 pci_write_config(dev
, 0x51,
488 (pci_read_config(dev
, 0x51, 1) & ~0x80), 1);
491 if (pci_get_revid(dev
) < 5) { /* HPT368/370 */
492 /* turn off interrupt prediction */
493 pci_write_config(dev
, 0x51,
494 (pci_read_config(dev
, 0x51, 1) & ~0x03), 1);
495 pci_write_config(dev
, 0x55,
496 (pci_read_config(dev
, 0x55, 1) & ~0x03), 1);
498 /* turn on interrupts */
499 pci_write_config(dev
, 0x5a,
500 (pci_read_config(dev
, 0x5a, 1) & ~0x10), 1);
503 pci_write_config(dev
, 0x5b, 0x22, 1);
508 case 0x00051103: /* HighPoint HPT372 */
509 case 0x00081103: /* HighPoint HPT374 */
510 /* turn off interrupt prediction */
511 pci_write_config(dev
, 0x51, (pci_read_config(dev
, 0x51, 1) & ~0x03), 1);
512 pci_write_config(dev
, 0x55, (pci_read_config(dev
, 0x55, 1) & ~0x03), 1);
514 /* turn on interrupts */
515 pci_write_config(dev
, 0x5a, (pci_read_config(dev
, 0x5a, 1) & ~0x10), 1);
518 pci_write_config(dev
, 0x5b,
519 (pci_read_config(dev
, 0x5b, 1) & 0x01) | 0x20, 1);
522 case 0x05711106: /* VIA 82C586, '596, '686 default setup */
523 /* prepare for ATA-66 on the 82C686a and 82C596b */
524 if ((ata_find_dev(dev
, 0x06861106, 0x10) &&
525 !ata_find_dev(dev
, 0x06861106, 0x40)) ||
526 ata_find_dev(dev
, 0x05961106, 0x12))
527 pci_write_config(dev
, 0x50, 0x030b030b, 4);
529 /* the southbridge might need the data corruption fix */
530 if (ata_find_dev(dev
, 0x06861106, 0x40) ||
531 ata_find_dev(dev
, 0x82311106, 0x10))
532 ata_via_southbridge_fixup(dev
);
534 /* set fifo configuration half'n'half */
535 pci_write_config(dev
, 0x43,
536 (pci_read_config(dev
, 0x43, 1) & 0x90) | 0x2a, 1);
538 /* set status register read retry */
539 pci_write_config(dev
, 0x44, pci_read_config(dev
, 0x44, 1) | 0x08, 1);
541 /* set DMA read & end-of-sector fifo flush */
542 pci_write_config(dev
, 0x46,
543 (pci_read_config(dev
, 0x46, 1) & 0x0c) | 0xf0, 1);
545 /* set sector size */
546 pci_write_config(dev
, 0x60, DEV_BSIZE
, 2);
547 pci_write_config(dev
, 0x68, DEV_BSIZE
, 2);
549 case 0x74111022: /* AMD 766 default setup */
550 flags
= 1; /* bugged */
552 case 0x74091022: /* AMD 756 default setup */
553 case 0x74411022: /* AMD 768 default setup */
554 case 0x746d1022: /* AMD 8111 default setup */
556 pci_write_config(dev
, 0x41,
557 pci_read_config(dev
, 0x41, 1) & 0x0f, 1);
559 pci_write_config(dev
, 0x41,
560 pci_read_config(dev
, 0x41, 1) | 0xf0, 1);
563 case 0x01bc10de: /* NVIDIA nForce1 default setup */
564 case 0x006510de: /* NVIDIA nForce2 default setup */
567 case 0x00d510de: /* NVIDIA nForce3 default setup */
569 pci_write_config(dev
, 0x51,
570 pci_read_config(dev
, 0x51, 1) & 0x0f, 1);
572 pci_write_config(dev
, 0x51,
573 pci_read_config(dev
, 0x51, 1) | 0xf0, 1);
577 case 0x02111166: /* ServerWorks ROSB4 enable UDMA33 */
578 pci_write_config(dev
, 0x64,
579 (pci_read_config(dev
, 0x64, 4) & ~0x00002000) |
583 case 0x02121166: /* ServerWorks CSB5 enable UDMA66/100 depending on rev */
584 pci_write_config(dev
, 0x5a,
585 (pci_read_config(dev
, 0x5a, 1) & ~0x40) |
586 (pci_get_revid(dev
) >= 0x92) ? 0x03 : 0x02, 1);
589 case 0x06801095: /* SiI 0680 set ATA reference clock speed */
590 if ((pci_read_config(dev
, 0x8a, 1) & 0x30) != 0x10)
591 pci_write_config(dev
, 0x8a,
592 (pci_read_config(dev
, 0x8a, 1) & 0x0F) | 0x10, 1);
593 if ((pci_read_config(dev
, 0x8a, 1) & 0x30) != 0x10)
594 device_printf(dev
, "SiI 0680 could not set clock\n");
599 case 0x06461095: /* CMD 646 enable interrupts, set DMA read mode */
600 pci_write_config(dev
, 0x71, 0x01, 1);
603 case 0x10001042: /* RZ 100? known bad, no DMA */
605 case 0x06401095: /* CMD 640 known bad, no DMA */
606 controller
->bmio
= NULL
;
607 device_printf(dev
, "Busmastering DMA disabled\n");
610 if (controller
->bmio
) {
611 controller
->bmaddr
= rman_get_start(controller
->bmio
);
612 BUS_RELEASE_RESOURCE(device_get_parent(dev
), dev
,
613 SYS_RES_IOPORT
, rid
, controller
->bmio
);
614 controller
->bmio
= NULL
;
618 * the Cypress chip is a mess, it contains two ATA functions, but
619 * both channels are visible on the first one.
620 * simply ignore the second function for now, as the right
621 * solution (ignoring the second channel on the first function)
622 * doesn't work with the crappy ATA interrupt setup on the alpha.
624 if (pci_get_devid(dev
) == 0xc6931080 && pci_get_function(dev
) > 1)
627 ata_pci_add_child(dev
, 0);
629 if (ATA_MASTERDEV(dev
) || pci_read_config(dev
, 0x18, 4) & IOMASK
)
630 ata_pci_add_child(dev
, 1);
632 return bus_generic_attach(dev
);
636 ata_pci_intr(struct ata_channel
*ch
)
641 * since we might share the IRQ with another device, and in some
642 * cases with our twin channel, we only want to process interrupts
643 * that we know this channel generated.
645 switch (ch
->chiptype
) {
646 case 0x00041103: /* HighPoint HPT366/368/370/372 */
647 case 0x00051103: /* HighPoint HPT372 */
648 case 0x00081103: /* HighPoint HPT374 */
649 if (((dmastat
= ata_dmastatus(ch
)) &
650 (ATA_BMSTAT_ACTIVE
| ATA_BMSTAT_INTERRUPT
)) != ATA_BMSTAT_INTERRUPT
)
652 ATA_OUTB(ch
->r_bmio
, ATA_BMSTAT_PORT
, dmastat
| ATA_BMSTAT_INTERRUPT
);
656 case 0x06481095: /* CMD 648 */
657 case 0x06491095: /* CMD 649 */
658 if (!(pci_read_config(device_get_parent(ch
->dev
), 0x71, 1) &
659 (ch
->unit
? 0x08 : 0x04)))
661 #if !defined(NO_ATANG)
662 pci_write_config(device_get_parent(ch
->dev
), 0x71,
663 pci_read_config(device_get_parent(ch
->dev
), 0x71, 1) &
664 ~(ch
->unit
? 0x04 : 0x08), 1);
668 case 0x06801095: /* SiI 680 */
669 if (!(pci_read_config(device_get_parent(ch
->dev
),
670 (ch
->unit
? 0xb1 : 0xa1), 1) & 0x08))
674 case 0x4d33105a: /* Promise Ultra/Fasttrak 33 */
675 case 0x0d38105a: /* Promise Fasttrak 66 */
676 case 0x4d38105a: /* Promise Ultra/Fasttrak 66 */
677 case 0x0d30105a: /* Promise OEM ATA100 */
678 case 0x4d30105a: /* Promise Ultra/Fasttrak 100 */
679 if (!(ATA_INL(ch
->r_bmio
, (ch
->unit
? 0x14 : 0x1c)) &
680 (ch
->unit
? 0x00004000 : 0x00000400)))
684 case 0x4d68105a: /* Promise TX2 ATA100 */
685 case 0x6268105a: /* Promise TX2 ATA100 */
686 case 0x4d69105a: /* Promise TX2 ATA133 */
687 case 0x5275105a: /* Promise TX2 ATA133 */
688 case 0x6269105a: /* Promise TX2 ATA133 */
689 case 0x7275105a: /* Promise TX2 ATA133 */
690 ATA_OUTB(ch
->r_bmio
, ATA_BMDEVSPEC_0
, 0x0b);
691 if (!(ATA_INB(ch
->r_bmio
, ATA_BMDEVSPEC_1
) & 0x20))
695 case 0x24d18086: /* Intel ICH5 SATA150 */
696 case 0x24db8086: /* Intel ICH5 ATA100 */
697 case 0x26518086: /* Intel ICH6 SATA150 */
698 case 0x26528086: /* Intel ICH6R SATA150 */
699 dmastat
= ATA_INB(ch
->r_bmio
, ATA_BMSTAT_PORT
);
700 if ((dmastat
& (ATA_BMSTAT_ACTIVE
| ATA_BMSTAT_INTERRUPT
)) !=
701 ATA_BMSTAT_INTERRUPT
)
703 ATA_OUTB(ch
->r_bmio
, ATA_BMSTAT_PORT
, dmastat
&
704 ~(ATA_BMSTAT_DMA_SIMPLEX
| ATA_BMSTAT_ERROR
));
710 if (ch
->flags
& ATA_DMA_ACTIVE
) {
711 if (!((dmastat
= ata_dmastatus(ch
)) & ATA_BMSTAT_INTERRUPT
))
713 ATA_OUTB(ch
->r_bmio
, ATA_BMSTAT_PORT
, dmastat
| ATA_BMSTAT_INTERRUPT
);
720 ata_pci_print_child(device_t dev
, device_t child
)
722 struct ata_channel
*ch
= device_get_softc(child
);
725 retval
+= bus_print_child_header(dev
, child
);
726 retval
+= printf(": at 0x%lx", rman_get_start(ch
->r_io
));
728 if (ATA_MASTERDEV(dev
))
729 retval
+= printf(" irq %d", 14 + ch
->unit
);
731 retval
+= bus_print_child_footer(dev
, child
);
736 static struct resource
*
737 ata_pci_alloc_resource(device_t dev
, device_t child
, int type
, int *rid
,
738 u_long start
, u_long end
, u_long count
, u_int flags
)
740 struct ata_pci_controller
*controller
= device_get_softc(dev
);
741 struct resource
*res
= NULL
;
742 int unit
= ((struct ata_channel
*)device_get_softc(child
))->unit
;
745 if (type
== SYS_RES_IOPORT
) {
748 if (ATA_MASTERDEV(dev
)) {
750 start
= (unit
? ATA_SECONDARY
: ATA_PRIMARY
);
751 end
= start
+ ATA_IOSIZE
- 1;
753 res
= BUS_ALLOC_RESOURCE(device_get_parent(dev
), child
,
754 SYS_RES_IOPORT
, &myrid
,
755 start
, end
, count
, flags
);
758 myrid
= 0x10 + 8 * unit
;
759 res
= BUS_ALLOC_RESOURCE(device_get_parent(dev
), dev
,
760 SYS_RES_IOPORT
, &myrid
,
761 start
, end
, count
, flags
);
765 case ATA_ALTADDR_RID
:
766 if (ATA_MASTERDEV(dev
)) {
768 start
= (unit
? ATA_SECONDARY
: ATA_PRIMARY
) + ATA_ALTOFFSET
;
769 end
= start
+ ATA_ALTIOSIZE
- 1;
770 count
= ATA_ALTIOSIZE
;
771 res
= BUS_ALLOC_RESOURCE(device_get_parent(dev
), child
,
772 SYS_RES_IOPORT
, &myrid
,
773 start
, end
, count
, flags
);
776 myrid
= 0x14 + 8 * unit
;
777 res
= BUS_ALLOC_RESOURCE(device_get_parent(dev
), dev
,
778 SYS_RES_IOPORT
, &myrid
,
779 start
, end
, count
, flags
);
781 start
= rman_get_start(res
) + 2;
782 end
= start
+ ATA_ALTIOSIZE
- 1;
783 count
= ATA_ALTIOSIZE
;
784 BUS_RELEASE_RESOURCE(device_get_parent(dev
), dev
,
785 SYS_RES_IOPORT
, myrid
, res
);
786 res
= BUS_ALLOC_RESOURCE(device_get_parent(dev
), dev
,
787 SYS_RES_IOPORT
, &myrid
,
788 start
, end
, count
, flags
);
794 if (controller
->bmaddr
) {
797 controller
->bmaddr
: controller
->bmaddr
+ATA_BMIOSIZE
);
798 end
= start
+ ATA_BMIOSIZE
- 1;
799 count
= ATA_BMIOSIZE
;
800 res
= BUS_ALLOC_RESOURCE(device_get_parent(dev
), child
,
801 SYS_RES_IOPORT
, &myrid
,
802 start
, end
, count
, flags
);
808 if (type
== SYS_RES_IRQ
&& *rid
== ATA_IRQ_RID
) {
809 if (ATA_MASTERDEV(dev
)) {
810 int irq
= (unit
== 0 ? 14 : 15);
812 return BUS_ALLOC_RESOURCE(device_get_parent(dev
), child
,
813 SYS_RES_IRQ
, rid
, irq
, irq
, 1, flags
);
816 /* primary and secondary channels share interrupt, keep track */
817 if (!controller
->irq
)
818 controller
->irq
= BUS_ALLOC_RESOURCE(device_get_parent(dev
),
820 rid
, 0, ~0, 1, flags
);
821 controller
->irqcnt
++;
822 return controller
->irq
;
829 ata_pci_release_resource(device_t dev
, device_t child
, int type
, int rid
,
832 struct ata_pci_controller
*controller
= device_get_softc(dev
);
833 int unit
= ((struct ata_channel
*)device_get_softc(child
))->unit
;
835 if (type
== SYS_RES_IOPORT
) {
838 if (ATA_MASTERDEV(dev
))
839 return BUS_RELEASE_RESOURCE(device_get_parent(dev
), child
,
840 SYS_RES_IOPORT
, 0x0, r
);
842 return BUS_RELEASE_RESOURCE(device_get_parent(dev
), dev
,
843 SYS_RES_IOPORT
, 0x10 + 8 * unit
, r
);
846 case ATA_ALTADDR_RID
:
847 if (ATA_MASTERDEV(dev
))
848 return BUS_RELEASE_RESOURCE(device_get_parent(dev
), child
,
849 SYS_RES_IOPORT
, 0x0, r
);
851 return BUS_RELEASE_RESOURCE(device_get_parent(dev
), dev
,
852 SYS_RES_IOPORT
, 0x14 + 8 * unit
, r
);
856 return BUS_RELEASE_RESOURCE(device_get_parent(dev
), child
,
857 SYS_RES_IOPORT
, 0x20, r
);
862 if (type
== SYS_RES_IRQ
) {
863 if (rid
!= ATA_IRQ_RID
)
866 if (ATA_MASTERDEV(dev
)) {
867 return BUS_RELEASE_RESOURCE(device_get_parent(dev
), child
,
868 SYS_RES_IRQ
, rid
, r
);
871 /* primary and secondary channels share interrupt, keep track */
872 if (--controller
->irqcnt
)
874 controller
->irq
= NULL
;
875 return BUS_RELEASE_RESOURCE(device_get_parent(dev
), dev
,
876 SYS_RES_IRQ
, rid
, r
);
883 ata_pci_setup_intr(device_t dev
, device_t child
, struct resource
*irq
,
884 int flags
, driver_intr_t
*intr
, void *arg
,
885 void **cookiep
, lwkt_serialize_t serializer
)
887 if (ATA_MASTERDEV(dev
)) {
888 return BUS_SETUP_INTR(device_get_parent(dev
), child
, irq
,
889 flags
, intr
, arg
, cookiep
, serializer
);
892 return BUS_SETUP_INTR(device_get_parent(dev
), dev
, irq
,
893 flags
, intr
, arg
, cookiep
, serializer
);
897 ata_pci_teardown_intr(device_t dev
, device_t child
, struct resource
*irq
,
900 if (ATA_MASTERDEV(dev
)) {
901 return BUS_TEARDOWN_INTR(device_get_parent(dev
), child
, irq
, cookie
);
904 return BUS_TEARDOWN_INTR(device_get_parent(dev
), dev
, irq
, cookie
);
907 static device_method_t ata_pci_methods
[] = {
908 /* device interface */
909 DEVMETHOD(device_probe
, ata_pci_probe
),
910 DEVMETHOD(device_attach
, ata_pci_attach
),
911 DEVMETHOD(device_shutdown
, bus_generic_shutdown
),
912 DEVMETHOD(device_suspend
, bus_generic_suspend
),
913 DEVMETHOD(device_resume
, bus_generic_resume
),
916 DEVMETHOD(bus_print_child
, ata_pci_print_child
),
917 DEVMETHOD(bus_alloc_resource
, ata_pci_alloc_resource
),
918 DEVMETHOD(bus_release_resource
, ata_pci_release_resource
),
919 DEVMETHOD(bus_activate_resource
, bus_generic_activate_resource
),
920 DEVMETHOD(bus_deactivate_resource
, bus_generic_deactivate_resource
),
921 DEVMETHOD(bus_setup_intr
, ata_pci_setup_intr
),
922 DEVMETHOD(bus_teardown_intr
, ata_pci_teardown_intr
),
926 static driver_t ata_pci_driver
= {
929 sizeof(struct ata_pci_controller
),
932 static devclass_t ata_pci_devclass
;
934 DRIVER_MODULE(atapci
, pci
, ata_pci_driver
, ata_pci_devclass
, 0, 0);
937 ata_pcisub_probe(device_t dev
)
939 struct ata_channel
*ch
= device_get_softc(dev
);
943 /* find channel number on this controller */
944 device_get_children(device_get_parent(dev
), &children
, &count
);
945 for (i
= 0; i
< count
; i
++) {
946 if (children
[i
] == dev
)
949 kfree(children
, M_TEMP
);
950 ch
->chiptype
= pci_get_devid(device_get_parent(dev
));
951 ch
->intr_func
= ata_pci_intr
;
952 return ata_probe(dev
);
955 static device_method_t ata_pcisub_methods
[] = {
956 /* device interface */
957 DEVMETHOD(device_probe
, ata_pcisub_probe
),
958 DEVMETHOD(device_attach
, ata_attach
),
959 DEVMETHOD(device_detach
, ata_detach
),
960 DEVMETHOD(device_resume
, ata_resume
),
961 DEVMETHOD(device_suspend
, ata_suspend
),
965 static driver_t ata_pcisub_driver
= {
968 sizeof(struct ata_channel
),
971 DRIVER_MODULE(ata
, atapci
, ata_pcisub_driver
, ata_devclass
, 0, 0);