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 > > 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

