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

Peter Robinson <[email protected]>
Newsgroups org.u-boot-project.lists.u-boot
Message-ID <CALeDE9NJ7oxNkFe02e913OXiMd=WYQiPzvQoBs98SzL_w2D8ag@mail.gmail.com>
Hi Gregor,

On Tue, 4 Aug 2026 at 14:39, Gregor Herburger
<[email protected]> wrote:
>
> 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.

I think the title and this needs to be updated to cover the fact we're
now taking the whole chosen/bootloader/ branch of the tree not just
tryboot or partition.

> Copy the /chosen/bootloader node to the device tree.
>
> Set the env variable boot_partition accordingly to allow boards to
> create a bootcmd based on the boot partition.
>
> Reviewed-by: Matthias Brugger <[email protected]>
Given the patch has changed quite a bit you should drop this review tag.

> Signed-off-by: Gregor Herburger <[email protected]>

Tested-by: Peter Robinson <[email protected]>

This works for me to copy all of bootloader/ so I'm adding a tested, I
think there's a few other minor bits needed.

Thanks,
Peter

> ---
> Changes in v3:
> - Copy the complete '/chosen/bootloader' node instead of only the
>   partition property
> - Link to v2: https://patch.msgid.link/[email protected]
>
> Changes in v2:
> - update Reviewed-by tag
> ---
>  board/raspberrypi/rpi/rpi.c | 51 +++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 51 insertions(+)
>
> diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
> index 1da5df92351c..ba8a2c1ba4cf 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;
>  }
> @@ -579,6 +594,39 @@ int board_fdt_blob_setup(void **fdtp)
>         return 0;
>  }
>
> +int copy_node_all_properties(void *dst, void *src, const char *path, const char *node)

Should we split this to two patches?

> +{
> +       int src_parent, dst_parent;
> +       int src_node, dst_node;
> +       int prop;
> +       int len;
> +
> +       src_parent = fdt_path_offset(src, path);
> +       dst_parent = fdt_path_offset(dst, path);
> +       if (src_parent < 0 || dst_parent < 0)
> +               return -1;
> +
> +       src_node = fdt_subnode_offset(src, src_parent, node);
> +       if (src_node < 0)
> +               return -1;
> +
> +       dst_node = fdt_find_or_add_subnode(dst, dst_parent, node);
> +       if (dst_node < 0)
> +               return -1;
> +
> +       fdt_for_each_property_offset(prop, src, src_node) {
> +               const char *name;
> +               const void *value = fdt_getprop_by_offset(src, prop, &name, &len);
> +
> +               if (!value || !name)
> +                       continue;
> +
> +               fdt_setprop(dst, dst_node, name, value, len);
> +       }
> +
> +       return 0;
> +}
> +
>  int copy_property(void *dst, void *src, char *path, char *property)
>  {
>         int dst_offset, src_offset;
> @@ -641,6 +689,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 bootloader node */
> +       copy_node_all_properties(fdt, fw_fdt, "/chosen", "bootloader");
>  }
>
>  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.