On Fri, Mar 12, 2021 at 12:15:05PM +0100, Michael Tretter wrote: > On Wed, 10 Mar 2021 14:28:24 +0100, Sascha Hauer wrote: > > Applying overlays in blspec currently works in two steps. First > > of_firmware_load_overlay() is called which doesn't load an overlay, > > but instead loads firmware when one is needed by the overlay. This > > is done on the live tree, because that was needed to find the firmware > > manager. The second step is to call of_register_overlay() to apply > > the overlay to the kernel device tree when the fixups are executed. > > > > Instead of using a separate step to load the firmware, load the firmware > > as part of the of_fixups. > > Wouldn't this result in the firmware being loaded whenever of_fix_tree is > called? Then, every use of the of_dump or of_diff commands would result in a > reload of the firmware. You are right, that is undesired. Ahmad just suggested a dryrun parameter to the of_fixup callbacks. That could be useful elsewhere. A dryrun would mean "Do the device tree fixups, but don't change anything else". > > -int of_firmware_load_overlay(struct device_node *overlay) > > +int of_overlay_load_firmware(struct device_node *root, struct device_node *overlay) > > { > > - int err; > > - struct device_node *root; > > - struct device_node *resolved; > > - struct device_node *ovl; > > - > > - root = of_get_root_node(); > > - resolved = of_resolve_phandles(root, overlay); > > - /* > > - * If the overlay cannot be resolved, use the load_firmware callback > > - * with the unresolved overlay to verify that the overlay does not > > - * depend on a firmware to be loaded. If a required firmware cannot be > > - * loaded, the overlay must not be applied. > > - */ > > - ovl = resolved ? resolved : overlay; > > - > > - err = of_process_overlay(root, ovl, load_firmware, NULL); > > - > > - if (resolved) > > - of_delete_node(resolved); > > - > > - return err; > > + return of_process_overlay(root, overlay, load_firmware, NULL); > > This drops the check, if the overlay depends on firmware, which cannot be > loaded, because Barebox could not resolve the overlay. This might be OK, > because in this case, we also don't know if the target is an fpga-region. > Looks fragile to me, anyway. > > > } > > diff --git a/drivers/of/overlay.c b/drivers/of/overlay.c > > index c9ede614a6..d42e15ed1c 100644 > > --- a/drivers/of/overlay.c > > +++ b/drivers/of/overlay.c > > @@ -221,6 +221,8 @@ int of_overlay_apply_tree(struct device_node *root, > > pr_warn("failed to apply %s\n", fragment->name); > > } > > > > + err = of_overlay_load_firmware(root, resolved); > > The firmware must be loaded before the overlay is applied. If the firmware > cannot be loaded, the device tree must not be modified. OK, I will load the firmware before applying the overlay. Sascha -- Pengutronix e.K. | | Steuerwalder Str. 21 | http://www.pengutronix.de/ | 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox