From: Daniel Golle <daniel@makrotopia.org>
To: Mikhail Kshevetskiy <mikhail.kshevetskiy@iopsys.eu>
Cc: "Simon Glass" <sjg@chromium.org>, "Tom Rini" <trini@konsulko.com>,
"Quentin Schulz" <quentin.schulz@cherry.de>,
"Kory Maincent" <kory.maincent@bootlin.com>,
"Mattijs Korpershoek" <mkorpershoek@kernel.org>,
"Martin Schwan" <m.schwan@phytec.de>,
"Anshul Dalal" <anshuld@ti.com>,
"Ilias Apalodimas" <ilias.apalodimas@linaro.org>,
"Sughosh Ganu" <sughosh.ganu@arm.com>,
"Aristo Chen" <jj251510319013@gmail.com>,
"牛 志宏" <Zone.Niuzh@hotmail.com>,
"Marek Vasut" <marek.vasut+renesas@mailbox.org>,
"Heinrich Schuchardt" <xypron.glpk@gmx.de>,
"Wolfgang Wallner" <wolfgang.wallner@at.abb.com>,
"Frank Wunderlich" <frank-w@public-files.de>,
"David Lechner" <dlechner@baylibre.com>,
"Osama Abdelkader" <osama.abdelkader@gmail.com>,
"Michael Trimarchi" <michael@amarulasolutions.com>,
"Miquel Raynal" <miquel.raynal@bootlin.com>,
"Andrew Goodbody" <andrew.goodbody@linaro.org>,
"Yegor Yefremov" <yegorslists@googlemail.com>,
"Mike Looijmans" <mike.looijmans@topic.nl>,
"Weijie Gao" <weijie.gao@mediatek.com>,
"Alexander Stein" <alexander.stein@ew.tq-group.com>,
"Neil Armstrong" <neil.armstrong@linaro.org>,
"Mayuresh Chitale" <mchitale@ventanamicro.com>,
"Paul HENRYS" <paul.henrys_ext@softathome.com>,
u-boot@lists.denx.de, "John Crispin" <john@phrozen.org>,
"Paul Spooren" <mail@aparcar.org>
Subject: Re: [RFC PATCH 08/20] boot: image-loader: add UBI volume backend
Date: Mon, 23 Feb 2026 20:06:36 +0000 [thread overview]
Message-ID: <aZyzTP6tmg1OGjU3@makrotopia.org> (raw)
In-Reply-To: <a1d06225-bc17-411a-80ed-f39e0450dc29@iopsys.eu>
On Mon, Feb 23, 2026 at 10:30:03PM +0300, 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 <daniel@makrotopia.org> 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 <daniel@makrotopia.org> 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 <daniel@makrotopia.org>
> >>>>> ---
> >>>>> 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 <daniel@makrotopia.org>
> >>>>> + */
> >>>>> +
> >>>>> +#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")
Yes, but that also only works once the UBI device is already attached.
Before that, and for any UBI device not currently attached, there aren't
any UBI_BLOCK devices. However, in both cases we'd also need to scan
them for volumes to be presented as potential bootdevs.
next prev parent reply other threads:[~2026-02-23 20:07 UTC|newest]
Thread overview: 88+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-16 21:21 [RFC PATCH 00/20] boot: add OpenWrt boot method and on-demand FIT loading Daniel Golle
2026-02-16 21:21 ` [RFC PATCH 01/20] boot: add image_loader on-demand loading abstraction Daniel Golle
2026-02-19 13:09 ` Simon Glass
2026-02-16 21:21 ` [RFC PATCH 02/20] boot: image-loader: add block device backend Daniel Golle
2026-02-19 13:09 ` Simon Glass
2026-02-16 21:21 ` [RFC PATCH 03/20] mtd: add mtd_read_skip_bad() helper Daniel Golle
2026-02-16 21:21 ` [RFC PATCH 04/20] boot: image-loader: add MTD backend Daniel Golle
2026-02-16 21:21 ` [RFC PATCH 05/20] cmd: ubi: export ubi_find_volume() Daniel Golle
2026-02-19 13:09 ` Simon Glass
2026-02-16 21:22 ` [RFC PATCH 06/20] mtd: set flash_node on DT-created partitions Daniel Golle
2026-02-16 21:22 ` [RFC PATCH 07/20] cmd: ubi: add ubi_part_from_mtd() Daniel Golle
2026-02-16 21:22 ` [RFC PATCH 08/20] boot: image-loader: add UBI volume backend Daniel Golle
2026-02-19 13:09 ` Simon Glass
2026-02-19 16:51 ` Daniel Golle
2026-02-23 17:51 ` Simon Glass
2026-02-23 19:24 ` Daniel Golle
2026-02-23 19:30 ` Mikhail Kshevetskiy
2026-02-23 19:32 ` Mikhail Kshevetskiy
2026-02-24 0:12 ` Daniel Golle
2026-02-24 0:40 ` Mikhail Kshevetskiy
2026-02-24 1:06 ` Daniel Golle
2026-02-23 20:06 ` Daniel Golle [this message]
2026-02-16 21:22 ` [RFC PATCH 09/20] boot: fit: support on-demand loading in fit_image_load() Daniel Golle
2026-02-19 13:09 ` Simon Glass
2026-02-19 16:47 ` Daniel Golle
2026-02-23 17:51 ` Simon Glass
2026-02-24 12:41 ` Daniel Golle
2026-02-16 21:22 ` [RFC PATCH 10/20] cmd: bootm: accept storage device as image source Daniel Golle
2026-02-19 13:09 ` Simon Glass
2026-02-16 21:22 ` [RFC PATCH 11/20] test: boot: add image_loader unit tests Daniel Golle
2026-02-17 19:05 ` Tom Rini
2026-02-19 13:10 ` Simon Glass
2026-02-19 14:04 ` Tom Rini
2026-02-19 14:34 ` Simon Glass
2026-02-19 15:41 ` Tom Rini
2026-02-16 21:23 ` [RFC PATCH 12/20] doc: bootm: document direct storage boot Daniel Golle
2026-02-16 21:23 ` [RFC PATCH 13/20] boot: bootmeth: add OpenWrt boot method skeleton Daniel Golle
2026-02-19 13:09 ` Simon Glass
2026-02-19 14:00 ` Tom Rini
2026-02-19 14:31 ` Simon Glass
2026-02-19 15:31 ` Tom Rini
2026-02-19 16:52 ` Daniel Golle
2026-02-16 21:23 ` [RFC PATCH 14/20] boot: bootmeth: openwrt: implement read_bootflow for block devices Daniel Golle
2026-02-19 13:09 ` Simon Glass
2026-02-16 21:23 ` [RFC PATCH 15/20] boot: bootmeth: openwrt: implement boot via bootm storage path Daniel Golle
2026-02-19 13:09 ` Simon Glass
2026-02-16 21:23 ` [RFC PATCH 16/20] boot: bootdev: add MTD boot device Daniel Golle
2026-02-19 13:09 ` Simon Glass
2026-02-16 21:24 ` [RFC PATCH 17/20] boot: bootdev: add UBI " Daniel Golle
2026-02-19 13:09 ` Simon Glass
2026-02-19 16:56 ` Daniel Golle
2026-02-23 17:51 ` Simon Glass
2026-02-16 21:24 ` [RFC PATCH 18/20] boot: bootmeth: openwrt: support MTD and UBI bootdevs Daniel Golle
2026-02-19 13:09 ` Simon Glass
2026-02-16 21:24 ` [RFC PATCH 19/20] boot: bootmeth: openwrt: add openwrt_boot_script hook for bootconf Daniel Golle
2026-02-19 13:11 ` Simon Glass
2026-02-16 21:24 ` [RFC PATCH 20/20] boot: bootmeth: openwrt: add slot configuration from environment Daniel Golle
2026-02-19 13:11 ` Simon Glass
2026-02-16 22:16 ` [RFC PATCH 00/20] boot: add OpenWrt boot method and on-demand FIT loading Marek Vasut
2026-02-17 1:18 ` Daniel Golle
2026-02-17 2:04 ` Marek Vasut
2026-02-17 13:02 ` Daniel Golle
2026-02-17 19:15 ` Tom Rini
2026-02-17 13:32 ` Simon Glass
2026-02-17 15:08 ` Tom Rini
2026-02-17 17:46 ` Tom Rini
2026-02-23 19:32 ` Tom Rini
2026-02-24 11:57 ` Daniel Golle
2026-02-24 17:24 ` Tom Rini
2026-02-25 14:34 ` Daniel Golle
2026-02-25 22:16 ` Tom Rini
2026-02-25 23:49 ` Daniel Golle
2026-02-26 18:45 ` Tom Rini
2026-02-26 23:44 ` Simon Glass
2026-02-17 18:13 ` Tom Rini
2026-02-17 19:28 ` Daniel Golle
2026-02-17 19:35 ` Tom Rini
2026-02-17 21:07 ` Daniel Golle
2026-02-17 21:18 ` Tom Rini
[not found] ` <aZTqyRfqYe1iJ9EY@makrotopia.org>
2026-02-18 15:58 ` Tom Rini
2026-02-18 17:25 ` Daniel Golle
2026-02-18 20:33 ` Tom Rini
2026-02-24 0:37 ` Daniel Golle
2026-02-24 14:24 ` Tom Rini
2026-02-24 14:36 ` Daniel Golle
2026-02-18 23:08 ` Daniel Golle
2026-02-19 15:29 ` Tom Rini
2026-02-17 19:20 ` Tom Rini
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aZyzTP6tmg1OGjU3@makrotopia.org \
--to=daniel@makrotopia.org \
--cc=Zone.Niuzh@hotmail.com \
--cc=alexander.stein@ew.tq-group.com \
--cc=andrew.goodbody@linaro.org \
--cc=anshuld@ti.com \
--cc=dlechner@baylibre.com \
--cc=frank-w@public-files.de \
--cc=ilias.apalodimas@linaro.org \
--cc=jj251510319013@gmail.com \
--cc=john@phrozen.org \
--cc=kory.maincent@bootlin.com \
--cc=m.schwan@phytec.de \
--cc=mail@aparcar.org \
--cc=marek.vasut+renesas@mailbox.org \
--cc=mchitale@ventanamicro.com \
--cc=michael@amarulasolutions.com \
--cc=mike.looijmans@topic.nl \
--cc=mikhail.kshevetskiy@iopsys.eu \
--cc=miquel.raynal@bootlin.com \
--cc=mkorpershoek@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=osama.abdelkader@gmail.com \
--cc=paul.henrys_ext@softathome.com \
--cc=quentin.schulz@cherry.de \
--cc=sjg@chromium.org \
--cc=sughosh.ganu@arm.com \
--cc=trini@konsulko.com \
--cc=u-boot@lists.denx.de \
--cc=weijie.gao@mediatek.com \
--cc=wolfgang.wallner@at.abb.com \
--cc=xypron.glpk@gmx.de \
--cc=yegorslists@googlemail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox