summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorGordon Willem Klok <gwk@cvs.openbsd.org>2006-10-23 02:05:27 +0000
committerGordon Willem Klok <gwk@cvs.openbsd.org>2006-10-23 02:05:27 +0000
commita0a49ee8cceead08fc63bfeef2ff2d62ec77b366 (patch)
tree0e7b2d12d7991313ad44e4aa1b54f35546862203 /sys/arch
parent40cf916c060f1314b1fe0001fc7ad6a5ba9a30fc (diff)
Change bandit as found in many old world macs to use configuration type 1.
Alter range calculation to handle bandits dual non contiguous PCI memory spaces. Finally fix a bug whereby if the "AAPL,Interrupts" property is defined the variable intr isn't assigned a value and garbage may be written to the PCI interrupt register. tested by jolan, pedro, drahn and myself, and in snaps for a week. ok drahn, deraadt
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/macppc/pci/mpcpcibus.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/sys/arch/macppc/pci/mpcpcibus.c b/sys/arch/macppc/pci/mpcpcibus.c
index a8f09dc76c9..9b197680914 100644
--- a/sys/arch/macppc/pci/mpcpcibus.c
+++ b/sys/arch/macppc/pci/mpcpcibus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mpcpcibus.c,v 1.32 2006/05/10 00:07:40 brad Exp $ */
+/* $OpenBSD: mpcpcibus.c,v 1.33 2006/10/23 02:05:26 gwk Exp $ */
/*
* Copyright (c) 1997 Per Fogelstrom
@@ -107,7 +107,7 @@ struct config_type{
};
struct config_type config_offsets[] = {
{"grackle", 0x00c00cf8, 0x00e00cfc, 0 },
- {"bandit", 0x00800000, 0x00c00000, 0 },
+ {"bandit", 0x00800000, 0x00c00000, 1 },
{"uni-north", 0x00800000, 0x00c00000, 3 },
{"u3-agp", 0x00800000, 0x00c00000, 3 },
{"u3-ht", 0x00000cf8, 0x00000cfc, 3 },
@@ -216,12 +216,15 @@ mpcpcibus_find_ranges_32 (struct pcibr_softc *sc, u_int32_t *range_store,
prange[i].size);
#endif
if (base != 0) {
- if ((base + size) == prange[i].base) {
+ if ((base + size) == prange[i].base)
size += prange[i].size;
- } else {
+ else if (prange[i].base < base) {
+ size+= base - prange[i].base;
base = prange[i].base;
+ } else {
size = prange[i].size;
- }
+ base = prange[i].base;
+ }
} else {
base = prange[i].base;
size = prange[i].size;
@@ -438,7 +441,7 @@ mpcpcibrattach(struct device *parent, struct device *self, void *aux)
pci_addr_fixup(sc, &lcp->lc_pc, 32);
pba.pba_dmat = &pci_bus_dma_tag;
-
+
pba.pba_busname = "pci";
pba.pba_iot = &sc->sc_iobus_space;
pba.pba_memt = &sc->sc_membus_space;
@@ -605,7 +608,8 @@ fix_node_irq(int node, struct pcibus_attach_args *pba)
} else
return;
}
- }
+ } else
+ irq = intr;
/* program the interrupt line register with the value
* found in openfirmware
*/
@@ -737,15 +741,14 @@ mpc_gen_config_reg(void *cpv, pcitag_t tag, int offset)
* config type 1
*/
reg = tag | offset | 1;
-
}
} else {
/* config mechanism #2, type 0
* standard cf8/cfc config
*/
reg = 0x80000000 | tag | offset;
-
}
+
return reg;
}