From: Guodong Xu <[email protected]> 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 <[email protected]> Signed-off-by: Raymond Mao <[email protected]> --- 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

