]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
board/raspberrypi: add multi-FDT support
authorFilip Kokosiński <filip.kokosinski@gmail.com>
Mon, 16 Feb 2026 18:44:51 +0000 (19:44 +0100)
committerPeter Robinson <pbrobinson@gmail.com>
Thu, 12 Mar 2026 12:11:24 +0000 (12:11 +0000)
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@gmail.com>
Reviewed-by: Peter Robinson <pbrobinson@gmail.com>
Tested-by: Peter Robinson <pbrobinson@gmail.com>
board/raspberrypi/rpi/rpi.c

index 7256d66a9a65f4a6f066f192a71abc320a4575e5..ea887c00be430705da24760d92f416fef2ce0402 100644 (file)
@@ -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);
 }