From: Raymond Mao <raymondmaoca@gmail.com>
To: u-boot@lists.denx.de
Cc: uboot@riscstar.com, u-boot-spacemit@groups.io,
raymond.mao@riscstar.com, rick@andestech.com,
ycliang@andestech.com, trini@konsulko.com, lukma@denx.de,
hs@nabladev.com, jh80.chung@samsung.com, peng.fan@nxp.com,
xypron.glpk@gmx.de, randolph@andestech.com, dlan@gentoo.org,
junhui.liu@pigmoral.tech, neil.armstrong@linaro.org,
quentin.schulz@cherry.de, samuel@sholland.org,
raymondmaoca@gmail.com, Guodong Xu <guodong@riscstar.com>
Subject: [PATCH v3 6/9] spacemit: k1: Add multiple device tree support
Date: Thu, 11 Jun 2026 10:18:08 -0400 [thread overview]
Message-ID: <20260611141811.68904-7-raymondmaoca@gmail.com> (raw)
In-Reply-To: <20260611141811.68904-1-raymondmaoca@gmail.com>
From: Guodong Xu <guodong@riscstar.com>
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 <guodong@riscstar.com>
---
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
next prev parent reply other threads:[~2026-06-11 14:19 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20260611141811.68904-1-raymondmaoca@gmail.com>
2026-06-11 14:18 ` [PATCH v3 1/9] mtd: spi: select SPL_SPI_FLASH_TINY in SPL stage Raymond Mao
2026-06-11 14:18 ` [PATCH v3 2/9] mtd: spi: enable spi_nor_remove() in soft reset config Raymond Mao
2026-06-11 14:18 ` [PATCH v3 3/9] spi: fsl: add support for Spacemit K1 SoC Raymond Mao
2026-06-11 14:18 ` [PATCH v3 4/9] spl: k1: enable SPI NOR flash detection and boot Raymond Mao
2026-06-11 14:18 ` [PATCH v3 5/9] riscv: binman: Always set default configuration in FIT image Raymond Mao
2026-06-11 14:18 ` Raymond Mao [this message]
2026-06-11 14:18 ` [PATCH v3 7/9] pinctrl: add pinctrl driver for Spacemit K1 SoC Raymond Mao
2026-06-11 14:18 ` [PATCH v3 8/9] gpio: add gpio " Raymond Mao
2026-06-11 14:18 ` [PATCH v3 9/9] configs: k1: enable pinctrl and gpio Raymond Mao
2026-06-11 15:01 ` [PATCH v3 0/9] Add pinctrl/GPIO and SPI NOR support for Spacemit K1 Guodong Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260611141811.68904-7-raymondmaoca@gmail.com \
--to=raymondmaoca@gmail.com \
--cc=dlan@gentoo.org \
--cc=guodong@riscstar.com \
--cc=hs@nabladev.com \
--cc=jh80.chung@samsung.com \
--cc=junhui.liu@pigmoral.tech \
--cc=lukma@denx.de \
--cc=neil.armstrong@linaro.org \
--cc=peng.fan@nxp.com \
--cc=quentin.schulz@cherry.de \
--cc=randolph@andestech.com \
--cc=raymond.mao@riscstar.com \
--cc=rick@andestech.com \
--cc=samuel@sholland.org \
--cc=trini@konsulko.com \
--cc=u-boot-spacemit@groups.io \
--cc=u-boot@lists.denx.de \
--cc=uboot@riscstar.com \
--cc=xypron.glpk@gmx.de \
--cc=ycliang@andestech.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox