[PATCH 1/8] spacemit: k1: select boot device via config registers
Raymond Mao
raymondmaoca at gmail.com
Fri Jun 12 22:18:54 CEST 2026
From: Guodong Xu <guodong at riscstar.com>
Add logic to determine the current boot device by reading the
SoC's configuration registers, rather than using a hardcoded
default.
Signed-off-by: Guodong Xu <guodong at riscstar.com>
Signed-off-by: Raymond Mao <raymond.mao at riscstar.com>
---
board/spacemit/k1/spl.c | 77 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 76 insertions(+), 1 deletion(-)
diff --git a/board/spacemit/k1/spl.c b/board/spacemit/k1/spl.c
index 0db362130e4..d5e87d79fa2 100644
--- a/board/spacemit/k1/spl.c
+++ b/board/spacemit/k1/spl.c
@@ -21,6 +21,17 @@
#include <tlv_eeprom.h>
#include "tlv_codes.h"
+/* boot mode configs */
+#define BOOT_DEV_FLAG_REG 0xd4282d10
+#define BOOT_PIN_SEL_REG 0xd4282c20
+
+#define BOOT_STRAP_MODE_OFFSET 9
+#define BOOT_STRAP_MODE_MASK 3
+#define BOOT_STRAP_MODE_EMMC 0
+#define BOOT_STRAP_MODE_SPI 1
+#define BOOT_STRAP_MODE_NAND 2
+#define BOOT_STRAP_MODE_SD 3
+
#define MUX_MODE4 4
#define EDGE_NONE BIT(6)
#define PULL_UP (6 << 13) /* bit[15:13] 110 */
@@ -45,6 +56,17 @@ typedef void (*puts_func_t)(const char *s);
typedef int (*ddr_init_func_t)(u64 ddr_base, u32 cs_num, u32 data_rate,
puts_func_t puts);
+enum board_boot_mode {
+ BOOT_MODE_NONE = 0,
+ BOOT_MODE_USB = 0x55a,
+ BOOT_MODE_EMMC,
+ BOOT_MODE_NAND,
+ BOOT_MODE_SPI,
+ BOOT_MODE_SD,
+ BOOT_MODE_SHELL = 0x55f,
+ BOOT_MODE_BOOTSTRAP,
+};
+
struct ddr_cfg {
u32 data_rate;
u32 cs_num;
@@ -379,7 +401,60 @@ void board_init_f(ulong dummy)
u32 spl_boot_device(void)
{
- return BOOT_DEVICE_SPI;
+ void __iomem *boot_dev = (void __iomem *)BOOT_DEV_FLAG_REG;
+ void __iomem *boot_strap = (void __iomem *)BOOT_PIN_SEL_REG;
+ u32 mode, sel, ret = 0;
+
+ mode = readl(boot_dev);
+ if (mode == BOOT_MODE_NONE || mode > BOOT_MODE_SD) {
+ sel = readl(boot_strap);
+ sel >>= BOOT_STRAP_MODE_OFFSET;
+ sel &= BOOT_STRAP_MODE_MASK;
+ switch (sel) {
+ case BOOT_STRAP_MODE_EMMC:
+ mode = BOOT_MODE_EMMC;
+ break;
+ case BOOT_STRAP_MODE_NAND:
+ mode = BOOT_MODE_NAND;
+ break;
+ case BOOT_STRAP_MODE_SPI:
+ mode = BOOT_MODE_SPI;
+ break;
+ case BOOT_STRAP_MODE_SD:
+ default:
+ mode = BOOT_MODE_SD;
+ break;
+ }
+ }
+ /* TODO:
+ * The current upstream DTS file only contains the eMMC node. When
+ * the SD node is added via an overlay, the eMMC device ends up as
+ * MMC1 in SPL.
+ * However, the SD device should be the first device (MMC1).
+ * This sequence needs to be corrected once the SD node is merged
+ * into the upstream U-Boot DTS file.
+ */
+ switch (mode) {
+ case BOOT_MODE_EMMC:
+ ret = BOOT_DEVICE_MMC1;
+ break;
+ case BOOT_MODE_NAND:
+ ret = BOOT_DEVICE_NAND;
+ break;
+ case BOOT_MODE_SPI:
+ ret = BOOT_DEVICE_SPI;
+ break;
+ case BOOT_MODE_USB:
+ ret = BOOT_DEVICE_USB;
+ break;
+ case BOOT_MODE_SD:
+ ret = BOOT_DEVICE_MMC2;
+ break;
+ default:
+ ret = BOOT_DEVICE_MMC1;
+ break;
+ }
+ return ret;
}
void spl_board_init(void)
--
2.25.1
More information about the U-Boot
mailing list