Re: [PATCH v2] rpi: copy /chosen/bootloader partition and set boot_partition

Peter Robinson <[email protected]>
Newsgroups org.u-boot-project.lists.u-boot
Message-ID <CALeDE9PhmuHkiR5k0H=7mdCwq=n=1gS80vuQQqb8GdpKMYM3nA@mail.gmail.com>
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]>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.