Hi Gregor,

> The Raspberry Pi has the "tryboot" feature where it can boot from a
> different partition enabling failsafe A/B updates. After boot the
> firmware sets 'partition' property in /chosen/bootloader. Copy this
> property to the device tree and set the env variable boot_partition.
> This allows boards to create a bootcmd based on the boot partition.
>
> Reviewed-by: Matthias Brugger <[email protected]>
> Signed-off-by: Gregor Herburger <[email protected]>
> ---
> Changes in v2:
> - update Reviewed-by tag

You don't need to do a v2 for a tag, patchwork will deal with that
automatically.

I looked at this briefly on a RPi4/5 yesterday and couldn't see the DT
bits being passed through to the kernel, purely by a simple test of
looking in /proc/device-tree/chosen/ directory and didn't see the
bootloader/ directory or added/amended details, where if I boot off
the FW DT I see:

# ls /proc/device-tree/chosen/bootloader/
boot-mode build-timestamp  capabilities  name  partition  rsts
tryboot  update-timestamp  version

Not sure if this is the versions of firmware/U-Boot/downstream DT I am
using or something else. I wonder also if we should just amend
everything in the branch of the DT as no doubt others will want other
bits for other features.

Peter

> ---
>  board/raspberrypi/rpi/rpi.c | 18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
>
> diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
> index 1da5df92351c..7a2ff646ac8c 100644
> --- a/board/raspberrypi/rpi/rpi.c
> +++ b/board/raspberrypi/rpi/rpi.c
> @@ -480,6 +480,20 @@ static void set_serial_number(void)
>         env_set("serial#", serial_string);
>  }
>
> +static void set_boot_partition_fdt(void)
> +{
> +       void *fdtp = (void *)gd->fdt_blob;
> +       u32 partition;
> +
> +       partition = fdt_getprop_u32_default(fdtp, "/chosen/bootloader", 
> "partition", 1);
> +       if (!partition) {
> +               printf("Failed to the get partition property.\n");
> +               return;
> +       }
> +
> +       env_set_ulong("boot_partition", partition);
> +}
> +
>  int misc_init_r(void)
>  {
>         set_fdt_addr();
> @@ -489,6 +503,7 @@ int misc_init_r(void)
>         set_board_info();
>  #endif
>         set_serial_number();
> +       set_boot_partition_fdt();
>
>         return 0;
>  }
> @@ -641,6 +656,9 @@ void  update_fdt_from_fw(void *fdt, void *fw_fdt)
>
>         /* copy uart clk as provided by the firmware */
>         copy_property(fdt, fw_fdt, "/clocks/clk-uart", "clock-frequency");
> +
> +       /* Copy the boot partition */
> +       copy_property(fdt, fw_fdt, "/chosen/bootloader", "partition");
>  }
>
>  int ft_board_setup(void *blob, struct bd_info *bd)
>
> ---
> base-commit: baa64b2f892890f00a377eac4a3e685472bb56b5
> change-id: 20260803-tryboot2-8c5221376e5a
>
> Best regards,
> --
> Gregor Herburger <[email protected]>
>

Reply via email to