[PATCH 1/2] board/raspberrypi: add multi-FDT support

Peter Robinson pbrobinson at gmail.com
Thu Mar 12 13:08:13 CET 2026


On Mon, 16 Feb 2026 at 18:45, Filip Kokosiński
<filip.kokosinski at gmail.com> wrote:
>
> This patch adds support for multiple FDT files per board model. This is
> done by adding the FDTFILES macro, which initializes two rpi_model
> struct members: fdtfiles and fdtcount.
>
> The new-style revision codes designate LSB bits as board revision; this
> value is used to choose between provided FDTs. The first element of the
> fdtfiles list is used should no revision match.
>
> Signed-off-by: Filip Kokosiński <filip.kokosinski at gmail.com>
Reviewed-by: Peter Robinson <pbrobinson at gmail.com>
Tested-by: Peter Robinson <pbrobinson at gmail.com>

> ---
>  board/raspberrypi/rpi/rpi.c | 93 +++++++++++++++++++++----------------
>  1 file changed, 52 insertions(+), 41 deletions(-)
>
> diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c
> index f9b643555dd..1b404b448f3 100644
> --- a/board/raspberrypi/rpi/rpi.c
> +++ b/board/raspberrypi/rpi/rpi.c
> @@ -94,120 +94,125 @@ struct efi_capsule_update_info update_info = {
>   */
>  struct rpi_model {
>         const char *name;
> -       const char *fdtfile;
> +       const char * const *fdtfiles;
> +       size_t fdtcount;
>         bool has_onboard_eth;
>  };
>
> +#define FDTFILES(...) \
> +       (const char *[]){ __VA_ARGS__ }, \
> +       sizeof((const char *[]){ __VA_ARGS__ }) / sizeof(const char *)
> +
>  static const struct rpi_model rpi_model_unknown = {
>         "Unknown model",
> -       DTB_DIR "bcm283x-rpi-other.dtb",
> +       FDTFILES(DTB_DIR "bcm283x-rpi-other.dtb"),
>         false,
>  };
>
>  static const struct rpi_model rpi_models_new_scheme[] = {
>         [0x0] = {
>                 "Model A",
> -               DTB_DIR "bcm2835-rpi-a.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-a.dtb"),
>                 false,
>         },
>         [0x1] = {
>                 "Model B",
> -               DTB_DIR "bcm2835-rpi-b.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-b.dtb"),
>                 true,
>         },
>         [0x2] = {
>                 "Model A+",
> -               DTB_DIR "bcm2835-rpi-a-plus.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-a-plus.dtb"),
>                 false,
>         },
>         [0x3] = {
>                 "Model B+",
> -               DTB_DIR "bcm2835-rpi-b-plus.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-b-plus.dtb"),
>                 true,
>         },
>         [0x4] = {
>                 "2 Model B",
> -               DTB_DIR "bcm2836-rpi-2-b.dtb",
> +               FDTFILES(DTB_DIR "bcm2836-rpi-2-b.dtb"),
>                 true,
>         },
>         [0x6] = {
>                 "Compute Module",
> -               DTB_DIR "bcm2835-rpi-cm.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-cm.dtb"),
>                 false,
>         },
>         [0x8] = {
>                 "3 Model B",
> -               DTB_DIR "bcm2837-rpi-3-b.dtb",
> +               FDTFILES(DTB_DIR "bcm2837-rpi-3-b.dtb"),
>                 true,
>         },
>         [0x9] = {
>                 "Zero",
> -               DTB_DIR "bcm2835-rpi-zero.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-zero.dtb"),
>                 false,
>         },
>         [0xA] = {
>                 "Compute Module 3",
> -               DTB_DIR "bcm2837-rpi-cm3.dtb",
> +               FDTFILES(DTB_DIR "bcm2837-rpi-cm3.dtb"),
>                 false,
>         },
>         [0xC] = {
>                 "Zero W",
> -               DTB_DIR "bcm2835-rpi-zero-w.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-zero-w.dtb"),
>                 false,
>         },
>         [0xD] = {
>                 "3 Model B+",
> -               DTB_DIR "bcm2837-rpi-3-b-plus.dtb",
> +               FDTFILES(DTB_DIR "bcm2837-rpi-3-b-plus.dtb"),
>                 true,
>         },
>         [0xE] = {
>                 "3 Model A+",
> -               DTB_DIR "bcm2837-rpi-3-a-plus.dtb",
> +               FDTFILES(DTB_DIR "bcm2837-rpi-3-a-plus.dtb"),
>                 false,
>         },
>         [0x10] = {
>                 "Compute Module 3+",
> -               DTB_DIR "bcm2837-rpi-cm3.dtb",
> +               FDTFILES(DTB_DIR "bcm2837-rpi-cm3.dtb"),
>                 false,
>         },
>         [0x11] = {
>                 "4 Model B",
> -               DTB_DIR "bcm2711-rpi-4-b.dtb",
> +               FDTFILES(DTB_DIR "bcm2711-rpi-4-b.dtb"),
>                 true,
>         },
>         [0x12] = {
>                 "Zero 2 W",
> -               DTB_DIR "bcm2837-rpi-zero-2-w.dtb",
> +               FDTFILES(DTB_DIR "bcm2837-rpi-zero-2-w.dtb"),
>                 false,
>         },
>         [0x13] = {
>                 "400",
> -               DTB_DIR "bcm2711-rpi-400.dtb",
> +               FDTFILES(DTB_DIR "bcm2711-rpi-400.dtb"),
>                 true,
>         },
>         [0x14] = {
>                 "Compute Module 4",
> -               DTB_DIR "bcm2711-rpi-cm4.dtb",
> +               FDTFILES(DTB_DIR "bcm2711-rpi-cm4.dtb"),
>                 true,
>         },
>         [0x17] = {
>                 "5 Model B",
> -               DTB_DIR "bcm2712-rpi-5-b.dtb",
> +               FDTFILES(DTB_DIR "bcm2712-rpi-5-b.dtb"),
>                 true,
>         },
>         [0x18] = {
>                 "Compute Module 5",
> -               DTB_DIR "bcm2712-rpi-cm5-cm5io.dtb",
> +               FDTFILES(DTB_DIR "bcm2712-rpi-cm5-cm5io.dtb"),
>                 true,
>         },
>         [0x19] = {
>                 "500",
> -               DTB_DIR "bcm2712-rpi-500.dtb",
> +               FDTFILES(DTB_DIR "bcm2712-rpi-500.dtb"),
>                 true,
>         },
>         [0x1A] = {
>                 "Compute Module 5 Lite",
> -               DTB_DIR "bcm2712-rpi-cm5l-cm5io.dtb",
> +               FDTFILES(DTB_DIR "bcm2712-rpi-cm5l-cm5io.dtb"),
>                 true,
>         },
>  };
> @@ -215,87 +220,87 @@ static const struct rpi_model rpi_models_new_scheme[] = {
>  static const struct rpi_model rpi_models_old_scheme[] = {
>         [0x2] = {
>                 "Model B",
> -               DTB_DIR "bcm2835-rpi-b.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-b.dtb"),
>                 true,
>         },
>         [0x3] = {
>                 "Model B",
> -               DTB_DIR "bcm2835-rpi-b.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-b.dtb"),
>                 true,
>         },
>         [0x4] = {
>                 "Model B rev2",
> -               DTB_DIR "bcm2835-rpi-b-rev2.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-b-rev2.dtb"),
>                 true,
>         },
>         [0x5] = {
>                 "Model B rev2",
> -               DTB_DIR "bcm2835-rpi-b-rev2.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-b-rev2.dtb"),
>                 true,
>         },
>         [0x6] = {
>                 "Model B rev2",
> -               DTB_DIR "bcm2835-rpi-b-rev2.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-b-rev2.dtb"),
>                 true,
>         },
>         [0x7] = {
>                 "Model A",
> -               DTB_DIR "bcm2835-rpi-a.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-a.dtb"),
>                 false,
>         },
>         [0x8] = {
>                 "Model A",
> -               DTB_DIR "bcm2835-rpi-a.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-a.dtb"),
>                 false,
>         },
>         [0x9] = {
>                 "Model A",
> -               DTB_DIR "bcm2835-rpi-a.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-a.dtb"),
>                 false,
>         },
>         [0xd] = {
>                 "Model B rev2",
> -               DTB_DIR "bcm2835-rpi-b-rev2.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-b-rev2.dtb"),
>                 true,
>         },
>         [0xe] = {
>                 "Model B rev2",
> -               DTB_DIR "bcm2835-rpi-b-rev2.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-b-rev2.dtb"),
>                 true,
>         },
>         [0xf] = {
>                 "Model B rev2",
> -               DTB_DIR "bcm2835-rpi-b-rev2.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-b-rev2.dtb"),
>                 true,
>         },
>         [0x10] = {
>                 "Model B+",
> -               DTB_DIR "bcm2835-rpi-b-plus.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-b-plus.dtb"),
>                 true,
>         },
>         [0x11] = {
>                 "Compute Module",
> -               DTB_DIR "bcm2835-rpi-cm.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-cm.dtb"),
>                 false,
>         },
>         [0x12] = {
>                 "Model A+",
> -               DTB_DIR "bcm2835-rpi-a-plus.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-a-plus.dtb"),
>                 false,
>         },
>         [0x13] = {
>                 "Model B+",
> -               DTB_DIR "bcm2835-rpi-b-plus.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-b-plus.dtb"),
>                 true,
>         },
>         [0x14] = {
>                 "Compute Module",
> -               DTB_DIR "bcm2835-rpi-cm.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-cm.dtb"),
>                 false,
>         },
>         [0x15] = {
>                 "Model A+",
> -               DTB_DIR "bcm2835-rpi-a-plus.dtb",
> +               FDTFILES(DTB_DIR "bcm2835-rpi-a-plus.dtb"),
>                 false,
>         },
>  };
> @@ -361,11 +366,17 @@ int dram_init_banksize(void)
>  static void set_fdtfile(void)
>  {
>         const char *fdtfile;
> +       int rev = revision & 0x0f;
>
>         if (env_get("fdtfile"))
>                 return;
>
> -       fdtfile = model->fdtfile;
> +       /* set the first entry as default */
> +       fdtfile = model->fdtfiles[0];
> +
> +       if (rev < model->fdtcount)
> +               fdtfile = model->fdtfiles[rev];
> +
>         env_set("fdtfile", fdtfile);
>  }
>
> --
> 2.51.2
>


More information about the U-Boot mailing list