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