mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 0/2] Implement recovery boot detection for SPI flash
@ 2026-05-20  8:32 Fabian Pfitzner
  2026-05-20  8:32 ` [PATCH 1/2] bootsource: add bootsource instance index variable Fabian Pfitzner
  2026-05-20  8:33 ` [PATCH 2/2] arch: arm: imx: detect secondary boot Fabian Pfitzner
  0 siblings, 2 replies; 5+ messages in thread
From: Fabian Pfitzner @ 2026-05-20  8:32 UTC (permalink / raw)
  To: Sascha Hauer, BAREBOX; +Cc: Fabian Pfitzner

As of now, there is only the boot rom log on i.MX processors that give us
information on whether we have booted from the primary or recovery image.

Extract this information into a Barebox variable in order to pass this
information to user space. This is useful for tools such as RAUC, that
rely on that information when updating the bootloader atomically.

The variable is called `bootsource_instance_index`.
The intention behind the name is, that for an instance we can have
multiple boot images, where the primary is depicted as zero, and the
recovery/secondary is depicted as a 1.

There is no implementation on how to pass this information to user
space. This could be implemented by a boot script that interprets
the content of that variable into a human readable format.

Successfully tested on the congatec-qmx8p.

Signed-off-by: Fabian Pfitzner <f.pfitzner@pengutronix.de>
---
Fabian Pfitzner (2):
      bootsource: add bootsource instance index variable
      arch: arm: imx: detect secondary boot

 Documentation/user/variables.rst |  1 +
 arch/arm/mach-imx/boot.c         | 52 ++++++++++++++++++++++++++++++++++++++++
 common/bootsource.c              | 20 ++++++++++++++++
 include/bootsource.h             | 11 +++++++++
 4 files changed, 84 insertions(+)
---
base-commit: 1806d0f4835a1217a298f82fa2fc88b2694380f2
change-id: 20260518-fpf-bootsource-instance-index-a7bb108392a3

Best regards,
-- 
Fabian Pfitzner <f.pfitzner@pengutronix.de>




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

* [PATCH 1/2] bootsource: add bootsource instance index variable
  2026-05-20  8:32 [PATCH 0/2] Implement recovery boot detection for SPI flash Fabian Pfitzner
@ 2026-05-20  8:32 ` Fabian Pfitzner
  2026-05-21 12:02   ` Sascha Hauer
  2026-05-20  8:33 ` [PATCH 2/2] arch: arm: imx: detect secondary boot Fabian Pfitzner
  1 sibling, 1 reply; 5+ messages in thread
From: Fabian Pfitzner @ 2026-05-20  8:32 UTC (permalink / raw)
  To: Sascha Hauer, BAREBOX; +Cc: Fabian Pfitzner

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@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




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

* [PATCH 2/2] arch: arm: imx: detect secondary boot
  2026-05-20  8:32 [PATCH 0/2] Implement recovery boot detection for SPI flash Fabian Pfitzner
  2026-05-20  8:32 ` [PATCH 1/2] bootsource: add bootsource instance index variable Fabian Pfitzner
@ 2026-05-20  8:33 ` Fabian Pfitzner
  2026-05-21 12:27   ` Sascha Hauer
  1 sibling, 1 reply; 5+ messages in thread
From: Fabian Pfitzner @ 2026-05-20  8:33 UTC (permalink / raw)
  To: Sascha Hauer, BAREBOX; +Cc: Fabian Pfitzner

Integrate support to detect secondary boot on imx machines.
Copy the logic for detection from the uboot-imx project[1].

The information will be stored in the `bootsource_instance_index`
variable.

[1] https://github.com/nxp-imx/uboot-imx/blob/99518e6b6f20cb6a2bf19115e355db9f58100af8/arch/arm/mach-imx/imx8m/soc.c#L792

Signed-off-by: Fabian Pfitzner <f.pfitzner@pengutronix.de>
---
 arch/arm/mach-imx/boot.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 52 insertions(+)

