On Sun, Apr 30, 2017 at 03:04:38PM +0200, Mark Kettenis wrote:
> Here is a diff that makes mainbus(4) behave in a similar way as
> simplebus(4).  Needed for the Firefly-RK3399 since it attaches most
> devices directly on mainbus(4) and need to control the order a bit.
> 
> I dropped the "no device tree" panic.  We really can't get this far
> without having an FDT.
> 
> I'll do a similar diff for armv7 as the RK3288 will need this as well.
> 
> ok?

ok patrick@

> 
> 
> Index: arch/arm64/dev/mainbus.c
> ===================================================================
> RCS file: /cvs/src/sys/arch/arm64/dev/mainbus.c,v
> retrieving revision 1.4
> diff -u -p -r1.4 mainbus.c
> --- arch/arm64/dev/mainbus.c  27 Apr 2017 10:23:19 -0000      1.4
> +++ arch/arm64/dev/mainbus.c  30 Apr 2017 13:00:28 -0000
> @@ -40,12 +40,14 @@ int mainbus_match_secondary(struct devic
>  
>  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, st
>       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, st
>       }
>  
>       /* 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
>  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 *pare
>           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
> 

Reply via email to