On Wed, Aug 05, 2026 at 12:40:19PM +0100, Peter Robinson wrote:
> 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.
Agree will update.
> 
> > 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.
Yes, was not sure. Will drop the 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?
> 
Yes, will split.
> > +{
> > +       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]>
> >

-- 
Gregor Herburger
Linutronix GmbH | Bahnhofstrasse 3 | D-88690 Uhldingen-Mühlhofen
Phone: +49 7556 25 999 35; Fax.: +49 7556 25 999 99

Hinweise zum Datenschutz finden Sie hier (Informations on data privacy 
can be found here): https://linutronix.de/legal/data-protection.php

Linutronix GmbH | Firmensitz (Registered Office): Uhldingen-Mühlhofen | 
Registergericht (Registration Court): Amtsgericht Freiburg i.Br., HRB700 
806 | Geschäftsführer (Managing Directors): Dr. Wilfried Wessner, 
Katharina Kopp, Alexander Gieringer

Reply via email to