aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJagan Teki2020-07-15 15:38:58 +0530
committerAndes2020-07-24 14:55:19 +0800
commit868e295ef72535300037fc264e770cfdca3f5894 (patch)
treef59535b698a31da5cd80c5e6ec1ef81eaccaf81a
parent3d5ac3536be97a679763e261c55167bfd356a412 (diff)
sifive: fu540: Add runtime boot mode detection
Add support to detect boot mode at runtime for SiFive FU540 boards. Signed-off-by: Jagan Teki <jagan@amarulasolutions.com> Reviewed-by: Bin Meng <bin.meng@windriver.com> Tested-by: Bin Meng <bin.meng@windriver.com>
-rw-r--r--board/sifive/fu540/fu540.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/board/sifive/fu540/fu540.c b/board/sifive/fu540/fu540.c
index 27ff52f9035..57753ba50ba 100644
--- a/board/sifive/fu540/fu540.c
+++ b/board/sifive/fu540/fu540.c
@@ -10,6 +10,7 @@
#include <env.h>
#include <init.h>
#include <log.h>
+#include <linux/bitops.h>
#include <linux/bug.h>
#include <linux/delay.h>
#include <linux/io.h>
@@ -128,14 +129,26 @@ int board_init(void)
}
#ifdef CONFIG_SPL
+#define MODE_SELECT_REG 0x1000
+#define MODE_SELECT_QSPI 0x6
+#define MODE_SELECT_SD 0xb
+#define MODE_SELECT_MASK GENMASK(3, 0)
+
u32 spl_boot_device(void)
{
-#ifdef CONFIG_SPL_MMC_SUPPORT
- return BOOT_DEVICE_MMC1;
-#else
- puts("Unknown boot device\n");
- hang();
-#endif
+ u32 mode_select = readl((void *)MODE_SELECT_REG);
+ u32 boot_device = mode_select & MODE_SELECT_MASK;
+
+ switch (boot_device) {
+ case MODE_SELECT_QSPI:
+ return BOOT_DEVICE_SPI;
+ case MODE_SELECT_SD:
+ return BOOT_DEVICE_MMC1;
+ default:
+ debug("Unsupported boot device 0x%x but trying MMC1\n",
+ boot_device);
+ return BOOT_DEVICE_MMC1;
+ }
}
#endif