On 2/23/26 22:30, Mikhail Kshevetskiy wrote: > On 2/23/26 22:24, Daniel Golle wrote: >> On Mon, Feb 23, 2026 at 10:51:09AM -0700, Simon Glass wrote: >>> Hi Daniel, >>> >>> On Thu, 19 Feb 2026 at 09:51, Daniel Golle <[email protected]> wrote: >>>> On Thu, Feb 19, 2026 at 06:09:27AM -0700, Simon Glass wrote: >>>>> Hi Daniel, >>>>> >>>>> On Mon, 16 Feb 2026 at 14:22, Daniel Golle <[email protected]> wrote: >>>>>> Add a UBI volume storage backend for the image_loader framework. >>>>>> >>>>>> image_loader_init_ubi() takes a volume name, ensures the UBI device >>>>>> is attached (auto-attaching if needed), and installs a .read() callback >>>>>> wrapping ubi_volume_read(). >>>>>> >>>>>> Auto-attach works by scanning the device tree for the first MTD >>>>>> partition with compatible = "linux,ubi", then calling ubi_part() on >>>>>> that partition. The partition name is resolved using the same >>>>>> precedence as the MTD partition parser: the "label" property first, >>>>>> then "name", then the node name. Since U-Boot only supports a single >>>>>> attached UBI device at a time, only the first matching partition is >>>>>> used. If a UBI device is already attached, the auto-attach step is >>>>>> skipped. >>>>>> >>>>>> UBI handles bad-block management and wear leveling internally, so the >>>>>> read callback is a straightforward passthrough. Note that >>>>>> ubi_volume_read() returns positive errno values; the wrapper negates >>>>>> them for the image_loader convention. >>>>>> >>>>>> Gated by CONFIG_IMAGE_LOADER_UBI (depends on CMD_UBI && IMAGE_LOADER). >>>>>> >>>>>> Signed-off-by: Daniel Golle <[email protected]> >>>>>> --- >>>>>> boot/Kconfig | 8 +++ >>>>>> boot/Makefile | 1 + >>>>>> boot/image-loader-ubi.c | 112 ++++++++++++++++++++++++++++++++++++++++ >>>>>> include/image-loader.h | 13 +++++ >>>>>> 4 files changed, 134 insertions(+) >>>>>> create mode 100644 boot/image-loader-ubi.c >>>>>> >>>>>> diff --git a/boot/Kconfig b/boot/Kconfig >>>>>> index 23848a0f57e..89832014af6 100644 >>>>>> --- a/boot/Kconfig >>>>>> +++ b/boot/Kconfig >>>>>> @@ -1203,6 +1203,14 @@ config IMAGE_LOADER_MTD >>>>>> parallel NAND, etc.) using the image_loader framework. >>>>>> NAND bad blocks are skipped transparently. >>>>>> >>>>>> +config IMAGE_LOADER_UBI >>>>>> + bool "UBI volume backend for image loader" >>>>>> + depends on IMAGE_LOADER && CMD_UBI >>>>>> + help >>>>>> + Allows loading images from UBI volumes using the image_loader >>>>>> + framework. Auto-attaches the UBI device from the device tree >>>>>> + if not already attached. >>>>>> + >>>>>> config DISTRO_DEFAULTS >>>>>> bool "(deprecated) Script-based booting of Linux distributions" >>>>>> select CMDLINE >>>>>> diff --git a/boot/Makefile b/boot/Makefile >>>>>> index 1dde16db694..7d1d4a28106 100644 >>>>>> --- a/boot/Makefile >>>>>> +++ b/boot/Makefile >>>>>> @@ -76,6 +76,7 @@ obj-$(CONFIG_$(PHASE_)BOOTMETH_ANDROID) += >>>>>> bootmeth_android.o >>>>>> obj-$(CONFIG_IMAGE_LOADER) += image-loader.o >>>>>> obj-$(CONFIG_IMAGE_LOADER_BLK) += image-loader-blk.o >>>>>> obj-$(CONFIG_IMAGE_LOADER_MTD) += image-loader-mtd.o >>>>>> +obj-$(CONFIG_IMAGE_LOADER_UBI) += image-loader-ubi.o >>>>>> >>>>>> obj-$(CONFIG_$(PHASE_)BOOTMETH_VBE_ABREC) += vbe_abrec.o vbe_common.o >>>>>> obj-$(CONFIG_$(PHASE_)BOOTMETH_VBE_ABREC_FW) += vbe_abrec_fw.o >>>>>> diff --git a/boot/image-loader-ubi.c b/boot/image-loader-ubi.c >>>>>> new file mode 100644 >>>>>> index 00000000000..64901a13378 >>>>>> --- /dev/null >>>>>> +++ b/boot/image-loader-ubi.c >>>>>> @@ -0,0 +1,112 @@ >>>>>> +// SPDX-License-Identifier: GPL-2.0+ >>>>>> +/* >>>>>> + * UBI volume backend for image_loader >>>>>> + * >>>>>> + * Copyright (C) 2026 Daniel Golle <[email protected]> >>>>>> + */ >>>>>> + >>>>>> +#include <dm/ofnode.h> >>>>>> +#include <image-loader.h> >>>>>> +#include <log.h> >>>>>> +#include <malloc.h> >>>>>> +#include <mtd.h> >>>>>> +#include <ubi_uboot.h> >>>>>> + >>>>>> +struct image_loader_ubi_priv { >>>>>> + char *vol_name; >>>>>> +}; >>>>>> + >>>>>> +/** >>>>>> + * ubi_auto_attach() - attach UBI if not already attached >>>>>> + * >>>>>> + * If no UBI device is currently attached, walk the device tree for the >>>>>> + * first MTD partition node with compatible = "linux,ubi", find the >>>>>> + * corresponding MTD device by matching flash_node, and attach UBI to >>>>>> + * it via ubi_part_from_mtd(). >>>>>> + * >>>>>> + * Since U-Boot only supports a single attached UBI device at a time, >>>>>> + * only the first matching partition is used. >>>>>> + * >>>>>> + * Return: 0 on success or if already attached, negative errno on >>>>>> failure >>>>>> + */ >>>>>> +static int ubi_auto_attach(void) >>>>>> +{ >>>>>> + struct mtd_info *mtd; >>>>>> + ofnode node; >>>>>> + >>>>>> + /* Already attached? */ >>>>>> + if (ubi_devices[0]) >>>>>> + return 0; >>>>>> + >>>>>> + mtd_probe_devices(); >>>>> This should be handled by your new ubi driver for your uclass. >>>>> >>>>>> + >>>>>> + ofnode_for_each_compatible_node(node, "linux,ubi") { >>>>>> + mtd_for_each_device(mtd) { >>>>>> + if (ofnode_equal(mtd->flash_node, node)) >>>>>> + goto found; >>>>>> + } >>>>>> + } >>>>> Eek this is really strange. There should be a device so you can use >>>>> uclass_first_device(UCLASS_...). >>>> I carefully considered turning UBI devices into a UCLASS, but it would >>>> be a huge major rewrite of how UBI works in U-Boot, and while that would >>>> be a good thing to do, I consider far beyond the scope of supporting a >>>> boot method for OpenWrt. >>> Oh, I just assumed it supports driver model. But surely it must have a >>> UCLASS_BLK device? >> Sadly no. Neither UBI devices nor UBI volumes are block storage devices. >> >> Every UBI device does have a UCLASS_MTD parent device, but that >> obviously also doesn't uniquely identify the partition on the flash chip >> which is used as UBI device -- there can be (and sometimes are, for >> dual-boot/redundancy reasons) multiple UBI devices in different >> partitions on the same flash. >> >> What I ended up doing now is to move more of the UBI detection and >> enumeration logic into ubi_bootdev.c and have imagemap-ubi.c rely >> on getting the MTD device and partition index from there. > There are UBI based block storage emulation, see CONFIG_UBI_BLOCK > commits: > * 9daad11ad178646c288aca3615a7ba1e6039aed3 ("drivers: introduce UBI > block abstraction") > * aa5b67ce226267440e64fadc57d3a21e5842027c ("disk: support UBI partitions") > There is the block storage abstraction for mtd devices as well.
> >>>> Or did you mean the to-be-create UCLASS_IMAGE_MAPPER? >>> No I was talking about ubi. >>> >>> Regards, >>> Simon

