[RFC PATCH 18/20] boot: bootmeth: openwrt: support MTD and UBI bootdevs
Daniel Golle
daniel at makrotopia.org
Mon Feb 16 22:24:13 CET 2026
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 <daniel at makrotopia.org>
---
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);
+ 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);
+ }
if (ret)
return log_msg_ret("ldr", ret);
--
2.53.0
More information about the U-Boot
mailing list