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

Reply via email to