Re: [PATCH v2] rpi: copy /chosen/bootloader partition and set boot_partition
Gregor Herburger <[email protected]> Mon, 3 Aug 2026 16:12:33 +0200
| Newsgroups | gmane.comp.boot-loaders.u-boot |
|---|---|
| Message-ID | <6mekppoipr35wecczz26vktsovqzwgwvsxuo6u7ltalpl4yyfl@vsmbtmecofkp> |
Hi Peter, On Mon, Aug 03, 2026 at 01:17:11PM +0100, Peter Robinson wrote: > 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. Ok. > > 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. No I just tested it and couldn't see it either. I think it fails silently because of the missing '/chosen/bootloader' node. Don't know how it ever worked. Maybe I had a dts with that node from somewhere. > 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. You mean to copy the complete '/chosen/bootloader' node with all its properties? Yes I think that is a good idea, there seem to be some usable properties. Here is how it looks on my board: bootloader { boot-mode = <0x00000001>; version = "5855b10b2bd22b2a116dc91f6b5b1bc4b2ea849f"; capabilities = <0x0000007f>; update-timestamp = <0x00000000>; build-timestamp = <0x684bf1ce>; tryboot = <0x00000000>; rsts = <0x00001020>; partition = <0x00000002>; arg1 = <0x00000000>; count = <0x00000002>; }; I will copy the complete node in the next iteration of this patch. > > 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]> > > Best regards Gregor -- 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