On Sun, May 01, 2016 at 04:55:02PM +0200, Mark Kettenis wrote:
> > Date: Sun, 1 May 2016 13:27:29 +0200
> > From: Patrick Wildt <[email protected]>
> >
> > Hi,
> >
> > I updated the diff with the feedback received. This basically adds
> > a tree-like topology by making mainbus FDT aware and implementing
> > a simplebus that can span the tree's roots into more branches.
> >
> > Next steps (and diffs) are implementing an FDT platform for armv7,
> > similar to imx/omap/... and having the generic interrupt controller
> > and timer attach to a simplebus/fdt bus.
> >
> > Comments?
>
> Looks good to me. If jsg@ agrees, let's get this in and work on it
> further in the tree.
Yes, I agree.
>
> > diff --git sys/arch/arm/conf/files.arm sys/arch/arm/conf/files.arm
> > index cb11960..c70f9ab 100644
> > --- sys/arch/arm/conf/files.arm
> > +++ sys/arch/arm/conf/files.arm
> > @@ -16,15 +16,24 @@ file arch/arm/arm/disassem.c ddb
> > file arch/arm/arm/fiq.c fiq
> > file arch/arm/arm/fiq_subr.S fiq
> >
> > +define fdt {}
> > +
> > # mainbus files
> > -device mainbus {}
> > +device mainbus: fdt
> > attach mainbus at root
> > file arch/arm/mainbus/mainbus.c mainbus
> >
> > +device simplebus: fdt
> > +attach simplebus at fdt
> > +file arch/arm/simplebus/simplebus.c simplebus
> > +
> > +# FDT support
> > +file dev/ofw/fdt.c
> > +
> > include "arch/arm/cortex/files.cortex"
> >
> > device cpu {}
> > -attach cpu at mainbus with cpu_mainbus
> > +attach cpu at fdt with cpu_mainbus
> > file arch/arm/mainbus/cpu_mainbus.c cpu_mainbus
> >
> >
> > diff --git sys/arch/arm/cortex/cortex.c sys/arch/arm/cortex/cortex.c
> > index 913feb7..06a7823 100644
> > --- sys/arch/arm/cortex/cortex.c
> > +++ sys/arch/arm/cortex/cortex.c
> > @@ -97,7 +97,7 @@ struct cfdriver cortex_cd = {
> > int
> > cortexmatch(struct device *parent, void *cfdata, void *aux)
> > {
> > - struct mainbus_attach_args *ma = aux;
> > + union mainbus_attach_args *ma = aux;
> > struct cfdata *cf = (struct cfdata *)cfdata;
> > int cputype = cpufunc_id();
> >
> > diff --git sys/arch/arm/cortex/files.cortex sys/arch/arm/cortex/files.cortex
> > index c0f4359..052acfd 100644
> > --- sys/arch/arm/cortex/files.cortex
> > +++ sys/arch/arm/cortex/files.cortex
> > @@ -2,7 +2,7 @@
> >
> > # ARM core
> > device cortex {}
> > -attach cortex at mainbus
> > +attach cortex at fdt
> > file arch/arm/cortex/cortex.c cortex
> >
> > device ampintc
> > diff --git sys/arch/arm/include/fdt.h sys/arch/arm/include/fdt.h
> > new file mode 100644
> > index 0000000..0eec567
> > --- /dev/null
> > +++ sys/arch/arm/include/fdt.h
> > @@ -0,0 +1,31 @@
> > +/* $OpenBSD$ */
> > +/*
> > + * Copyright (c) 2016 Patrick Wildt <[email protected]>
> > + *
> > + * Permission to use, copy, modify, and distribute this software for any
> > + * purpose with or without fee is hereby granted, provided that the above
> > + * copyright notice and this permission notice appear in all copies.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> > + */
> > +
> > +#ifndef __ARM_FDT_H__
> > +#define __ARM_FDT_H__
> > +
> > +#define _ARM32_BUS_DMA_PRIVATE
> > +#include <machine/bus.h>
> > +
> > +struct fdt_attach_args {
> > + const char *fa_name;
> > + int fa_node;
> > + bus_space_tag_t fa_iot;
> > + bus_dma_tag_t fa_dmat;
> > +};
> > +
> > +#endif /* __ARM_FDT_H__ */
> > diff --git sys/arch/arm/mainbus/cpu_mainbus.c
> > sys/arch/arm/mainbus/cpu_mainbus.c
> > index 63de209..88410bf 100644
> > --- sys/arch/arm/mainbus/cpu_mainbus.c
> > +++ sys/arch/arm/mainbus/cpu_mainbus.c
> > @@ -72,7 +72,7 @@ static void cpu_mainbus_attach (struct device *, struct
> > device *, void *);
> > static int
> > cpu_mainbus_match(struct device *parent, void *vcf, void *aux)
> > {
> > - struct mainbus_attach_args *ma = aux;
> > + union mainbus_attach_args *ma = aux;
> > struct cfdata *cf = (struct cfdata *)vcf;
> >
> > return (strcmp(cf->cf_driver->cd_name, ma->ma_name) == 0);
> > diff --git sys/arch/arm/mainbus/mainbus.c sys/arch/arm/mainbus/mainbus.c
> > index 6ad3e8f..7f72161 100644
> > --- sys/arch/arm/mainbus/mainbus.c
> > +++ sys/arch/arm/mainbus/mainbus.c
> > @@ -1,45 +1,18 @@
> > -/* $OpenBSD: mainbus.c,v 1.7 2013/05/30 16:15:01 deraadt Exp $ */
> > -/* $NetBSD: mainbus.c,v 1.3 2001/06/13 17:52:43 nathanw Exp $ */
> > -
> > +/* $OpenBSD$ */
> > /*
> > - * Copyright (c) 1994,1995 Mark Brinicombe.
> > - * Copyright (c) 1994 Brini.
> > - * All rights reserved.
> > - *
> > - * Redistribution and use in source and binary forms, with or without
> > - * modification, are permitted provided that the following conditions
> > - * are met:
> > - * 1. Redistributions of source code must retain the above copyright
> > - * notice, this list of conditions and the following disclaimer.
> > - * 2. Redistributions in binary form must reproduce the above copyright
> > - * notice, this list of conditions and the following disclaimer in the
> > - * documentation and/or other materials provided with the distribution.
> > - * 3. All advertising materials mentioning features or use of this software
> > - * must display the following acknowledgement:
> > - * This product includes software developed by Brini.
> > - * 4. The name of the company nor the name of the author may be used to
> > - * endorse or promote products derived from this software without
> > specific
> > - * prior written permission.
> > - *
> > - * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED
> > - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
> > - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> > - * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
> > - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
> > - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> > - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> > - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
> > STRICT
> > - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
> > WAY
> > - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> > - * SUCH DAMAGE.
> > - *
> > - * RiscBSD kernel project
> > + * Copyright (c) 2016 Patrick Wildt <[email protected]>
> > *
> > - * mainbus.c
> > + * Permission to use, copy, modify, and distribute this software for any
> > + * purpose with or without fee is hereby granted, provided that the above
> > + * copyright notice and this permission notice appear in all copies.
> > *
> > - * mainbus configuration
> > - *
> > - * Created : 15/12/94
> > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> > */
> >
> > #include <sys/param.h>
> > @@ -47,78 +20,155 @@
> > #include <sys/kernel.h>
> > #include <sys/device.h>
> >
> > +#include <dev/ofw/openfirm.h>
> > +
> > #include <arm/mainbus/mainbus.h>
> >
> > -/* Prototypes for functions provided */
> > +int mainbus_match(struct device *, void *, void *);
> > +void mainbus_attach(struct device *, struct device *, void *);
> >
> > -int mainbusmatch(struct device *, void *, void *);
> > -void mainbusattach(struct device *, struct device *, void *);
> > -int mainbusprint(void *aux, const char *mainbus);
> > -int mainbussearch(struct device *, void *, void *);
> > +void mainbus_attach_node(struct device *, int);
> >
> > -/* attach and device structures for the device */
> > +int mainbus_legacy_search(struct device *, void *, void *);
> > +void mainbus_legacy_found(struct device *, char *);
> > +
> > +struct mainbus_softc {
> > + struct device sc_dev;
> > + bus_space_tag_t sc_iot;
> > + bus_dma_tag_t sc_dmat;
> > +};
> >
> > struct cfattach mainbus_ca = {
> > - sizeof(struct device), mainbusmatch, mainbusattach
> > + sizeof(struct mainbus_softc), mainbus_match, mainbus_attach, NULL,
> > + config_activate_children
> > };
> >
> > struct cfdriver mainbus_cd = {
> > NULL, "mainbus", DV_DULL
> > };
> >
> > +struct arm32_bus_dma_tag mainbus_dma_tag = {
> > + 0,
> > + 0,
> > + NULL,
> > + _bus_dmamap_create,
> > + _bus_dmamap_destroy,
> > + _bus_dmamap_load,
> > + _bus_dmamap_load_mbuf,
> > + _bus_dmamap_load_uio,
> > + _bus_dmamap_load_raw,
> > + _bus_dmamap_unload,
> > + _bus_dmamap_sync,
> > + _bus_dmamem_alloc,
> > + _bus_dmamem_free,
> > + _bus_dmamem_map,
> > + _bus_dmamem_unmap,
> > + _bus_dmamem_mmap,
> > +};
> > +
> > /*
> > - * int mainbusmatch(struct device *parent, struct cfdata *cf, void *aux)
> > + * Mainbus takes care of FDT and non-FDT machines, so we
> > + * always attach.
> > */
> > -
> > int
> > -mainbusmatch(struct device *parent, void *cf, void *aux)
> > +mainbus_match(struct device *parent, void *cfdata, void *aux)
> > {
> > return (1);
> > }
> >
> > +void
> > +mainbus_attach(struct device *parent, struct device *self, void *aux)
> > +{
> > + struct mainbus_softc *sc = (struct mainbus_softc *)self;
> > + char buffer[128];
> > + int node;
> > +
> > + if ((node = OF_peer(0)) == 0) {
> > + printf(": no device tree\n");
> > + config_search(mainbus_legacy_search, self, aux);
> > + return;
> > + }
> > +
> > +#ifdef CPU_ARMv7
> > + extern struct bus_space armv7_bs_tag;
> > + sc->sc_iot = &armv7_bs_tag;
> > +#endif
> > + sc->sc_dmat = &mainbus_dma_tag;
> > +
> > + if (OF_getprop(node, "model", buffer, sizeof(buffer)))
> > + printf(": %s\n", buffer);
> > + else
> > + printf(": unknown model\n");
> > +
> > + /* Attach CPU first. */
> > + mainbus_legacy_found(self, "cpu");
> > +
> > + /* TODO: Scan for interrupt controllers and attach them first? */
> > +
> > + /* Scan the whole tree. */
> > + for (node = OF_child(node);
> > + node != 0;
> > + node = OF_peer(node))
> > + {
> > + mainbus_attach_node(self, node);
> > + }
> > +}
> > +
> > /*
> > - * void mainbusattach(struct device *parent, struct device *self, void
> > *aux)
> > - *
> > - * probe and attach all children
> > + * Look for a driver that wants to be attached to this node.
> > */
> > -
> > void
> > -mainbusattach(struct device *parent, struct device *self, void *aux)
> > +mainbus_attach_node(struct device *self, int node)
> > {
> > - printf("\n");
> > + struct mainbus_softc *sc = (struct mainbus_softc *)self;
> > + struct fdt_attach_args fa;
> > + char buffer[128];
> > +
> > + if (!OF_getprop(node, "compatible", buffer, sizeof(buffer)))
> > + return;
> > +
> > + if (OF_getprop(node, "status", buffer, sizeof(buffer)))
> > + if (!strcmp(buffer, "disabled"))
> > + return;
> >
> > - config_search(mainbussearch, self, aux);
> > + memset(&fa, 0, sizeof(fa));
> > + fa.fa_name = "";
> > + fa.fa_node = node;
> > + fa.fa_iot = sc->sc_iot;
> > + fa.fa_dmat = sc->sc_dmat;
> > +
> > + /* TODO: attach the device's clocks first? */
> > +
> > + config_found(self, &fa, NULL);
> > }
> >
> > +/*
> > + * Legacy support for SoCs that do not use FDT.
> > + */
> > int
> > -mainbussearch(struct device *parent, void *vcf, void *aux)
> > +mainbus_legacy_search(struct device *parent, void *match, void *aux)
> > {
> > - struct mainbus_attach_args ma;
> > - struct cfdata *cf = vcf;
> > + union mainbus_attach_args ma;
> > + struct cfdata *cf = match;
> >
> > + memset(&ma, 0, sizeof(ma));
> > ma.ma_name = cf->cf_driver->cd_name;
> >
> > /* allow for devices to be disabled in UKC */
> > if ((*cf->cf_attach->ca_match)(parent, cf, &ma) == 0)
> > return 0;
> >
> > - config_attach(parent, cf, &ma, mainbusprint);
> > + config_attach(parent, cf, &ma, NULL);
> > return 1;
> > }
> >
> > -/*
> > - * int mainbusprint(void *aux, const char *mainbus)
> > - *
> > - * print routine used during config of children
> > - */
> > -
> > -int
> > -mainbusprint(void *aux, const char *mainbus)
> > +void
> > +mainbus_legacy_found(struct device *self, char *name)
> > {
> > - struct mainbus_attach_args *ma = aux;
> > + union mainbus_attach_args ma;
> >
> > - if (mainbus != NULL)
> > - printf("%s at %s", ma->ma_name, mainbus);
> > + memset(&ma, 0, sizeof(ma));
> > + ma.ma_name = name;
> >
> > - return (UNCONF);
> > + config_found(self, &ma, NULL);
> > }
> > diff --git sys/arch/arm/mainbus/mainbus.h sys/arch/arm/mainbus/mainbus.h
> > index 3e17996..42ec9e3 100644
> > --- sys/arch/arm/mainbus/mainbus.h
> > +++ sys/arch/arm/mainbus/mainbus.h
> > @@ -1,51 +1,29 @@
> > -/* $OpenBSD: mainbus.h,v 1.2 2011/09/22 17:45:59 miod Exp $ */
> > -/* $NetBSD: mainbus.h,v 1.1 2001/02/24 19:38:02 reinoud Exp $ */
> > -
> > +/* $OpenBSD$ */
> > /*
> > - * Copyright (c) 1994,1995 Mark Brinicombe.
> > - * Copyright (c) 1994 Brini.
> > - * All rights reserved.
> > - *
> > - * Redistribution and use in source and binary forms, with or without
> > - * modification, are permitted provided that the following conditions
> > - * are met:
> > - * 1. Redistributions of source code must retain the above copyright
> > - * notice, this list of conditions and the following disclaimer.
> > - * 2. Redistributions in binary form must reproduce the above copyright
> > - * notice, this list of conditions and the following disclaimer in the
> > - * documentation and/or other materials provided with the distribution.
> > - * 3. All advertising materials mentioning features or use of this software
> > - * must display the following acknowledgement:
> > - * This product includes software developed by Brini.
> > - * 4. The name of the company nor the name of the author may be used to
> > - * endorse or promote products derived from this software without
> > specific
> > - * prior written permission.
> > - *
> > - * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED
> > - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
> > - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> > - * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
> > - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
> > - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> > - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> > - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
> > STRICT
> > - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
> > WAY
> > - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> > - * SUCH DAMAGE.
> > - *
> > - * RiscBSD kernel project
> > - *
> > - * mainbus.h
> > + * Copyright (c) 2016 Patrick Wildt <[email protected]>
> > *
> > - * mainbus configuration
> > + * Permission to use, copy, modify, and distribute this software for any
> > + * purpose with or without fee is hereby granted, provided that the above
> > + * copyright notice and this permission notice appear in all copies.
> > *
> > - * Created : 15/12/94
> > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> > */
> >
> > -/*
> > - * mainbus driver attach arguments
> > - */
> > +#ifndef __MAINBUS_H__
> > +#define __MAINBUS_H__
> >
> > -struct mainbus_attach_args {
> > - const char *ma_name;
> > +#include <arm/fdt.h>
> > +
> > +/* Passed as third arg to attach functions. */
> > +union mainbus_attach_args {
> > + const char *ma_name;
> > + struct fdt_attach_args ma_faa;
> > };
> > +
> > +#endif /* __MAINBUS_H__ */
> > diff --git sys/arch/arm/simplebus/simplebus.c
> > sys/arch/arm/simplebus/simplebus.c
> > new file mode 100644
> > index 0000000..0ae17f5
> > --- /dev/null
> > +++ sys/arch/arm/simplebus/simplebus.c
> > @@ -0,0 +1,118 @@
> > +/* $OpenBSD$ */
> > +/*
> > + * Copyright (c) 2016 Patrick Wildt <[email protected]>
> > + *
> > + * Permission to use, copy, modify, and distribute this software for any
> > + * purpose with or without fee is hereby granted, provided that the above
> > + * copyright notice and this permission notice appear in all copies.
> > + *
> > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
> > + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
> > + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
> > + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
> > + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
> > + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
> > + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> > + */
> > +
> > +#include <sys/param.h>
> > +#include <sys/systm.h>
> > +#include <sys/kernel.h>
> > +#include <sys/device.h>
> > +
> > +#include <dev/ofw/openfirm.h>
> > +
> > +#include <arm/fdt.h>
> > +
> > +int simplebus_match(struct device *, void *, void *);
> > +void simplebus_attach(struct device *, struct device *, void *);
> > +
> > +void simplebus_attach_node(struct device *, int);
> > +
> > +struct simplebus_softc {
> > + struct device sc_dev;
> > + int sc_node;
> > + bus_space_tag_t sc_iot;
> > + bus_dma_tag_t sc_dmat;
> > +};
> > +
> > +struct cfattach simplebus_ca = {
> > + sizeof(struct simplebus_softc), simplebus_match, simplebus_attach, NULL,
> > + config_activate_children
> > +};
> > +
> > +struct cfdriver simplebus_cd = {
> > + NULL, "simplebus", DV_DULL
> > +};
> > +
> > +/*
> > + * Simplebus is a generic bus with no special casings.
> > + */
> > +int
> > +simplebus_match(struct device *parent, void *cfdata, void *aux)
> > +{
> > + struct fdt_attach_args *fa = (struct fdt_attach_args *)aux;
> > + char buffer[128];
> > +
> > + if (fa->fa_node == 0)
> > + return (0);
> > +
> > + if (!OF_getprop(fa->fa_node, "compatible", buffer,
> > + sizeof(buffer)))
> > + return (0);
> > +
> > + if (strcmp(buffer, "simple-bus"))
> > + return (0);
> > +
> > + return (1);
> > +}
> > +
> > +void
> > +simplebus_attach(struct device *parent, struct device *self, void *aux)
> > +{
> > + struct simplebus_softc *sc = (struct simplebus_softc *)self;
> > + struct fdt_attach_args *fa = (struct fdt_attach_args *)aux;
> > + int node;
> > +
> > + sc->sc_node = fa->fa_node;
> > + sc->sc_iot = fa->fa_iot;
> > + sc->sc_dmat = fa->fa_dmat;
> > +
> > + printf("\n");
> > +
> > + /* Scan the whole tree. */
> > + for (node = OF_child(sc->sc_node);
> > + node != 0;
> > + node = OF_peer(node))
> > + {
> > + simplebus_attach_node(self, node);
> > + }
> > +}
> > +
> > +/*
> > + * Look for a driver that wants to be attached to this node.
> > + */
> > +void
> > +simplebus_attach_node(struct device *self, int node)
> > +{
> > + struct simplebus_softc *sc = (struct simplebus_softc *)self;
> > + struct fdt_attach_args fa;
> > + char buffer[128];
> > +
> > + if (!OF_getprop(node, "compatible", buffer, sizeof(buffer)))
> > + return;
> > +
> > + if (OF_getprop(node, "status", buffer, sizeof(buffer)))
> > + if (!strcmp(buffer, "disabled"))
> > + return;
> > +
> > + memset(&fa, 0, sizeof(fa));
> > + fa.fa_name = "";
> > + fa.fa_node = node;
> > + fa.fa_iot = sc->sc_iot;
> > + fa.fa_dmat = sc->sc_dmat;
> > +
> > + /* TODO: attach the device's clocks first? */
> > +
> > + config_found(self, &fa, NULL);
> > +}
> > diff --git sys/arch/arm/xscale/files.pxa2x0 sys/arch/arm/xscale/files.pxa2x0
> > index b73d7b7..a1833c1 100644
> > --- sys/arch/arm/xscale/files.pxa2x0
> > +++ sys/arch/arm/xscale/files.pxa2x0
> > @@ -9,7 +9,7 @@ file arch/arm/arm/softintr.c # Use the generic ARM
> > soft interrupt code.
> > # PXA2[51]0's integrated peripherals bus.
> > define pxaip {[addr=-1], [size=0], [intr=-1], [index=-1]}
> > device pxaip
> > -attach pxaip at mainbus
> > +attach pxaip at fdt
> > file arch/arm/xscale/pxa2x0.c
> > file arch/arm/arm/irq_dispatch.S
> > file arch/arm/xscale/pxa2x0_space.c
> > diff --git sys/arch/armish/conf/files.armish
> > sys/arch/armish/conf/files.armish
> > index 9bb866a..8e860f1 100644
> > --- sys/arch/armish/conf/files.armish
> > +++ sys/arch/armish/conf/files.armish
> > @@ -32,14 +32,14 @@ include "dev/i2c/files.i2c"
> > # ARM i80321 files
> > include "arch/arm/xscale/files.i80321"
> >
> > -attach iopxs at mainbus with iopxs_mainbus
> > +attach iopxs at fdt with iopxs_mainbus
> > file arch/armish/dev/i80321_mainbus.c iopxs_mainbus
> > file arch/armish/dev/pci_addr_fixup.c iopxs
> > file arch/armish/dev/iq80321_pci.c iopxs
> >
> > # IQ80310 on-board devices (including CPLD)
> > device obio {addr, [size = -1], [width = -1], [xint = -1]}:
> > bus_space_generic
> > -attach obio at mainbus
> > +attach obio at fdt
> > file arch/armish/dev/obio.c obio
> > file arch/armish/dev/obio_space.c obio
> >
> > diff --git sys/arch/armish/dev/i80321_mainbus.c
> > sys/arch/armish/dev/i80321_mainbus.c
> > index ce711aa..4cc584c 100644
> > --- sys/arch/armish/dev/i80321_mainbus.c
> > +++ sys/arch/armish/dev/i80321_mainbus.c
> > @@ -91,7 +91,7 @@ int i80321_mainbus_found;
> > int
> > i80321_mainbus_match(struct device *parent, void *match, void *aux)
> > {
> > - struct mainbus_attach_args *ma = aux;
> > + union mainbus_attach_args *ma = aux;
> > struct cfdata *cf = match;
> >
> > if (i80321_mainbus_found)
> > diff --git sys/arch/armish/dev/obio.c sys/arch/armish/dev/obio.c
> > index 0704ba7..6575008 100644
> > --- sys/arch/armish/dev/obio.c
> > +++ sys/arch/armish/dev/obio.c
> > @@ -73,7 +73,7 @@ int obio_found;
> > int
> > obio_match(struct device *parent, void *match, void *aux)
> > {
> > - struct mainbus_attach_args *ma = aux;
> > + union mainbus_attach_args *ma = aux;
> > struct cfdata *cf = match;
> >
> > if (obio_found)
> > diff --git sys/arch/armv7/conf/GENERIC sys/arch/armv7/conf/GENERIC
> > index ccb34ce..019c0ef 100644
> > --- sys/arch/armv7/conf/GENERIC
> > +++ sys/arch/armv7/conf/GENERIC
> > @@ -28,6 +28,7 @@ config bsd swap generic
> >
> > # The main bus device
> > mainbus0 at root
> > +simplebus* at fdt?
> > cpu0 at mainbus?
> >
> > # Cortex-A9
> > diff --git sys/arch/armv7/conf/RAMDISK sys/arch/armv7/conf/RAMDISK
> > index 8c0c22b..9c1b1b8 100644
> > --- sys/arch/armv7/conf/RAMDISK
> > +++ sys/arch/armv7/conf/RAMDISK
> > @@ -27,6 +27,7 @@ config bsd root on rd0a swap on rd0b
> >
> > # The main bus device
> > mainbus0 at root
> > +simplebus* at fdt?
> > cpu0 at mainbus?
> >
> > # Cortex-A9
> > diff --git sys/arch/armv7/conf/files.armv7 sys/arch/armv7/conf/files.armv7
> > index 7a9dc6a..333cf0c 100644
> > --- sys/arch/armv7/conf/files.armv7
> > +++ sys/arch/armv7/conf/files.armv7
> > @@ -8,9 +8,6 @@ major {sd = 24}
> > major {cd = 26}
> > major {rd = 18}
> >
> > -define fdt {}
> > -file dev/ofw/fdt.c
> > -
> > file arch/arm/arm/conf.c
> >
> > #interrupt API layer
> > diff --git sys/arch/armv7/exynos/files.exynos
> > sys/arch/armv7/exynos/files.exynos
> > index 89c4193..bd804f0 100644
> > --- sys/arch/armv7/exynos/files.exynos
> > +++ sys/arch/armv7/exynos/files.exynos
> > @@ -2,7 +2,7 @@
> >
> > define exynos {}
> > device exynos: exynos
> > -attach exynos at mainbus
> > +attach exynos at fdt
> > file arch/armv7/exynos/exynos_machdep.c exynos needs-flag
> > file arch/armv7/exynos/exynos.c exynos
> > file arch/armv7/exynos/exynos4.c exynos
> > diff --git sys/arch/armv7/imx/files.imx sys/arch/armv7/imx/files.imx
> > index 3e7ec33..c2eb458 100644
> > --- sys/arch/armv7/imx/files.imx
> > +++ sys/arch/armv7/imx/files.imx
> > @@ -2,7 +2,7 @@
> >
> > define imx {}
> > device imx: imx
> > -attach imx at mainbus
> > +attach imx at fdt
> > file arch/armv7/imx/imx_machdep.c imx needs-flag
> > file arch/armv7/imx/imx.c imx
> > file arch/armv7/imx/imx6.c
> > diff --git sys/arch/armv7/include/fdt.h sys/arch/armv7/include/fdt.h
> > new file mode 100644
> > index 0000000..83549d1
> > --- /dev/null
> > +++ sys/arch/armv7/include/fdt.h
> > @@ -0,0 +1,3 @@
> > +/* $OpenBSD$ */
> > +
> > +#include <arm/fdt.h>
> > diff --git sys/arch/armv7/omap/files.omap sys/arch/armv7/omap/files.omap
> > index 8fd446f..161ebdb 100644
> > --- sys/arch/armv7/omap/files.omap
> > +++ sys/arch/armv7/omap/files.omap
> > @@ -2,7 +2,7 @@
> >
> > define omap {}
> > device omap: omap
> > -attach omap at mainbus
> > +attach omap at fdt
> > file arch/armv7/omap/omap_machdep.c omap needs-flag
> > file arch/armv7/omap/omap.c omap
> > file arch/armv7/omap/omap3.c
> > diff --git sys/arch/armv7/sunxi/files.sunxi sys/arch/armv7/sunxi/files.sunxi
> > index 80c4ba4..76d9546 100644
> > --- sys/arch/armv7/sunxi/files.sunxi
> > +++ sys/arch/armv7/sunxi/files.sunxi
> > @@ -2,7 +2,7 @@
> >
> > define sunxi {}
> > device sunxi: sunxi
> > -attach sunxi at mainbus
> > +attach sunxi at fdt
> > file arch/armv7/sunxi/sunxi_machdep.c sunxi needs-flag
> > file arch/armv7/sunxi/sunxi.c sunxi
> > file arch/armv7/sunxi/sun4i.c
> > diff --git sys/arch/armv7/vexpress/files.vexpress
> > sys/arch/armv7/vexpress/files.vexpress
> > index dd7db10..23cf503 100644
> > --- sys/arch/armv7/vexpress/files.vexpress
> > +++ sys/arch/armv7/vexpress/files.vexpress
> > @@ -2,7 +2,7 @@
> >
> > define vexpress {}
> > device vexpress: vexpress
> > -attach vexpress at mainbus
> > +attach vexpress at fdt
> > file arch/armv7/vexpress/vexpress_machdep.c vexpress needs-flag
> > file arch/armv7/vexpress/vexpress.c vexpress
> > file arch/armv7/vexpress/vexpress_a9.c vexpress
> >
> >
>