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

