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

