[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