[PATCH 1/2] bootsource: add bootsource instance index variable
Fabian Pfitzner
f.pfitzner at pengutronix.de
Wed May 20 01:32:59 PDT 2026
The bootsource instance index variable shows us,
from which image on the instance we have booted from.
This is a useful information, when there a multiple boot images contained
on one flash (e. g. primary and recovery).
Add a C interface to set and get the bootsource instance:
int bootsource_get_instance_index(void);
void bootsource_set_instance_index(int index);
Also export the shell variable "bootsource_instance_index".
Signed-off-by: Fabian Pfitzner <f.pfitzner at pengutronix.de>
---
Documentation/user/variables.rst | 1 +
common/bootsource.c | 20 ++++++++++++++++++++
include/bootsource.h | 11 +++++++++++
3 files changed, 32 insertions(+)
diff --git a/Documentation/user/variables.rst b/Documentation/user/variables.rst
index 61808f1d72de29477b02b53ad11ecf530b4ebc80..c8b34679068cff4356fec306942b85561187652f 100644
--- a/Documentation/user/variables.rst
+++ b/Documentation/user/variables.rst
@@ -112,6 +112,7 @@ of all active variables with special meaning along with a short description:
bootargs Linux Kernel parameters
bootsource The source barebox has been booted from
bootsource_instance The instance of the source barebox has been booted from
+ bootsource_instance_index Tells us whether we have booted from primary(0) or secondary(1)
global.boot.default default boot order
...
diff --git a/common/bootsource.c b/common/bootsource.c
index f608019bb758f820eea19213c75b389df6b4158c..53549d4171ff33bfcdd7436261cd8f4d3598099a 100644
--- a/common/bootsource.c
+++ b/common/bootsource.c
@@ -33,6 +33,7 @@ static const char *bootsource_str[BOOTSOURCE_MAX] = {
static enum bootsource bootsource = BOOTSOURCE_UNKNOWN;
static int bootsource_instance = BOOTSOURCE_INSTANCE_UNKNOWN;
+static int bootsource_instance_index = BOOTSOURCE_INSTANCE_INDEX_UNKNOWN;
const char *bootsource_to_string(enum bootsource src)
{
@@ -226,6 +227,17 @@ int bootsource_set(enum bootsource src, int instance)
return alias_id;
}
+void bootsource_set_instance_index(int index)
+{
+ if (index < 0 || index > 1)
+ pr_err("Invalid index: %d, expected either 0 or 1", index);
+
+ char str[1];
+
+ sprintf(str, "%d", index);
+ setenv("bootsource_instance_index", str);
+}
+
enum bootsource bootsource_get(void)
{
return bootsource;
@@ -240,11 +252,19 @@ int bootsource_get_instance(void)
BAREBOX_MAGICVAR(bootsource_instance, "The instance of the source barebox has been booted from");
+int bootsource_get_instance_index(void)
+{
+ return bootsource_instance_index;
+}
+
+BAREBOX_MAGICVAR(bootsource_instance_index, "Tells us whether we have booted from primary(0) or secondary(1)");
+
static int bootsource_init(void)
{
bootsource_set_raw(bootsource, bootsource_instance);
export("bootsource");
export("bootsource_instance");
+ export("bootsource_instance_index");
return 0;
}
diff --git a/include/bootsource.h b/include/bootsource.h
index 0d3cb7a333075305a6ae4ee24a66163fe2fa0360..fc53e2e345b87333120cb82b030b37a882e201c0 100644
--- a/include/bootsource.h
+++ b/include/bootsource.h
@@ -24,11 +24,13 @@ enum bootsource {
};
#define BOOTSOURCE_INSTANCE_UNKNOWN -1
+#define BOOTSOURCE_INSTANCE_INDEX_UNKNOWN -1
enum bootsource bootsource_get(void);
enum bootsource bootsource_get_device(void);
int bootsource_get_instance(void);
const char *bootsource_get_alias_name(void);
+int bootsource_get_instance_index(void);
const char *bootsource_to_string(enum bootsource src);
const char *bootsource_get_alias_stem(enum bootsource bs);
int bootsource_of_alias_xlate(enum bootsource bs, int instance);
@@ -72,4 +74,13 @@ void bootsource_set_raw(enum bootsource src, int instance);
*/
void bootsource_set_raw_instance(int instance);
+/**
+ * bootsource_set_instance_index - set bootsource_instance_index as-is
+ * @index: bootrom reported index
+ *
+ * Set the index that depicts the boot image we have booted from.
+ * This is either 0 (primary) or 1 (secondary)
+ */
+void bootsource_set_instance_index(int index);
+
#endif /* __BOOTSOURCE_H__ */
--
2.47.3
More information about the barebox
mailing list