diff --git a/arch/arm/mach-imx/boot.c b/arch/arm/mach-imx/boot.c
index 3fea22d05f3bfdf2fe9caa6767e1c7c5ea3ced00..a35a1acc2e71231236d3dd5008523f6c66912000 100644
--- a/arch/arm/mach-imx/boot.c
+++ b/arch/arm/mach-imx/boot.c
@@ -26,6 +26,8 @@
 
 #include <soc/fsl/fsl_udc.h>
 
+int imx8m_detect_secondary_image_boot(void);
+
 static void
 imx_boot_save_loc(void (*get_boot_source)(enum bootsource *, int *))
 {
@@ -35,6 +37,10 @@ imx_boot_save_loc(void (*get_boot_source)(enum bootsource *, int *))
 	get_boot_source(&src, &instance);
 
 	bootsource_set(src, instance);
+
+	int index = imx8m_detect_secondary_image_boot();
+
+	bootsource_set_instance_index(index);
 }
 
 
@@ -756,3 +762,49 @@ void imx8mn_get_boot_source(enum bootsource *src, int *instance)
 
 void imx8mn_boot_save_loc(void)
 	__alias(imx8mp_boot_save_loc);
+
+int imx8m_detect_secondary_image_boot(void)
+{
+	u32 *rom_log_addr = (u32 *)0x9e0;
+	u32 *rom_log;
+	u8 event_id;
+	int i, boot_secondary = 0;
+
+	/* If the ROM event log pointer is not valid. */
+	if (*rom_log_addr < 0x900000 || *rom_log_addr >= 0xb00000 ||
+	    *rom_log_addr & 0x3)
+		return -EINVAL;
+
+	/* Parse the ROM event ID version 2 log */
+	rom_log = (u32 *)(uintptr_t)(*rom_log_addr);
+	for (i = 0; i < 128; i++) {
+		event_id = rom_log[i] >> 24;
+		switch (event_id) {
+		case 0x00: /* End of list */
+			return boot_secondary;
+		/* Log entries with 1 parameter, skip 1 */
+		case 0x80: /* Start to perform the device initialization */
+		case 0x81: /* The boot device initialization completes */
+		case 0x82: /* Starts to execute boot device driver pre-config */
+		case 0x8f: /* The boot device initialization fails */
+		case 0x90: /* Start to read data from boot device */
+		case 0x91: /* Reading data from boot device completes */
+		case 0x9f: /* Reading data from boot device fails */
+			i += 1;
+			continue;
+		/* Log entries with 2 parameters, skip 2 */
+		case 0xa0: /* Image authentication result */
+		case 0xc0: /* Jump to the boot image soon */
+			i += 2;
+			continue;
+		/* Boot from the secondary boot image */
+		case 0x51:
+			boot_secondary = 1;
+			continue;
+		default:
+			continue;
+		}
+	}
+
+	return boot_secondary;
+}

-- 
2.47.3




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

* Re: [PATCH 1/2] bootsource: add bootsource instance index variable
  2026-05-20  8:32 ` [PATCH 1/2] bootsource: add bootsource instance index variable Fabian Pfitzner
@ 2026-05-21 12:02   ` Sascha Hauer
  0 siblings, 0 replies; 5+ messages in thread
From: Sascha Hauer @ 2026-05-21 12:02 UTC (permalink / raw)
  To: Fabian Pfitzner; +Cc: BAREBOX, Fabian Pfitzner

On 2026-05-20 10:32, Fabian Pfitzner wrote:
> 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@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);

The string is too small. You need another byte for the '\0'

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] 5+ messages in thread

* Re: [PATCH 2/2] arch: arm: imx: detect secondary boot
  2026-05-20  8:33 ` [PATCH 2/2] arch: arm: imx: detect secondary boot Fabian Pfitzner
@ 2026-05-21 12:27   ` Sascha Hauer
  0 siblings, 0 replies; 5+ messages in thread
