summaryrefslogtreecommitdiff
path: root/sys/arch
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@cvs.openbsd.org>2017-04-30 13:54:01 +0000
committerMark Kettenis <kettenis@cvs.openbsd.org>2017-04-30 13:54:01 +0000
commit29d7e3e57cc1af0c3fc3e07dba11181efc32179b (patch)
treeed63b66cbb60abe8aa984ad1d7761f4e6082e78f /sys/arch
parentcf987a11b3c8bc82e4e467c23b78db93c12cd5ff (diff)
Make early attrbute work here as well. Remove unreachable panic while there.
ok visa@
Diffstat (limited to 'sys/arch')
-rw-r--r--sys/arch/arm64/dev/mainbus.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/sys/arch/arm64/dev/mainbus.c b/sys/arch/arm64/dev/mainbus.c
index 1d8c8bbc274..a5e6bf3f785 100644
--- a/sys/arch/arm64/dev/mainbus.c
+++ b/sys/arch/arm64/dev/mainbus.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mainbus.c,v 1.4 2017/04/27 10:23:19 kettenis Exp $ */
+/* $OpenBSD: mainbus.c,v 1.5 2017/04/30 13:54:00 kettenis Exp $ */
/*
* Copyright (c) 2016 Patrick Wildt <patrick@blueri.se>
* Copyright (c) 2017 Mark Kettenis <kettenis@openbsd.org>
@@ -40,12 +40,14 @@ int mainbus_match_secondary(struct device *, void *, void *);
struct mainbus_softc {
struct device sc_dev;
+ int sc_node;
bus_space_tag_t sc_iot;
bus_dma_tag_t sc_dmat;
int sc_acells;
int sc_scells;
int *sc_ranges;
int sc_rangeslen;
+ int sc_early;
};
struct cfattach mainbus_ca = {
@@ -96,18 +98,17 @@ mainbus_attach(struct device *parent, struct device *self, void *aux)
char model[128];
int node, len;
- if ((node = OF_peer(0)) == 0)
- panic("mainbus: no device tree");
-
arm_intr_init_fdt();
agtimer_init();
+ sc->sc_node = OF_peer(0);
sc->sc_iot = &arm64_bs_tag;
sc->sc_dmat = &mainbus_dma_tag;
sc->sc_acells = OF_getpropint(OF_peer(0), "#address-cells", 1);
sc->sc_scells = OF_getpropint(OF_peer(0), "#size-cells", 1);
- if ((len = OF_getprop(node, "model", model, sizeof(model))) > 0) {
+ len = OF_getprop(sc->sc_node, "model", model, sizeof(model));
+ if (len > 0) {
printf(": %s\n", model);
hw_prod = malloc(len, M_DEVBUF, M_NOWAIT);
if (hw_prod)
@@ -126,9 +127,14 @@ mainbus_attach(struct device *parent, struct device *self, void *aux)
}
/* Scan the whole tree. */
- for (node = OF_child(node); node != 0; node = OF_peer(node))
+ sc->sc_early = 1;
+ for (node = OF_child(sc->sc_node); node != 0; node = OF_peer(node))
mainbus_attach_node(self, node, NULL);
+ sc->sc_early = 0;
+ for (node = OF_child(sc->sc_node); node != 0; node = OF_peer(node))
+ mainbus_attach_node(self, node, NULL);
+
/* Attach secondary CPUs. */
mainbus_attach_cpus(self, mainbus_match_secondary);
}
@@ -204,6 +210,7 @@ mainbus_attach_node(struct device *self, int node, cfmatch_t submatch)
int
mainbus_match_status(struct device *parent, void *match, void *aux)
{
+ struct mainbus_softc *sc = (struct mainbus_softc *)parent;
struct fdt_attach_args *fa = aux;
struct cfdata *cf = match;
char buf[32];
@@ -212,7 +219,9 @@ mainbus_match_status(struct device *parent, void *match, void *aux)
strcmp(buf, "disabled") == 0)
return 0;
- return (*cf->cf_attach->ca_match)(parent, match, aux);
+ if (cf->cf_loc[0] == sc->sc_early)
+ return (*cf->cf_attach->ca_match)(parent, match, aux);
+ return 0;
}
void