mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 1/5] cdev-alias: support referencing diskuuid without child partition
@ 2025-12-11 21:00 Ahmad Fatoum
  2025-12-11 21:00 ` [PATCH 2/5] cdev-alias: fix memory leak in diskuuid handling Ahmad Fatoum
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Ahmad Fatoum @ 2025-12-11 21:00 UTC (permalink / raw)
  To: barebox; +Cc: Ahmad Fatoum

This is already the case with other cdev aliases, so support this for
symmetry.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 common/cdev-alias.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/common/cdev-alias.c b/common/cdev-alias.c
index e5a059ad7f4d..1878553615d2 100644
--- a/common/cdev-alias.c
+++ b/common/cdev-alias.c
@@ -57,9 +57,11 @@ static int cdev_alias_resolve_diskuuid(struct cdev_alias_res *cdev_alias_res,
 		if (strcasecmp(cdev->diskuuid, uuid))
 			continue;
 
-		cdev = cdev_find_partition(cdev, arg);
-		if (!cdev)
-			return -ENODEV;
+		if (arg) {
+			cdev = cdev_find_partition(cdev, arg);
+			if (!cdev)
+				return -ENODEV;
+		}
 
 		return fn(cdev, data);
 	}
-- 
2.47.3




^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH 2/5] cdev-alias: fix memory leak in diskuuid handling
  2025-12-11 21:00 [PATCH 1/5] cdev-alias: support referencing diskuuid without child partition Ahmad Fatoum
@ 2025-12-11 21:00 ` Ahmad Fatoum
  2025-12-11 21:00 ` [PATCH 3/5] cdev-alias: add support for storage{.removable,.builtin} Ahmad Fatoum
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 7+ messages in thread
From: Ahmad Fatoum @ 2025-12-11 21:00 UTC (permalink / raw)
  To: barebox; +Cc: Ahmad Fatoum

uuid was duplicated but not free'd in error cases. Fix that.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 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] 7+ messages in thread

* [PATCH 3/5] cdev-alias: add support for storage{.removable,.builtin}
  2025-12-11 21:00 [PATCH 1/5] cdev-alias: support referencing diskuuid without child partition Ahmad Fatoum
  2025-12-11 21:00 ` [PATCH 2/5] cdev-alias: fix memory leak in diskuuid handling Ahmad Fatoum
@ 2025-12-11 21:00 ` Ahmad Fatoum
  2025-12-12  8:32   ` Sascha Hauer
  2025-12-11 21:00 ` [PATCH 4/5] boot: try builtin and removable media before net for boot.default Ahmad Fatoum
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 7+ messages in thread
From: Ahmad Fatoum @ 2025-12-11 21:00 UTC (permalink / raw)
  To: barebox; +Cc: Ahmad Fatoum

Our current of global.boot.default expanding to bootsource doesn't work
when booting from boot-only flash. Improve upon this by adding cdev
aliases for removable and builtin storage devices.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 Documentation/user/booting-linux.rst | 25 ++++++++
 common/cdev-alias.c                  | 86 ++++++++++++++++++++++++++++
 include/driver.h                     |  5 ++
 3 files changed, 116 insertions(+)

diff --git a/Documentation/user/booting-linux.rst b/Documentation/user/booting-linux.rst
index b164c538c62a..f1df5ee2bbf0 100644
--- a/Documentation/user/booting-linux.rst
+++ b/Documentation/user/booting-linux.rst
@@ -182,6 +182,31 @@ 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 built-in storage devices, like USB sticks
+* ``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/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] 7+ messages in thread

* [PATCH 4/5] boot: try builtin and removable media before net for boot.default
  2025-12-11 21:00 [PATCH 1/5] cdev-alias: support referencing diskuuid without child partition Ahmad Fatoum
  2025-12-11 21:00 ` [PATCH 2/5] cdev-alias: fix memory leak in diskuuid handling Ahmad Fatoum
  2025-12-11 21:00 ` [PATCH 3/5] cdev-alias: add support for storage{.removable,.builtin} Ahmad Fatoum
@ 2025-12-11 21:00 ` Ahmad Fatoum
  2025-12-11 21:00 ` [PATCH 5/5] boot: assign names to bootentry providers Ahmad Fatoum
  2025-12-12  8:36 ` [PATCH 1/5] cdev-alias: support referencing diskuuid without child partition Sascha Hauer
  4 siblings, 0 replies; 7+ messages in thread
From: Ahmad Fatoum @ 2025-12-11 21:00 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.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 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] 7+ messages in thread

