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