[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