[PATCH 12/17] blspec: Rework firmware load

Sascha Hauer s.hauer at pengutronix.de
Mon Mar 15 10:25:51 GMT 2021


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 |



More information about the barebox mailing list