On Thu, Feb 19, 2026 at 06:09:28AM -0700, Simon Glass wrote:
> On Mon, 16 Feb 2026 at 14:23, Daniel Golle <[email protected]> wrote:
> >
> > Add the initial bootmeth_openwrt driver with:
> >
> > - UCLASS_BOOTMETH driver, compatible "u-boot,openwrt"
> > - check(): accept block devices via bootflow_iter_check_blk()
> > - bind(): set BOOTMETHF_ANY_PART so bootstd iterates all partitions
> >   without requiring a filesystem
> > - read_bootflow(): stub returning -ENOENT
> > - boot(): stub returning -ENOSYS
> > - Kconfig: CONFIG_BOOTMETH_OPENWRT depending on FIT, BOOTSTD,
> >   BOOTM_STORAGE
> 
> We don't normally write out this much detail in the code

Yeah, that's Claude does, I'll drop the code description and only keep
the part below.

> 
> >
> > This is the foundation for booting OpenWrt-style uImage.FIT firmware
> > images stored directly on raw storage partitions. The bootmeth will
> > delegate actual image loading to the existing bootm storage path via
> > image_loader.
> >
> > Signed-off-by: Daniel Golle <[email protected]>
> > ---
> >  boot/Kconfig            | 13 +++++++++
> >  boot/Makefile           |  1 +
> >  boot/bootmeth_openwrt.c | 65 +++++++++++++++++++++++++++++++++++++++++
> >  3 files changed, 79 insertions(+)
> >  create mode 100644 boot/bootmeth_openwrt.c
> 
> Reviewed-by: Simon Glass <[email protected]>
> 
> 
> >
> > diff --git a/boot/Kconfig b/boot/Kconfig
> > index efc06f3cd1a..d8c7b8360ac 100644
> > --- a/boot/Kconfig
> > +++ b/boot/Kconfig
> > @@ -585,6 +585,19 @@ config BOOTMETH_CROS
> >
> >           Note that only x86 devices are supported at present.
> >
> > +config BOOTMETH_OPENWRT
> > +       bool "Bootdev support for OpenWrt"
> > +       depends on FIT
> > +       depends on BOOTSTD
> > +       depends on BOOTM_STORAGE
> > +       help
> > +         Enables support for booting OpenWrt-style uImage.FIT firmware
> > +         images stored directly on raw storage (block device partitions,
> > +         MTD partitions, or UBI volumes). The boot method loads the FIT
> > +         metadata, selectively reads only the kernel and FDT sub-images
> > +         from storage, and skips filesystem sub-images that Linux maps
> > +         directly from flash.
> > +
> >  config BOOTMETH_EXTLINUX
> >         bool "Bootdev support for extlinux boot"
> >         select PXE_UTILS
> > diff --git a/boot/Makefile b/boot/Makefile
> > index 7d1d4a28106..7b42358eb0c 100644
> > --- a/boot/Makefile
> > +++ b/boot/Makefile
> > @@ -72,6 +72,7 @@ obj-$(CONFIG_$(PHASE_)BOOTMETH_VBE_SIMPLE_FW) += 
> > vbe_simple_fw.o
> >  obj-$(CONFIG_$(PHASE_)BOOTMETH_VBE_SIMPLE_OS) += vbe_simple_os.o
> >
> >  obj-$(CONFIG_$(PHASE_)BOOTMETH_ANDROID) += bootmeth_android.o
> > +obj-$(CONFIG_$(PHASE_)BOOTMETH_OPENWRT) += bootmeth_openwrt.o
> >
> >  obj-$(CONFIG_IMAGE_LOADER) += image-loader.o
> >  obj-$(CONFIG_IMAGE_LOADER_BLK) += image-loader-blk.o
> > diff --git a/boot/bootmeth_openwrt.c b/boot/bootmeth_openwrt.c
> > new file mode 100644
> > index 00000000000..02bf543031b
> > --- /dev/null
> > +++ b/boot/bootmeth_openwrt.c
> > @@ -0,0 +1,65 @@
> > +// SPDX-License-Identifier: GPL-2.0+
> > +/*
> > + * Bootmethod for OpenWrt
> > + *
> > + * Copyright (C) 2026 Daniel Golle <[email protected]>
> > + */
> > +
> > +#define LOG_CATEGORY UCLASS_BOOTSTD
> > +
> > +#include <blk.h>
> > +#include <bootdev.h>
> > +#include <bootflow.h>
> > +#include <bootm.h>
> > +#include <bootmeth.h>
> > +#include <dm.h>
> > +#include <image-loader.h>
> > +#include <malloc.h>
> > +#include <mapmem.h>
> > +
> > +static int openwrt_check(struct udevice *dev, struct bootflow_iter *iter)
> > +{
> > +       if (bootflow_iter_check_blk(iter))
> > +               return log_msg_ret("blk", -EOPNOTSUPP);
> > +
> > +       return 0;
> > +}
> > +
> > +static int openwrt_read_bootflow(struct udevice *dev, struct bootflow 
> > *bflow)
> > +{
> > +       return log_msg_ret("nyi", -ENOENT);
> > +}
> > +
> > +static int openwrt_boot(struct udevice *dev, struct bootflow *bflow)
> > +{
> > +       return log_msg_ret("nyi", -ENOSYS);
> > +}
> > +
> > +static int openwrt_bootmeth_bind(struct udevice *dev)
> > +{
> > +       struct bootmeth_uc_plat *plat = dev_get_uclass_plat(dev);
> > +
> > +       plat->desc = "OpenWrt";
> > +       plat->flags = BOOTMETHF_ANY_PART;
> > +
> > +       return 0;
> > +}
> > +
> > +static struct bootmeth_ops openwrt_bootmeth_ops = {
> > +       .check          = openwrt_check,
> > +       .read_bootflow  = openwrt_read_bootflow,
> > +       .boot           = openwrt_boot,
> > +};
> > +
> > +static const struct udevice_id openwrt_bootmeth_ids[] = {
> > +       { .compatible = "u-boot,openwrt" },
> > +       { }
> > +};
> > +
> > +U_BOOT_DRIVER(bootmeth_openwrt) = {
> > +       .name           = "bootmeth_openwrt",
> > +       .id             = UCLASS_BOOTMETH,
> > +       .of_match       = openwrt_bootmeth_ids,
> > +       .ops            = &openwrt_bootmeth_ops,
> > +       .bind           = openwrt_bootmeth_bind,
> > +};
> > --
> > 2.53.0

Reply via email to