From e263f901c10427b6e91d6ab2c43a311e86d59ce9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Kokosi=C5=84ski?= Date: Mon, 16 Feb 2026 19:44:51 +0100 Subject: board/raspberrypi: add multi-FDT support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Reviewed-by: Peter Robinson Tested-by: Peter Robinson --- 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 7256d66a9a6..ea887c00be4 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); } -- cgit v1.2.3