Hi Daniel,

On Mon, 16 Feb 2026 at 14:24, Daniel Golle <[email protected]> wrote:
>
> Extend bootmeth_openwrt's boot() to handle all three storage backends:
>
> - Block devices: detected via bflow->blk, uses image_loader_init_blk()
>   (existing path, refactored into openwrt_boot_blk() helper)
> - UBI volumes: detected by checking the bootdev driver name
>   ("ubi_bootdev"), uses image_loader_init_ubi() with the volume name
>   from bflow->bootmeth_priv
> - MTD partitions: fallback for non-block bootflows with a priv string,
>   uses image_loader_init_mtd() with the partition name
>
> The check() function does not need changes: bootflow_iter_check_blk()
> already accepts non-network bootdevs including UCLASS_MTD parents.
>
> The rest of boot() remains identical across backends — bootm_init(),
> optional bootconf config selection, bootm_run(), cleanup on error.
> Each backend path is guarded by IS_ENABLED(CONFIG_BOOTDEV_*) to
> avoid link errors when not configured.
>
> Signed-off-by: Daniel Golle <[email protected]>
> ---
>  boot/bootmeth_openwrt.c | 29 +++++++++++++++++++++++------
>  1 file changed, 23 insertions(+), 6 deletions(-)
>
> diff --git a/boot/bootmeth_openwrt.c b/boot/bootmeth_openwrt.c
> index 82f39c17d7f..e1f47b58f61 100644
> --- a/boot/bootmeth_openwrt.c
> +++ b/boot/bootmeth_openwrt.c
> @@ -73,21 +73,38 @@ static int openwrt_read_bootflow(struct udevice *dev, 
> struct bootflow *bflow)
>         return 0;
>  }
>
> -static int openwrt_boot(struct udevice *dev, struct bootflow *bflow)
> +static int openwrt_boot_blk(struct bootflow *bflow,
> +                           struct image_loader *ldr)
>  {
>         struct blk_desc *desc = dev_get_uclass_plat(bflow->blk);
>         const char *ifname = blk_get_devtype(bflow->blk);
> +       char dev_part_str[32];
> +
> +       snprintf(dev_part_str, sizeof(dev_part_str), "%d:%d",
> +                desc->devnum, bflow->part);
> +
> +       return image_loader_init_blk(ldr, ifname, dev_part_str);
> +}
> +
> +static int openwrt_boot(struct udevice *dev, struct bootflow *bflow)
> +{
>         struct image_loader ldr = {};
>         struct bootm_info bmi;
> -       char dev_part_str[32];
>         char addr_img[64];
>         const char *conf;
>         int ret;
>
> -       snprintf(dev_part_str, sizeof(dev_part_str), "%d:%d",
> -                desc->devnum, bflow->part);
> -
> -       ret = image_loader_init_blk(&ldr, ifname, dev_part_str);

Something odd here, removing code added in a previous patch.

> +       if (bflow->blk) {
> +               ret = openwrt_boot_blk(bflow, &ldr);
> +       } else if (IS_ENABLED(CONFIG_BOOTDEV_UBI) &&
> +                  !strcmp(bflow->dev->driver->name, "ubi_bootdev")) {
> +               ret = image_loader_init_ubi(&ldr, bflow->bootmeth_priv);
> +       } else if (IS_ENABLED(CONFIG_BOOTDEV_MTD) &&
> +                  bflow->bootmeth_priv) {
> +               ret = image_loader_init_mtd(&ldr, bflow->bootmeth_priv);
> +       } else {
> +               return log_msg_ret("typ", -ENODEV);
> +       }

With driver model I am hoping you can just probe your device and avoid
all of this boilerplate.

>         if (ret)
>                 return log_msg_ret("ldr", ret);
>
> --
> 2.53.0

Regards,
Simon

Reply via email to