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.