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 <[email protected]>
---
 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

Reply via email to