sifive: fu540: Add runtime boot mode detection
authorJagan Teki <jagan@amarulasolutions.com>
Wed, 15 Jul 2020 10:08:58 +0000 (15:38 +0530)
committerAndes <uboot@andestech.com>
Fri, 24 Jul 2020 06:55:19 +0000 (14:55 +0800)
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>
board/sifive/fu540/fu540.c

index 27ff52f90355ccd8262811ba4de98b41653eccd9..57753ba50bab80f7e5518bde87b5c08b165575b4 100644 (file)
@@ -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