* [PATCH 5/5] boot: assign names to bootentry providers
  2025-12-11 21:00 [PATCH 1/5] cdev-alias: support referencing diskuuid without child partition Ahmad Fatoum
                   ` (2 preceding siblings ...)
  2025-12-11 21:00 ` [PATCH 4/5] boot: try builtin and removable media before net for boot.default Ahmad Fatoum
@ 2025-12-11 21:00 ` Ahmad Fatoum
  2025-12-12  8:36 ` [PATCH 1/5] cdev-alias: support referencing diskuuid without child partition Sascha Hauer
  4 siblings, 0 replies; 7+ messages in thread
From: Ahmad Fatoum @ 2025-12-11 21:00 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.

Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
---
 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] 7+ messages in thread

* Re: [PATCH 3/5] cdev-alias: add support for storage{.removable,.builtin}
  2025-12-11 21:00 ` [PATCH 3/5] cdev-alias: add support for storage{.removable,.builtin} Ahmad Fatoum
@ 2025-12-12  8:32   ` Sascha Hauer
  0 siblings, 0 replies; 7+ messages in thread
From: Sascha Hauer @ 2025-12-12  8:32 UTC (permalink / raw)
  To: Ahmad Fatoum; +Cc: barebox

On Thu, Dec 11, 2025 at 10:00:45PM +0100, Ahmad Fatoum wrote:
> Our current of global.boot.default expanding to bootsource doesn't work
> when booting from boot-only flash.

I wondered what boot-only flash is. Maybe better "flash containing only
the bootloader"

> +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 built-in storage devices, like USB sticks

s/built-in/removable/

"like USB sticks or SD cards in slots" to better differentiate against
eMMC.

> +* ``storage.builtin``: expands to built-in storage devices, like eMMC
> +* ``storage``: expands to all of the above ``storage.*``

These are explained in the boot command help text. Please add these new
targets there as well.

Sascha

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH 1/5] cdev-alias: support referencing diskuuid without child partition
  2025-12-11 21:00 [PATCH 1/5] cdev-alias: support referencing diskuuid without child partition Ahmad Fatoum
                   ` (3 preceding siblings ...)
  2025-12-11 21:00 ` [PATCH 5/5] boot: assign names to bootentry providers Ahmad Fatoum
@ 2025-12-12  8:36 ` Sascha Hauer
  4 siblings, 0 replies; 7+ messages in thread
From: Sascha Hauer @ 2025-12-12  8:36 UTC (permalink / raw)
  To: Ahmad Fatoum; +Cc: barebox

Apart from the comments I made, for this series:

Reviewed-by: Sascha Hauer <s.hauer@pengutrinix.de>

On Thu, Dec 11, 2025 at 10:00:43PM +0100, Ahmad Fatoum wrote:
> This is already the case with other cdev aliases, so support this for
> symmetry.
> 
> Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
> ---
>  common/cdev-alias.c | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/common/cdev-alias.c b/common/cdev-alias.c
> index e5a059ad7f4d..1878553615d2 100644
> --- a/common/cdev-alias.c
> +++ b/common/cdev-alias.c
> @@ -57,9 +57,11 @@ static int cdev_alias_resolve_diskuuid(struct cdev_alias_res *cdev_alias_res,
>  		if (strcasecmp(cdev->diskuuid, uuid))
>  			continue;
>  
> -		cdev = cdev_find_partition(cdev, arg);
> -		if (!cdev)
> -			return -ENODEV;
> +		if (arg) {
> +			cdev = cdev_find_partition(cdev, arg);
> +			if (!cdev)
> +				return -ENODEV;
> +		}
>  
>  		return fn(cdev, data);
>  	}
> -- 
> 2.47.3
> 
> 
> 

-- 
Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | http://www.pengutronix.de/  |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |



^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2025-12-12  8:37 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-12-11 21:00 [PATCH 1/5] cdev-alias: support referencing diskuuid without child partition Ahmad Fatoum
2025-12-11 21:00 ` [PATCH 2/5] cdev-alias: fix memory leak in diskuuid handling Ahmad Fatoum
2025-12-11 21:00 ` [PATCH 3/5] cdev-alias: add support for storage{.removable,.builtin} Ahmad Fatoum
2025-12-12  8:32   ` Sascha Hauer
2025-12-11 21:00 ` [PATCH 4/5] boot: try builtin and removable media before net for boot.default Ahmad Fatoum
2025-12-11 21:00 ` [PATCH 5/5] boot: assign names to bootentry providers Ahmad Fatoum
2025-12-12  8:36 ` [PATCH 1/5] cdev-alias: support referencing diskuuid without child partition Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox