summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/pci/pciide.c121
1 files changed, 71 insertions, 50 deletions
diff --git a/sys/dev/pci/pciide.c b/sys/dev/pci/pciide.c
index bbab98a1edf..538d2ee1b86 100644
--- a/sys/dev/pci/pciide.c
+++ b/sys/dev/pci/pciide.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pciide.c,v 1.221 2006/01/24 12:25:51 jsg Exp $ */
+/* $OpenBSD: pciide.c,v 1.222 2006/02/01 09:32:42 jsg Exp $ */
/* $NetBSD: pciide.c,v 1.127 2001/08/03 01:31:08 tsutsui Exp $ */
/*
@@ -508,6 +508,10 @@ const struct pciide_product_desc pciide_via_products[] = {
0,
apollo_chip_map
},
+ { PCI_PRODUCT_VIATECH_VT6410, /* VIA VT6410 IDE */
+ IDE_PCI_CLASS_OVERRIDE,
+ apollo_chip_map
+ },
{ PCI_PRODUCT_VIATECH_VT6420_SATA, /* VIA VT6420 SATA */
IDE_PCI_CLASS_OVERRIDE,
sata_chip_map
@@ -2692,72 +2696,89 @@ void
apollo_chip_map(struct pciide_softc *sc, struct pci_attach_args *pa)
{
struct pciide_channel *cp;
- pcireg_t interface = PCI_INTERFACE(pa->pa_class);
+ pcireg_t interface;
int channel;
u_int32_t ideconf;
bus_size_t cmdsize, ctlsize;
pcitag_t pcib_tag;
pcireg_t pcib_id, pcib_class;
+ /*
+ * Fake interface since VT6410 is claimed to be a ``RAID'' device.
+ */
+ if (PCI_SUBCLASS(pa->pa_class) == PCI_SUBCLASS_MASS_STORAGE_IDE) {
+ interface = PCI_INTERFACE(pa->pa_class);
+ } else {
+ interface = PCIIDE_INTERFACE_BUS_MASTER_DMA |
+ PCIIDE_INTERFACE_PCI(0) | PCIIDE_INTERFACE_PCI(1);
+ }
+
if (pciide_chipen(sc, pa) == 0)
return;
- /* Determine the DMA capabilities by looking at the ISA bridge. */
- pcib_tag = pci_make_tag(pa->pa_pc, pa->pa_bus, pa->pa_device, 0);
- pcib_id = pci_conf_read(sc->sc_pc, pcib_tag, PCI_ID_REG);
- pcib_class = pci_conf_read(sc->sc_pc, pcib_tag, PCI_CLASS_REG);
-
- /* XXX On the VT8237, the ISA bridge is on a different device. */
- if (PCI_CLASS(pcib_class) != PCI_CLASS_BRIDGE && pa->pa_device == 15) {
- pcib_tag = pci_make_tag(pa->pa_pc, pa->pa_bus, 17, 0);
+ if (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_VIATECH_VT6410) {
+ printf(": ATA133");
+ sc->sc_wdcdev.UDMA_cap = 6;
+ } else {
+ /* Determine the DMA capabilities by looking at the ISA bridge. */
+ pcib_tag = pci_make_tag(pa->pa_pc, pa->pa_bus, pa->pa_device, 0);
pcib_id = pci_conf_read(sc->sc_pc, pcib_tag, PCI_ID_REG);
pcib_class = pci_conf_read(sc->sc_pc, pcib_tag, PCI_CLASS_REG);
- }
- switch (PCI_PRODUCT(pcib_id)) {
- case PCI_PRODUCT_VIATECH_VT82C586_ISA:
- if (PCI_REVISION(pcib_class) >= 0x02) {
- printf(": ATA33");
- sc->sc_wdcdev.UDMA_cap = 2;
- } else {
- printf(": DMA");
- sc->sc_wdcdev.UDMA_cap = 0;
+ /* XXX On the VT8237, the ISA bridge is on a different device. */
+ if (PCI_CLASS(pcib_class) != PCI_CLASS_BRIDGE && pa->pa_device == 15 &&
+ PCI_PRODUCT(pcib_id) == PCI_PRODUCT_VIATECH_VT82C571) {
+ pcib_tag = pci_make_tag(pa->pa_pc, pa->pa_bus, 17, 0);
+ pcib_id = pci_conf_read(sc->sc_pc, pcib_tag, PCI_ID_REG);
+ pcib_class = pci_conf_read(sc->sc_pc, pcib_tag, PCI_CLASS_REG);
}
- break;
- case PCI_PRODUCT_VIATECH_VT82C596A:
- if (PCI_REVISION(pcib_class) >= 0x12) {
- printf(": ATA66");
- sc->sc_wdcdev.UDMA_cap = 4;
- } else {
- printf(": ATA33");
- sc->sc_wdcdev.UDMA_cap = 2;
- }
- break;
- case PCI_PRODUCT_VIATECH_VT82C686A_ISA:
- if (PCI_REVISION(pcib_class) >= 0x40) {
+ switch (PCI_PRODUCT(pcib_id)) {
+ case PCI_PRODUCT_VIATECH_VT82C586_ISA:
+ if (PCI_REVISION(pcib_class) >= 0x02) {
+ printf(": ATA33");
+ sc->sc_wdcdev.UDMA_cap = 2;
+ } else {
+ printf(": DMA");
+ sc->sc_wdcdev.UDMA_cap = 0;
+ }
+ break;
+ case PCI_PRODUCT_VIATECH_VT82C596A:
+ if (PCI_REVISION(pcib_class) >= 0x12) {
+ printf(": ATA66");
+ sc->sc_wdcdev.UDMA_cap = 4;
+ } else {
+ printf(": ATA33");
+ sc->sc_wdcdev.UDMA_cap = 2;
+ }
+ break;
+
+ case PCI_PRODUCT_VIATECH_VT82C686A_ISA:
+ if (PCI_REVISION(pcib_class) >= 0x40) {
+ printf(": ATA100");
+ sc->sc_wdcdev.UDMA_cap = 5;
+ } else {
+ printf(": ATA66");
+ sc->sc_wdcdev.UDMA_cap = 4;
+ }
+ break;
+ case PCI_PRODUCT_VIATECH_VT8231_ISA:
+ case PCI_PRODUCT_VIATECH_VT8233_ISA:
printf(": ATA100");
sc->sc_wdcdev.UDMA_cap = 5;
- } else {
- printf(": ATA66");
- sc->sc_wdcdev.UDMA_cap = 4;
+ break;
+ case PCI_PRODUCT_VIATECH_VT8233A_ISA:
+ case PCI_PRODUCT_VIATECH_VT8235_ISA:
+ case PCI_PRODUCT_VIATECH_VT8237_ISA:
+ case PCI_PRODUCT_VIATECH_VT6410:
+ printf(": ATA133");
+ sc->sc_wdcdev.UDMA_cap = 6;
+ break;
+ default:
+ printf(": DMA");
+ sc->sc_wdcdev.UDMA_cap = 0;
+ break;
}
- break;
- case PCI_PRODUCT_VIATECH_VT8231_ISA:
- case PCI_PRODUCT_VIATECH_VT8233_ISA:
- printf(": ATA100");
- sc->sc_wdcdev.UDMA_cap = 5;
- break;
- case PCI_PRODUCT_VIATECH_VT8233A_ISA:
- case PCI_PRODUCT_VIATECH_VT8235_ISA:
- case PCI_PRODUCT_VIATECH_VT8237_ISA:
- printf(": ATA133");
- sc->sc_wdcdev.UDMA_cap = 6;
- break;
- default:
- printf(": DMA");
- sc->sc_wdcdev.UDMA_cap = 0;
- break;
}
pciide_mapreg_dma(sc, pa);