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

Reply via email to