Add logic to determine the current boot device by reading the SoC's configuration registers, rather than using a hardcoded default.
Signed-off-by: Eric Chung <[email protected]> --- v2: - Use FIELD_GET() to parse boot strap mode. - Remove comments on hacking. Since the sequence between eMMC and SD device is exchanged in the upstream DTS. So it isn't a hacking any more. --- board/spacemit/k1/spl.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/board/spacemit/k1/spl.c b/board/spacemit/k1/spl.c index 0db362130e4..70579637b5e 100644 --- a/board/spacemit/k1/spl.c +++ b/board/spacemit/k1/spl.c @@ -13,6 +13,7 @@ #include <dm/device.h> #include <dm/uclass.h> #include <i2c.h> +#include <linux/bitfield.h> #include <linux/delay.h> #include <log.h> #include <power/regulator.h> @@ -21,6 +22,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 +57,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 +402,51 @@ 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 = FIELD_GET(BOOT_STRAP_MODE_MASK << BOOT_STRAP_MODE_OFFSET, + readl(boot_strap)); + 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; + } + } + 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.51.0

