Re: [PATCH v2] rpi: copy /chosen/bootloader partition and set boot_partition
Peter Robinson <[email protected]> Mon, 3 Aug 2026 13:17:11 +0100
| Newsgroups | gmane.comp.boot-loaders.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]> >