From: Guodong Xu <[email protected]>

Enable multiple DTB support in the FIT image for the Spacemit K1 SoC,
allowing a single U-Boot binary to support different board variants.

The SPL reads the board type from EEPROM and selects the corresponding
device tree at runtime via board_fit_config_name_match(), ensuring the
correct hardware description is passed to U-Boot proper.

Signed-off-by: Guodong Xu <[email protected]>

---
Changes in v2:
- Reworked.  Drop the v1 approach (new local k1-muse-pi-pro.dts,
  enlarge SYS_MALLOC_F_LEN, MMODE switch).
- Use binman --fit-multi-config so u-boot.itb packs multiple board
  DTs from the upstream tree.
Changes in v3:
- Append CONFIG_SPL_BOARD_INIT. Move the operation on product name
  in board_init_r stage.

 board/spacemit/k1/spl.c       | 64 +++++++++++++++++++++++++++++------
 configs/spacemit_k1_defconfig |  3 ++
 2 files changed, 56 insertions(+), 11 deletions(-)

diff --git a/board/spacemit/k1/spl.c b/board/spacemit/k1/spl.c
index da4169fbc8c..0db362130e4 100644
--- a/board/spacemit/k1/spl.c
+++ b/board/spacemit/k1/spl.c
@@ -55,6 +55,8 @@ struct ddr_cfg {
 binman_sym_declare(ulong, ddr_fw, image_pos);
 binman_sym_declare(ulong, ddr_fw, size);
 
+char product_name[I2C_BUF_SIZE] = "k1";
+
 static void i2c_early_init(void)
 {
        struct udevice *bus;
@@ -104,6 +106,37 @@ int read_product_name(char *name, int size)
        return -ENOENT;
 }
 
+static const struct {
+       const char *eeprom_name;
+       const char *fit_name;
+} k1_board_map[] = {
+       { "k1-x_MUSE-Pi-Pro",   "spacemit/k1-musepi-pro"    },
+       { "k1-x_deb1",          "spacemit/k1-bananapi-f3"   },
+       { "k1-x_milkv-jupiter", "spacemit/k1-milkv-jupiter" },
+};
+
+static void fixup_product_name(void)
+{
+       char fdt_name[I2C_BUF_SIZE];
+       int i;
+
+       memset(fdt_name, 0, I2C_BUF_SIZE);
+       for (i = 0; i < ARRAY_SIZE(k1_board_map); i++) {
+               if (!strncmp(product_name, k1_board_map[i].eeprom_name,
+                            strlen(k1_board_map[i].eeprom_name))) {
+                       snprintf(fdt_name, I2C_BUF_SIZE, "%s",
+                                k1_board_map[i].fit_name);
+                       break;
+               }
+       }
+       if (fdt_name[0] == '\0') {
+               /* set default board name */
+               sprintf(fdt_name, CONFIG_DEFAULT_DEVICE_TREE);
+       }
+       memset(product_name, 0, I2C_BUF_SIZE);
+       memcpy(product_name, fdt_name, I2C_BUF_SIZE);
+}
+
 static void clk_early_init(void)
 {
        struct udevice *dev;
@@ -322,14 +355,8 @@ void nor_early_init(void)
        udelay(10);
 }
 
-void *board_spl_fit_buffer_addr(ulong fit_size, int sectors, int bl_len)
-{
-       return (void *)CONFIG_SPL_LOAD_FIT_ADDRESS;
-}
-
 void board_init_f(ulong dummy)
 {
-       u8 i2c_buf[I2C_BUF_SIZE] = { 0 };
        int ret;
 
        ret = spl_early_init();
@@ -344,11 +371,6 @@ void board_init_f(ulong dummy)
        preloader_console_init();
 
        i2c_early_init();
-       ret = read_product_name(i2c_buf, I2C_BUF_SIZE);
-       if (ret)
-               log_info("Fail to detect board:%d\n", ret);
-       else
-               log_info("Get board name:%s\n", (char *)i2c_buf);
        pmic_init();
 
        ddr_early_init();
@@ -362,4 +384,24 @@ u32 spl_boot_device(void)
 
 void spl_board_init(void)
 {
+       int ret;
+
+       ret = read_product_name(product_name, I2C_BUF_SIZE);
+       if (ret)
+               log_info("Fail to detect board:%d\n", ret);
+       else
+               log_info("Get board name:%s\n", product_name);
+       fixup_product_name();
+}
+
+int board_fit_config_name_match(const char *name)
+{
+       if (!strcmp(name, product_name))
+               return 0;
+       return -ENOENT;
+}
+
+void *board_spl_fit_buffer_addr(ulong fit_size, int sectors, int bl_len)
+{
+       return (void *)CONFIG_SPL_LOAD_FIT_ADDRESS;
 }
diff --git a/configs/spacemit_k1_defconfig b/configs/spacemit_k1_defconfig
index 64c724c62a5..ee47c05d923 100644
--- a/configs/spacemit_k1_defconfig
+++ b/configs/spacemit_k1_defconfig
@@ -5,6 +5,7 @@ CONFIG_NR_DRAM_BANKS=2
 CONFIG_HAS_CUSTOM_SYS_INIT_SP_ADDR=y
 CONFIG_CUSTOM_SYS_INIT_SP_ADDR=0x1000000
 CONFIG_DEFAULT_DEVICE_TREE="spacemit/k1-musepi-pro"
+CONFIG_OF_LIST="spacemit/k1-bananapi-f3 spacemit/k1-musepi-pro 
spacemit/k1-milkv-jupiter"
 CONFIG_SPL_SYS_MALLOC_F_LEN=0x4000
 CONFIG_SPL_STACK=0xc083fb00
 CONFIG_SPL_TEXT_BASE=0xc0801000
@@ -27,6 +28,7 @@ CONFIG_SPL_RISCV_MMODE=y
 # CONFIG_SPL_SMP is not set
 CONFIG_STACK_SIZE=0x100000
 CONFIG_FIT=y
+CONFIG_MULTI_DTB_FIT=y
 CONFIG_SPL_HAS_LOAD_FIT_ADDRESS=y
 CONFIG_SPL_LOAD_FIT_ADDRESS=0x08000000
 CONFIG_SUPPORT_RAW_INITRD=y
@@ -85,3 +87,4 @@ CONFIG_SPL_DM_SPI_FLASH=y
 CONFIG_SPL_SPI_LOAD=y
 CONFIG_SPL_SPI_FLASH_TINY=y
 CONFIG_SPL_SPI_FLASH_SUPPORT=y
+CONFIG_SPL_BOARD_INIT=y
-- 
2.25.1

Reply via email to