summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>2006-06-29 00:01:04 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>2006-06-29 00:01:04 +0000
commitf864b2045c5f674e023bef1336cf5ceb3e3fcfbd (patch)
tree9483e31a4d0ae3c6ee501aaa40f9bc7eedaee503
parent4eb8ea158de546c64fec2d8a12116cb2019c0ddd (diff)
try prom mapping first, then memory mapping, then io mapping.. this works
on v210 and on netra t1 105, good sign it will work on others. mechanism pointed out by miod, tested by dlg and djm and I
-rw-r--r--sys/arch/sparc64/dev/pcfiic_ebus.c28
1 files changed, 22 insertions, 6 deletions
diff --git a/sys/arch/sparc64/dev/pcfiic_ebus.c b/sys/arch/sparc64/dev/pcfiic_ebus.c
index 750ccb0f481..67b254d6f9b 100644
--- a/sys/arch/sparc64/dev/pcfiic_ebus.c
+++ b/sys/arch/sparc64/dev/pcfiic_ebus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: pcfiic_ebus.c,v 1.5 2006/06/22 08:33:45 deraadt Exp $ */
+/* $OpenBSD: pcfiic_ebus.c,v 1.6 2006/06/29 00:01:03 deraadt Exp $ */
/*
* Copyright (c) 2006 David Gwynne <dlg@openbsd.org>
@@ -83,8 +83,6 @@ pcfiic_ebus_attach(struct device *parent, struct device *self, void *aux)
u_int8_t clock = PCF_CLOCK_12;
int swapregs = 0;
- sc->sc_iot = ea->ea_memtag;
-
if (ea->ea_nregs < 1 || ea->ea_nregs > 2) {
printf(": expected 1 or 2 registers, got %d\n", ea->ea_nregs);
return;
@@ -115,13 +113,31 @@ pcfiic_ebus_attach(struct device *parent, struct device *self, void *aux)
return;
}
- if (ebus_bus_map(sc->sc_iot, 0, EBUS_PADDR_FROM_REG(&ea->ea_regs[0]),
- ea->ea_regs[0].size, 0, 0, &sc->sc_ioh) != 0) {
+ /* Prefer prom mapping, then memory mapping, then io mapping */
+ if (ea->ea_nvaddrs) {
+ if (bus_space_map(ea->ea_memtag, ea->ea_vaddrs[0], 0,
+ BUS_SPACE_MAP_PROMADDRESS, &sc->sc_ioh) != 0)
+ goto fail;
+ sc->sc_iot = ea->ea_memtag;
+ } else if (ebus_bus_map(ea->ea_memtag, 0,
+ EBUS_PADDR_FROM_REG(&ea->ea_regs[0]),
+ ea->ea_regs[0].size, 0, 0, &sc->sc_ioh) == 0) {
+ sc->sc_iot = ea->ea_memtag;
+ } else if (ebus_bus_map(ea->ea_iotag, 0,
+ EBUS_PADDR_FROM_REG(&ea->ea_regs[0]),
+ ea->ea_regs[0].size, 0, 0, &sc->sc_ioh) == 0) {
+ sc->sc_iot = ea->ea_iotag;
+ } else {
+fail:
printf(": can't map register space\n");
- return;
+ return;
}
if (ea->ea_nregs == 2) {
+ /*
+ * Second register only occurs on BBC-based machines,
+ * and is likely not prom mapped
+ */
if (ebus_bus_map(sc->sc_iot, 0, EBUS_PADDR_FROM_REG(&ea->ea_regs[1]),
ea->ea_regs[1].size, 0, 0, &sc->sc_ioh2) != 0) {
printf(": can't map 2nd register space\n");