diff options
Diffstat (limited to 'board/raspberrypi/rpi/rpi.c')
| -rw-r--r-- | board/raspberrypi/rpi/rpi.c | 99 |
1 files changed, 58 insertions, 41 deletions
diff --git a/board/raspberrypi/rpi/rpi.c b/board/raspberrypi/rpi/rpi.c index f9b643555dd..7f69e5b6163 100644 --- a/board/raspberrypi/rpi/rpi.c +++ b/board/raspberrypi/rpi/rpi.c @@ -94,120 +94,128 @@ 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( + [0] = DTB_DIR "bcm2712-rpi-5-b.dtb", + [1] = DTB_DIR "bcm2712d0-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 +223,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 +369,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); } @@ -608,6 +622,9 @@ void update_fdt_from_fw(void *fdt, void *fw_fdt) /* warnings from the firmware (if any) */ copy_property(fdt, fw_fdt, "/chosen", "user-warnings"); + /* firmware logs - used by the vclog utility */ + copy_property(fdt, fw_fdt, "/chosen", "log"); + /* address of the PHY device as provided by the firmware */ copy_property(fdt, fw_fdt, "ethernet0/mdio@e14/ethernet-phy@1", "reg"); |
