[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