public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
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: Tue, 24 Feb 2026 01:06:30 +0000	[thread overview]
Message-ID: <aZz5lj7URFZc86xK@makrotopia.org> (raw)
In-Reply-To: <5ade655f-b2df-4cb2-89ea-752b2958eca3@iopsys.eu>

On Tue, Feb 24, 2026 at 03:40:47AM +0300, Mikhail Kshevetskiy wrote:
> 
> On 2/24/26 03:12, Daniel Golle wrote:
> > On Mon, Feb 23, 2026 at 10:32:32PM +0300, Mikhail Kshevetskiy wrote:
> >> On 2/23/26 22:30, Mikhail Kshevetskiy wrote:
> >>> 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.
> > During my evening walk outside I thought about this a bit more, and if
> > it would be possible to use the ubiblock and mtdblock devices instead of
> > introducing dedicated bootdevs and imagemap backends for both of them.
> > In the simple case of only a single boot option this would probably
> > work: bootmeth_openwrt detects the uImage.FIT on the raw block device
> > and may go ahead, load and launch it.
> >
> > However, there is often more than one of them. And as they are stored in
> > directly on MTD partitions or UBI volumes, knowing the name of the
> > partition or volume, and which device it sits on is crucial for
> > bootmeth_openwrt, which should support also complex multi-slot dual-boot
> > arrangement, typically identifying the slots by UBI volume name or MTD
> > partition name. When using the mtdblock or ubiblock devices this
> > information is hidden, and can only be accessed in a very tricky way,
> > especially for ubiblock devices, which lack a device parent. Matching
> > the UCLASS type of the device parent of a block device in the bootmeth
> > also feels sketchy and inappropriate.
> 
> what about querying available partitions using the command 'read' way?

Please explain how you imagine that to work. I mean, sure, we can read
them, and then we know that they contain an uImage.FIT.

mtdblock and ubiblock devices are generally whole-disk devices, each
representing the backing MTD partition or UBI volume.

So first of all, ubiblock devices in U-Boot only exist for already
attached UBI devices, and only one UBI devices can be attached at a
time.

Apart from that problem (which would limit bootmeth_openwrt to operate
on exactly one, and already attached UBI device, which is unfortunate,
but not a complete show-stopper), there are often more than one UBI
volumes holding an uImage.FIT blob. They can be identified by the
out-of-band metadata, ie. the UBI volume name (or MTD partition label),
typically "production" and "recovery", you get the idea, right?
They **cannot** be identified by inband metadata (ie. anything you could
read from inside that volume). While (in theory) we could add metadata
to identify and distinguis "production" from "recovery" images, this
(by definition) isn't possible in case of a symmetric A/B dual boot
arrangement. Also, what I'm creating here is not a new design from
scratch, but rather the formalization of a historically grown
reality, present on countless consumer-grade devices out there.
Making fundamental changes to the design (such as carrying additional
metadata within the firmware image itself, instead of relying on
out-of-band metadata like the MTD partition label or UBI volume name)
will make the newly introduced bootmeth_openwrt de-facto incompatible
with all existing OpenWrt devices out there -- and compatibility is an
important part and purpose of the exercise.

Hence, the user (or the bootmeth) need to identify which of the available
UBI volumes or MTD partitions the system should boot from, and do so
using aforementioned out-of-band, storage-type-specific metadata.

Now, assuming that I'd have to use the ubiblock (for example), the only
way to get back to those crucial bits of metadata would be to traverse
from the blk device to the parent udevice, checking whether it's of type
UCLASS_MTD and if the blk's type is part_type PART_TYPE_UBI, and then
interpreting block_dev->hwpart as the volume name. Imho that's an overly
intrusive operation, messing with the block_dev and ubi subsystem
internals which should not be touched from outside of the respective
subsystems.

For mtdblock devices it's even much worse, I'd have to cast bdev's priv
back into struct mtd_info in order to get to the partition label, and
that feels extremely wrong (arguably, we could patch mtdblock.c to also
set the hwpart string, but even that would still be more of a hack than
actually being correct imho).

> 
> > So while having mtdblock and ubiblock devices is generally nice,
> > especially if U-Boot has to access a filesystem (eg. squashfs) stored on
> > them, for the case of OpenWrt it would at least be a bit ugly, as the
> > metadata of the actual storage backend (MTD or UBI) is crucial. We need
> > the UBI volume name or the label of the MTD partition.
> >
> > In a way you could say that OpenWrt uses block devices (eg. MMC) it
> > boots from more like MTD, and not the other way around. And in some way,
> > bootmeth_openwrt will do some extra lifting when started on a block
> > device (extract the GPT partition name and present it as the bootflow's
> > fname), while the imagemap API provides an abstraction to read raw
> > images from all three storage backends (blk, mtd, ubi).
> >
> > That being said, I'm happy we have overcome things like block2mtd or
> > gluebi, and do use the appropriate APIs (and filesystem types) on each
> > class of storage devices in OpenWrt nowadays. Some of the helpful
> > patterns borrowed from our MTD and UBI boot flows (avoiding a boot
> > filesystem, identifying storage volumes, ...) remain, however, and are
> > applied equally also on block storage (ie. MMC).
> >
> > tl;dr: We'd rather use block2mtd than using mtdblock ;)

  reply	other threads:[~2026-02-24  1: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 [this message]
2026-02-23 20:06             ` Daniel Golle
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=aZz5lj7URFZc86xK@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