Hi Fiona,

I'll review and test this the coming week and provide feedback.

On Tue, 11 Feb 2025 at 13:58, Fiona Klute <fiona.kl...@gmx.de> wrote:

> Both the Raspberry Pi downstream kernel [1] and some userspace tools
> [2] use the revision property to identify the board, and the latter
> fails if it is absent. The firmware creates the /system node, so we
> need to do the same.
>
> [1]
> https://github.com/raspberrypi/linux/blob/0f292fbb6346b05766152902076895558ac23f9a/arch/arm/mach-bcm/board_bcm2835.c#L23-L33
> [2]
> https://github.com/jgarff/rpi_ws281x/blob/7fc0bf8b31d715bbecf28e852ede5aaa388180da/rpihw.c#L579
>
> Signed-off-by: Fiona Klute <fiona.kl...@gmx.de>
> Cc: Matthias Brugger <mbrug...@suse.com>
> Cc: Peter Robinson <pbrobin...@gmail.com>
> Cc: Tom Rini <tr...@konsulko.com>
> ---
> I'm sending this as RFC because I'm not sure if creating a temporary
> overlay is the best approach here, advice on a better way to create the
> /system node if needed is very much welcome. I know I'll need to add
> more error checks, I'll do that after I know I have the right approach.
>
>  board/raspberrypi/rpi/rpi.c | 37 +++++++++++++++++++++++++++++++++++++
>  1 file changed, 37 insertions(+)
>
> diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
> index aa39afa338a..647716127c7 100644
> --- a/board/raspberrypi/rpi/rpi.c
> +++ b/board/raspberrypi/rpi/rpi.c
> @@ -550,6 +550,41 @@ int copy_property(void *dst, void *src, char *path,
> char *property)
>         return fdt_setprop(dst, dst_offset, property, prop, len);
>  }
>
> +int copy_system_node(void *fdt, void *fw_fdt)
> +{
> +       const fdt32_t *prop;
> +       char fdto[2048];
> +       int src_offset;
> +       int len;
> +
> +       src_offset = fdt_path_offset(fw_fdt, "/system");
> +       if (src_offset < 0)
> +               return -1;
> +
> +       fdt_create(fdto, sizeof(fdto));
> +       fdt_finish_reservemap(fdto);
> +       fdt_begin_node(fdto, "");
> +       fdt_begin_node(fdto, "fragment");
> +       fdt_property_string(fdto, "target-path", "/");
> +       fdt_begin_node(fdto, "__overlay__");
> +       fdt_begin_node(fdto, "system");
> +
> +       prop = fdt_getprop(fw_fdt, src_offset, "linux,serial", &len);
> +       if (prop)
> +               fdt_property(fdto, "linux,serial", prop, len);
> +       prop = fdt_getprop(fw_fdt, src_offset, "linux,revision", &len);
> +       if (prop)
> +               fdt_property(fdto, "linux,revision", prop, len);
> +
> +       fdt_end_node(fdto);
> +       fdt_end_node(fdto);
> +       fdt_end_node(fdto);
> +       fdt_end_node(fdto);
> +       fdt_finish(fdto);
> +
> +       fdt_overlay_apply_verbose(fdt, fdto);
> +}
> +
>  /* Copy tweaks from the firmware dtb to the loaded dtb */
>  void  update_fdt_from_fw(void *fdt, void *fw_fdt)
>  {
> @@ -560,6 +595,8 @@ void  update_fdt_from_fw(void *fdt, void *fw_fdt)
>         /* The firmware provides a more precise model; so copy that */
>         copy_property(fdt, fw_fdt, "/", "model");
>
> +       copy_system_node(fdt, fw_fdt);
> +
>         /* memory reserve as suggested by the firmware */
>         copy_property(fdt, fw_fdt, "/", "memreserve");
>
> --
> 2.47.2
>
>

Reply via email to