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

Filip Kokosiński filip.kokosinski at gmail.com
Mon Feb 16 19:44:51 CET 2026


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>
---
 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