From: Sascha Hauer @ 2026-05-21 12:27 UTC (permalink / raw)
  To: Fabian Pfitzner; +Cc: BAREBOX, Fabian Pfitzner

On 2026-05-20 10:33, Fabian Pfitzner wrote:
> Integrate support to detect secondary boot on imx machines.
> Copy the logic for detection from the uboot-imx project[1].
> 
> The information will be stored in the `bootsource_instance_index`
> variable.
> 
> [1] https://github.com/nxp-imx/uboot-imx/blob/99518e6b6f20cb6a2bf19115e355db9f58100af8/arch/arm/mach-imx/imx8m/soc.c#L792
> 
> Signed-off-by: Fabian Pfitzner <f.pfitzner@pengutronix.de>
> ---
>  arch/arm/mach-imx/boot.c | 52 ++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 52 insertions(+)
> 
> diff --git a/arch/arm/mach-imx/boot.c b/arch/arm/mach-imx/boot.c
> index 3fea22d05f3bfdf2fe9caa6767e1c7c5ea3ced00..a35a1acc2e71231236d3dd5008523f6c66912000 100644
> --- a/arch/arm/mach-imx/boot.c
> +++ b/arch/arm/mach-imx/boot.c
> @@ -26,6 +26,8 @@
>  
>  #include <soc/fsl/fsl_udc.h>
>  
> +int imx8m_detect_secondary_image_boot(void);

It should be either static without forward declaration or exported with
the declaration in a header file.

> +
>  static void
>  imx_boot_save_loc(void (*get_boot_source)(enum bootsource *, int *))
>  {
> @@ -35,6 +37,10 @@ imx_boot_save_loc(void (*get_boot_source)(enum bootsource *, int *))
>  	get_boot_source(&src, &instance);
>  
>  	bootsource_set(src, instance);
> +
> +	int index = imx8m_detect_secondary_image_boot();

You assume you are running on i.MX8M here which is not necessarily the
case.

> +
> +	bootsource_set_instance_index(index);
>  }
>  
>  
> @@ -756,3 +762,49 @@ void imx8mn_get_boot_source(enum bootsource *src, int *instance)
>  
>  void imx8mn_boot_save_loc(void)
>  	__alias(imx8mp_boot_save_loc);
> +
> +int imx8m_detect_secondary_image_boot(void)
> +{
> +	u32 *rom_log_addr = (u32 *)0x9e0;
> +	u32 *rom_log;
> +	u8 event_id;
> +	int i, boot_secondary = 0;
> +
> +	/* If the ROM event log pointer is not valid. */
> +	if (*rom_log_addr < 0x900000 || *rom_log_addr >= 0xb00000 ||
> +	    *rom_log_addr & 0x3)
> +		return -EINVAL;

We have imx8m_get_bootrom_log() which handles different cases like we
are in PBL/EL3 or in barebox proper. Why not use it here?

I wonder how this works at all because you are derefencing the ROM which
is inside the faulting zero page. I would assume barebox crashes here
when this is called from barebox proper.

> +
> +	/* Parse the ROM event ID version 2 log */
> +	rom_log = (u32 *)(uintptr_t)(*rom_log_addr);
> +	for (i = 0; i < 128; i++) {
> +		event_id = rom_log[i] >> 24;

We already have defines for this, see arch/arm/mach-imx/bootrom-cmd.c

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] 5+ messages in thread

end of thread, other threads:[~2026-05-21 12:28 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-05-20  8:32 [PATCH 0/2] Implement recovery boot detection for SPI flash Fabian Pfitzner
2026-05-20  8:32 ` [PATCH 1/2] bootsource: add bootsource instance index variable Fabian Pfitzner
2026-05-21 12:02   ` Sascha Hauer
2026-05-20  8:33 ` [PATCH 2/2] arch: arm: imx: detect secondary boot Fabian Pfitzner
2026-05-21 12:27   ` Sascha Hauer

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