summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilip Kokosiński <[email protected]>2026-02-16 19:44:51 +0100
committerPeter Robinson <[email protected]>2026-03-12 12:11:24 +0000
commite263f901c10427b6e91d6ab2c43a311e86d59ce9 (patch)
treef50c7f61ab3297dc9d4dccfbf168b36e36cb9384
parent7d5d8400fa5d7e61a5abd131770bc853237baf38 (diff)
board/raspberrypi: add multi-FDT support
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]> Reviewed-by: Peter Robinson <[email protected]> Tested-by: Peter Robinson <[email protected]>
-rw-r--r--board/raspberrypi/rpi/rpi.c93
1 files 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);
}