[PATCH v6 13/13] arm: u8500: Package Stemmy device trees in FIT
Linus Walleij <[email protected]>
| Newsgroups | org.u-boot-project.lists.u-boot |
|---|---|
| Message-ID | <[email protected]> |
Build all seven supported Samsung Ux500 device trees into the FIT appended to Stemmy U-Boot. Select the appropriate configuration at runtime from the machine ID passed by the Samsung firmware. Codina and Codina TMO share a machine ID, so distinguish Codina TMO by its board ID. Keep the multi-DTB FIT selection, default device tree and device tree list in stemmy_defconfig. This leaves the base U8500 platform available to non-Samsung devices (non-Stemmy) using their own board, defconfig and device tree selection. Print the firmware machine and board IDs to aid diagnostics and future machine ID mappings. Signed-off-by: Linus Walleij <[email protected]> --- board/ste/stemmy/stemmy.c | 77 ++++++++++++++++++++++++++++++++++++++++++++--- configs/stemmy_defconfig | 2 ++ 2 files changed, 74 insertions(+), 5 deletions(-) diff --git a/board/ste/stemmy/stemmy.c b/board/ste/stemmy/stemmy.c index 66330184af86..8526deeb29bc 100644 --- a/board/ste/stemmy/stemmy.c +++ b/board/ste/stemmy/stemmy.c @@ -21,6 +21,11 @@ static ulong fw_atags __section(".data"); static const struct tag *fw_atags_copy; static uint fw_atags_size; +#define SBL_BOARD "board_id=" +#define SBL_LCDTYPE "lcdtype=" +static ulong board_id; +static ulong lcdtype; + void save_boot_params(ulong r0, ulong r1, ulong r2, ulong r3) { fw_mach = r1; @@ -40,6 +45,70 @@ static const struct tag *fw_atags_get(void) return tags; } +static ulong fw_board_id_get(void) +{ + const struct tag *t, *tags = fw_atags_get(); + const char *str; + + if (!tags) + return 0; + + for_each_tag(t, tags) { + if (t->hdr.tag != ATAG_CMDLINE) + continue; + + str = strstr(t->u.cmdline.cmdline, SBL_BOARD); + if (str) + return simple_strtoul(str + strlen(SBL_BOARD), NULL, 10); + } + + return 0; +} + +int board_fit_config_name_match(const char *name) +{ + const char *dt_name; + + switch (fw_mach) { + case 5000: + dt_name = "ste-ux500-samsung-janice"; + break; + case 3296: + case 5002: + dt_name = "ste-ux500-samsung-gavini"; + break; + case 5003: + switch (fw_board_id_get()) { + case 0x101: + case 0x102: + case 0x103: + case 0x104: + case 0x105: + case 0x106: + case 0x107: + dt_name = "ste-ux500-samsung-codina-tmo"; + break; + default: + dt_name = "ste-ux500-samsung-codina"; + break; + } + break; + case 5006: + dt_name = "ste-ux500-samsung-kyle"; + break; + case 5008: + dt_name = "ste-ux500-samsung-golden"; + break; + case 5009: + dt_name = "ste-ux500-samsung-skomer"; + break; + default: + return -ENOENT; + } + + return strcmp(name, dt_name); +} + int dram_init(void) { const struct tag *t, *tags = fw_atags_get(); @@ -96,11 +165,6 @@ static void parse_serial(const struct tag_serialnr *serialnr) env_set("serial#", serial); } -#define SBL_BOARD "board_id=" -#define SBL_LCDTYPE "lcdtype=" -static ulong board_id = 0; -static ulong lcdtype = 0; - static void parse_cmdline(const struct tag_cmdline *cmdline) { char *buf; @@ -181,6 +245,9 @@ static void copy_atags(const struct tag *tags) int misc_init_r(void) { copy_atags(fw_atags_get()); + printf("Firmware machine ID: %lu, board ID: %lu\n", + fw_mach, board_id); + return 0; } diff --git a/configs/stemmy_defconfig b/configs/stemmy_defconfig index c253780df2ef..7c9df043457e 100644 --- a/configs/stemmy_defconfig +++ b/configs/stemmy_defconfig @@ -12,6 +12,8 @@ CONFIG_NR_DRAM_BANKS=2 CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x100000 CONFIG_DEFAULT_DEVICE_TREE="st/ste-ux500-samsung-janice" +CONFIG_OF_LIST="st/ste-ux500-samsung-codina st/ste-ux500-samsung-codina-tmo st/ste-ux500-samsung-gavini st/ste-ux500-samsung-golden st/ste-ux500-samsung-janice st/ste-ux500-samsung-kyle st/ste-ux500-samsung-skomer" +CONFIG_MULTI_DTB_FIT=y CONFIG_OF_UPSTREAM=y CONFIG_SYS_BOOTM_LEN=0x4000000 CONFIG_SYS_LOAD_ADDR=0x100000 -- 2.55.0