* [PATCH v2 2/5] cdev-alias: fix memory leak in diskuuid handling
2025-12-12 16:12 [PATCH v2 1/5] cdev-alias: support referencing diskuuid without child partition Ahmad Fatoum
@ 2025-12-12 16:12 ` Ahmad Fatoum
2025-12-12 16:12 ` [PATCH v2 3/5] cdev-alias: add support for storage{.removable,.builtin} Ahmad Fatoum
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Ahmad Fatoum @ 2025-12-12 16:12 UTC (permalink / raw)
To: barebox; +Cc: Ahmad Fatoum
uuid was duplicated but not free'd in error cases. Fix that.
Reviewed-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v1 -> v2:
- add Sascha's R-b
---
common/cdev-alias.c | 24 ++++++++++++++++--------
1 file changed, 16 insertions(+), 8 deletions(-)
diff --git a/common/cdev-alias.c b/common/cdev-alias.c
index 1878553615d2..3732fd90525f 100644
--- a/common/cdev-alias.c
+++ b/common/cdev-alias.c
@@ -43,12 +43,15 @@ static int cdev_alias_resolve_diskuuid(struct cdev_alias_res *cdev_alias_res,
void *data)
{
struct cdev *cdev;
- char *arg;
+ char *str, *arg;
+ int ret = 0;
- arg = xstrdup(uuid);
+ arg = str = xstrdup(uuid);
uuid = strsep(&arg, ".");
- if (!uuid || !*uuid)
- return -EINVAL;
+ if (!uuid || !*uuid) {
+ ret = -EINVAL;
+ goto out;
+ }
for_each_cdev(cdev) {
if (cdev_is_partition(cdev))
@@ -59,14 +62,19 @@ static int cdev_alias_resolve_diskuuid(struct cdev_alias_res *cdev_alias_res,
if (arg) {
cdev = cdev_find_partition(cdev, arg);
- if (!cdev)
- return -ENODEV;
+ if (!cdev) {
+ ret = -ENODEV;
+ break;
+ }
}
- return fn(cdev, data);
+ ret = fn(cdev, data);
+ break;
}
- return 0;
+out:
+ free(str);
+ return ret;
}
static struct cdev_alias_res cdev_alias_aliases[] = {
--
2.47.3
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v2 3/5] cdev-alias: add support for storage{.removable,.builtin}
2025-12-12 16:12 [PATCH v2 1/5] cdev-alias: support referencing diskuuid without child partition Ahmad Fatoum
2025-12-12 16:12 ` [PATCH v2 2/5] cdev-alias: fix memory leak in diskuuid handling Ahmad Fatoum
@ 2025-12-12 16:12 ` Ahmad Fatoum
2025-12-12 16:12 ` [PATCH v2 4/5] boot: try builtin and removable media before net for boot.default Ahmad Fatoum
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Ahmad Fatoum @ 2025-12-12 16:12 UTC (permalink / raw)
To: barebox; +Cc: Ahmad Fatoum
Our current of global.boot.default expanding to bootsource doesn't work
when booting from flash that only contains the bootloader.
Improve upon this by adding cdev aliases for removable and builtin
storage devices.
Reviewed-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v1 -> v2:
- add Sascha's R-b
- fix typo in docs and mention slotted SD-card specially (Sascha)
- extend help text for boot command (Sascha)
- replace "boot-only flash" in commit message (Sascha)
---
Documentation/user/booting-linux.rst | 26 +++++++++
commands/boot.c | 3 +
common/cdev-alias.c | 86 ++++++++++++++++++++++++++++
include/driver.h | 5 ++
4 files changed, 120 insertions(+)
diff --git a/Documentation/user/booting-linux.rst b/Documentation/user/booting-linux.rst
index b164c538c62a..6a41de6712ea 100644
--- a/Documentation/user/booting-linux.rst
+++ b/Documentation/user/booting-linux.rst
@@ -182,6 +182,32 @@ and configure the overrides as arguments to the ``boot`` command:
boot -o bootm.image=/mnt/tftp/oftree mmc
+Generic Boot Targets
+^^^^^^^^^^^^^^^^^^^^
+
+A single boot target can yield multiple entries, e.g., one for each
+bootloader spec file detected at runtime as described in the next section.
+
+There is also a number of generic default boot targets available, when
+``CONFIG_BOOT_DEFAULTS`` is enabled. These expands to a single device at most:
+
+* ``bootsource``: expands to the device barebox booted from
+* ``diskuuid.*``: expands to the device with specified ``*`` diskuuid
+
+For these targets that expand to a single device, a partition can also be specified,
+e.g., ``bootsource.esp`` to reference the partition with the ``esp`` partition
+label within the bootsource.
+
+Following target can expand to multiple devices:
+
+* ``storage.removable``: expands to removable storage devices,
+ like USB flash drives or SD-Cards in slots
+* ``storage.builtin``: expands to built-in storage devices, like eMMC
+* ``storage``: expands to all of the above ``storage.*``
+
+If the bootsource exists within any of these targets, it will be the first
+device in the returned list.
+
.. _bootloader_spec:
Boot Loader Specification
diff --git a/commands/boot.c b/commands/boot.c
index 97c574b4a0a3..9cfb7c6b0d5e 100644
--- a/commands/boot.c
+++ b/commands/boot.c
@@ -185,6 +185,9 @@ BAREBOX_CMD_HELP_TEXT("- \"bootchooser\": boot with barebox bootchooser")
#ifdef CONFIG_BOOT_DEFAULTS
BAREBOX_CMD_HELP_TEXT("- \"bootsource\": boot from the device barebox has been started from")
BAREBOX_CMD_HELP_TEXT("- \"diskuuid.*\": boot from disk with specified diskuuid")
+BAREBOX_CMD_HELP_TEXT("- \"storage.removable\": boot from removable media")
+BAREBOX_CMD_HELP_TEXT("- \"storage.builtin\": boot from non-removable media")
+BAREBOX_CMD_HELP_TEXT("- \"storage\": boot from any available media")
#endif
BAREBOX_CMD_HELP_TEXT("")
BAREBOX_CMD_HELP_TEXT("Multiple bootsources may be given which are probed in order until")
diff --git a/common/cdev-alias.c b/common/cdev-alias.c
index 3732fd90525f..82b91108c1fc 100644
--- a/common/cdev-alias.c
+++ b/common/cdev-alias.c
@@ -9,7 +9,9 @@
#include <stringlist.h>
#include <bootsource.h>
#include <driver.h>
+#include <block.h>
#include <init.h>
+#include <linux/bits.h>
struct cdev_alias_res {
const char *name;
@@ -77,9 +79,93 @@ static int cdev_alias_resolve_diskuuid(struct cdev_alias_res *cdev_alias_res,
return ret;
}
+#define STORAGE_REMOVABLE BIT(0)
+#define STORAGE_BUILTIN BIT(1)
+
+/**
+ * call_for_each_storage() - invoke callback for each storage medium
+ *
+ * @fn: callback to invoke
+ * @data: callback-specific data
+ * @filter: OR-ed types of STORAGE_* to filter for
+ * @only_bootsource: If true, include only bootsource if available,
+ * otherwise omit always
+ * Return: number of successful callback invocations or a negative error
+ */
+static int call_for_each_storage(cdev_alias_processor_t fn,
+ void *data,
+ unsigned filter,
+ bool only_bootsource)
+{
+ struct cdev *cdev, *bootcdev;
+ int ret, nmatches = 0;
+
+ bootcdev = bootsource_of_cdev_find();
+
+ for_each_cdev(cdev) {
+ struct block_device *bdev;
+
+ if (!cdev_is_storage(cdev) || cdev_is_partition(cdev))
+ continue;
+
+ bdev = cdev_get_block_device(cdev);
+
+ if (((filter & STORAGE_REMOVABLE) && bdev && bdev->removable) ||
+ ((filter & STORAGE_BUILTIN) && (!bdev || !bdev->removable))) {
+ if (only_bootsource && cdev != bootcdev)
+ continue;
+ if (!only_bootsource && cdev == bootcdev)
+ continue;
+
+ ret = fn(cdev, data);
+ if (ret < 0)
+ return ret;
+ nmatches++;
+
+ /* Got our bootsource, no need to continue iteration */
+ if (only_bootsource)
+ break;
+ }
+ }
+
+ return nmatches;
+}
+
+static int cdev_alias_resolve_storage(struct cdev_alias_res *cdev_alias_res,
+ const char *class,
+ cdev_alias_processor_t fn,
+ void *data)
+{
+ struct cdev *bootcdev;
+ unsigned filter = 0;
+ int bootsource, nmatches;
+
+ if (!class)
+ filter = ~0;
+ else if (streq_ptr(class, "removable"))
+ filter |= STORAGE_REMOVABLE;
+ else if (streq_ptr(class, "builtin"))
+ filter |= STORAGE_BUILTIN;
+ else
+ return -EINVAL;
+
+ bootcdev = bootsource_of_cdev_find();
+
+ bootsource = call_for_each_storage(fn, data, filter, true);
+ if (bootsource < 0)
+ return bootsource;
+
+ nmatches = call_for_each_storage(fn, data, filter, false);
+ if (nmatches < 0)
+ return nmatches;
+
+ return bootsource + nmatches;
+}
+
static struct cdev_alias_res cdev_alias_aliases[] = {
{ "bootsource", cdev_alias_resolve_bootsource },
{ "diskuuid", cdev_alias_resolve_diskuuid },
+ { "storage", cdev_alias_resolve_storage },
{ /* sentinel */}
};
diff --git a/include/driver.h b/include/driver.h
index a941ca6127e6..de5a63c379eb 100644
--- a/include/driver.h
+++ b/include/driver.h
@@ -597,6 +597,11 @@ get_inheritable_devfs_flags(const struct cdev *parent_cdev)
return parent_cdev->flags & DEVFS_INHERITABLE_FLAGS;
}
+static inline bool cdev_is_storage(const struct cdev *cdev)
+{
+ return (cdev->flags & DEVFS_IS_BLOCK_DEV) || cdev->mtd;
+}
+
struct cdev *
cdev_find_child_by_gpt_typeuuid(struct cdev *cdev, const guid_t *typeuuid);
--
2.47.3
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v2 4/5] boot: try builtin and removable media before net for boot.default
2025-12-12 16:12 [PATCH v2 1/5] cdev-alias: support referencing diskuuid without child partition Ahmad Fatoum
2025-12-12 16:12 ` [PATCH v2 2/5] cdev-alias: fix memory leak in diskuuid handling Ahmad Fatoum
2025-12-12 16:12 ` [PATCH v2 3/5] cdev-alias: add support for storage{.removable,.builtin} Ahmad Fatoum
@ 2025-12-12 16:12 ` Ahmad Fatoum
2025-12-12 16:12 ` [PATCH v2 5/5] boot: assign names to bootentry providers Ahmad Fatoum
2025-12-15 8:15 ` [PATCH v2 1/5] cdev-alias: support referencing diskuuid without child partition Sascha Hauer
4 siblings, 0 replies; 6+ messages in thread
From: Ahmad Fatoum @ 2025-12-12 16:12 UTC (permalink / raw)
To: barebox; +Cc: Ahmad Fatoum
This is the same sequence to automatically probe the environment, so it
makes sense that the automatic boot order would follow.
Reviewed-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v1 -> v2:
- add Sascha's R-b
---
common/boot.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/common/boot.c b/common/boot.c
index 07bd288df29d..14525d31ae2d 100644
--- a/common/boot.c
+++ b/common/boot.c
@@ -137,6 +137,8 @@ static int init_boot(void)
if (!global_boot_default)
global_boot_default = xstrdup(
IF_ENABLED(CONFIG_BOOT_DEFAULTS, "bootsource ")
+ IF_ENABLED(CONFIG_BOOT_DEFAULTS, "storage.builtin ")
+ IF_ENABLED(CONFIG_BOOT_DEFAULTS, "storage.removable ")
"net"
);
--
2.47.3
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v2 5/5] boot: assign names to bootentry providers
2025-12-12 16:12 [PATCH v2 1/5] cdev-alias: support referencing diskuuid without child partition Ahmad Fatoum
` (2 preceding siblings ...)
2025-12-12 16:12 ` [PATCH v2 4/5] boot: try builtin and removable media before net for boot.default Ahmad Fatoum
@ 2025-12-12 16:12 ` Ahmad Fatoum
2025-12-15 8:15 ` [PATCH v2 1/5] cdev-alias: support referencing diskuuid without child partition Sascha Hauer
4 siblings, 0 replies; 6+ messages in thread
From: Ahmad Fatoum @ 2025-12-12 16:12 UTC (permalink / raw)
To: barebox; +Cc: Ahmad Fatoum
This allows board- or functionality-specific (like EFI loader support)
to invoke a specific bootentry provider by name.
Reviewed-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
v1 -> v2:
- add Sascha's R-b
---
arch/arm/boards/protonic-imx6/board.c | 1 +
common/blspec.c | 1 +
common/boot.c | 15 +++++++++++++++
common/bootchooser.c | 1 +
common/bootdef.c | 1 +
include/boot.h | 2 ++
6 files changed, 21 insertions(+)
diff --git a/arch/arm/boards/protonic-imx6/board.c b/arch/arm/boards/protonic-imx6/board.c
index 80558ce15817..c15a349c8a88 100644
--- a/arch/arm/boards/protonic-imx6/board.c
+++ b/arch/arm/boards/protonic-imx6/board.c
@@ -461,6 +461,7 @@ static int prt_imx6_bootentry_generate(struct bootentries *bootentries,
}
static struct bootentry_provider prt_imx6_bootentry_provider = {
+ .name = "prt-imx6",
.generate = prt_imx6_bootentry_generate,
};
diff --git a/common/blspec.c b/common/blspec.c
index bc2c3204ad62..624e4c115272 100644
--- a/common/blspec.c
+++ b/common/blspec.c
@@ -639,6 +639,7 @@ static int blspec_bootentry_generate(struct bootentries *bootentries,
}
static struct bootentry_provider blspec_bootentry_provider = {
+ .name = "blspec",
.generate = blspec_bootentry_generate,
};
diff --git a/common/boot.c b/common/boot.c
index 14525d31ae2d..1059e6d995d3 100644
--- a/common/boot.c
+++ b/common/boot.c
@@ -288,6 +288,21 @@ int bootentry_register_provider(struct bootentry_provider *p)
return 0;
}
+struct bootentry_provider *get_bootentry_provider(const char *name)
+{
+ struct bootentry_provider *p;
+
+ if (!name)
+ return NULL;
+
+ list_for_each_entry(p, &bootentry_providers, list) {
+ if (streq_ptr(p->name, name))
+ return p;
+ }
+
+ return NULL;
+}
+
/*
* nfs_find_mountpath - Check if a given url is already mounted
*/
diff --git a/common/bootchooser.c b/common/bootchooser.c
index a79eee8ca2c4..2905a0ca677e 100644
--- a/common/bootchooser.c
+++ b/common/bootchooser.c
@@ -962,6 +962,7 @@ static int bootchooser_add_entry(struct bootentries *entries, const char *name)
}
static struct bootentry_provider bootchooser_entry_provider = {
+ .name = "bootchooser",
.generate = bootchooser_add_entry,
};
diff --git a/common/bootdef.c b/common/bootdef.c
index e8140d3a6bce..85471d92d3c5 100644
--- a/common/bootdef.c
+++ b/common/bootdef.c
@@ -31,6 +31,7 @@ static int bootdef_add_entry(struct bootentries *entries, const char *name)
}
static struct bootentry_provider bootdef_entry_provider = {
+ .name = "bootdef",
.generate = bootdef_add_entry,
};
diff --git a/include/boot.h b/include/boot.h
index c1676364cadc..ae32b9ead93f 100644
--- a/include/boot.h
+++ b/include/boot.h
@@ -26,12 +26,14 @@ struct bootentry {
int bootentries_add_entry(struct bootentries *entries, struct bootentry *entry);
struct bootentry_provider {
+ const char *name;
int (*generate)(struct bootentries *bootentries, const char *name);
/* internal fields */
struct list_head list;
};
int bootentry_register_provider(struct bootentry_provider *provider);
+struct bootentry_provider *get_bootentry_provider(const char *name);
#define bootentries_for_each_entry(bootentries, entry) \
list_for_each_entry(entry, &bootentries->entries, list)
--
2.47.3
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH v2 1/5] cdev-alias: support referencing diskuuid without child partition
2025-12-12 16:12 [PATCH v2 1/5] cdev-alias: support referencing diskuuid without child partition Ahmad Fatoum
` (3 preceding siblings ...)
2025-12-12 16:12 ` [PATCH v2 5/5] boot: assign names to bootentry providers Ahmad Fatoum
@ 2025-12-15 8:15 ` Sascha Hauer
4 siblings, 0 replies; 6+ messages in thread
From: Sascha Hauer @ 2025-12-15 8:15 UTC (permalink / raw)
To: barebox, Ahmad Fatoum
On Fri, 12 Dec 2025 17:12:49 +0100, Ahmad Fatoum wrote:
> This is already the case with other cdev aliases, so support this for
> symmetry.
>
>
Applied, thanks!
[1/5] cdev-alias: support referencing diskuuid without child partition
https://git.pengutronix.de/cgit/barebox/commit/?id=b28aceb6fae3 (link may not be stable)
[2/5] cdev-alias: fix memory leak in diskuuid handling
https://git.pengutronix.de/cgit/barebox/commit/?id=83de9a01b3d6 (link may not be stable)
[3/5] cdev-alias: add support for storage{.removable,.builtin}
https://git.pengutronix.de/cgit/barebox/commit/?id=87435167bbbb (link may not be stable)
[4/5] boot: try builtin and removable media before net for boot.default
https://git.pengutronix.de/cgit/barebox/commit/?id=8fdf60abc9a5 (link may not be stable)
[5/5] boot: assign names to bootentry providers
https://git.pengutronix.de/cgit/barebox/commit/?id=c91ccf730129 (link may not be stable)
Best regards,
--
Sascha Hauer <s.hauer@pengutronix.de>
^ permalink raw reply [flat|nested] 6+ messages in thread