On 2024-03-19 16:59, Jonas Karlman wrote:
On 2024-03-19 10:44, Dragan Simic wrote:
On 2024-03-15 18:34, Jonas Karlman wrote:
diff --git a/arch/arm/mach-rockchip/spl.c
b/arch/arm/mach-rockchip/spl.c
index 1586a093fc37..27e996b504e7 100644
--- a/arch/arm/mach-rockchip/spl.c
+++ b/arch/arm/mach-rockchip/spl.c
@@ -32,9 +32,17 @@ __weak const char * const
boot_devices[BROM_LAST_BOOTSOURCE + 1] = {

 const char *board_spl_was_booted_from(void)
 {
-       u32  bootdevice_brom_id = readl(BROM_BOOTSOURCE_ID_ADDR);
+       static u32 bootdevice_brom_id;
        const char *bootdevice_ofpath = NULL;

+       if (!bootdevice_brom_id)
+               bootdevice_brom_id = readl(BROM_BOOTSOURCE_ID_ADDR);
+       if (!bootdevice_brom_id) {
+               debug("%s: unknown brom_bootdevice_id %x\n",
+                     __func__, bootdevice_brom_id);
+               return NULL;
+       }
+

Maybe it would be better to execute readl(BROM_BOOTSOURCE_ID_ADDR)
only once, i.e. to have something like this instead:

     +  static u32 bootdevice_brom_id = -1;

     +  if (bootdevice_brom_id == -1) {
     +          bootdevice_brom_id = readl(BROM_BOOTSOURCE_ID_ADDR);
     +          if (!bootdevice_brom_id)
     +                  debug("%s: unknown brom_bootdevice_id %x\n",
     +                        __func__, bootdevice_brom_id);
     +  }
     +
     +  if (!bootdevice_brom_id)        /* fail on subsequent tries */
     +          return NULL;
     +

The logic behind such an approach would be to try only once and fail
on subsequent (re)tries. That way, it would also serve as some kind of
a runtime canary test, because the first try should succeed, which may
prove useful in the field.

If we initialize the static variable to a value it will be stored in the
.data section and takes up binary size. With a static variable like in
this patch this is instead stored in .bss section and gets initialized
to 0 by runtime. 0 is also not a valid boot source id value and the
reset value for the reg.

Is it mandatory that this static variable ends up in the .bss section?

I do not see any point in making the code more complex than it has to be.
The reg will contain a known boot source id, 1 - 10, set by BROM or
something has gone wrong and the value is not usable any way.

As I already described, making the code more complex would intentionally
introduce a failure point, which would be triggered in case obtaining
valid value from readl() fails the first time.  Something like that is
usually known as a canary, which I'm sure you already know about.

Reply via email to