spl_boot_device() derives the boot device from BootROM state: the SD
API pointer the BootROM leaves in SRAM, the boot flag register, and the
boot strap. Not every BootROM path is covered by that. On the OrangePi
R2S, for example, the BootROM probes a card first ("try sd...") and only
then loads the FSBL from eMMC, and on the OrangePi RV2 it falls back
from the card to SPI NOR. If the detection names a device that holds no
image, the SPL stops with "failed to boot from all boot devices".

Provide board_boot_order(): the detected device first, then the other
MMC controller and SPI NOR when this SPL can read them.

Signed-off-by: Dave Klotz <[email protected]>
---
 board/spacemit/k1/spl.c | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/board/spacemit/k1/spl.c b/board/spacemit/k1/spl.c
index 96ee4449c4..cc0e26bb02 100644
--- a/board/spacemit/k1/spl.c
+++ b/board/spacemit/k1/spl.c
@@ -498,6 +498,32 @@ u32 spl_boot_device(void)
        return ret;
 }
 
+/*
+ * Try the device the BootROM booted from first, then the other storage
+ * this SPL can read. The boot-mode detection relies on BootROM state; if
+ * it names a device that holds no image (the BootROM probed a card before
+ * falling back to eMMC, say), the SPL still finds U-Boot instead of
+ * stopping at "failed to boot from all boot devices".
+ */
+void board_boot_order(u32 *spl_boot_list)
+{
+       u32 fallbacks[3];
+       int i, n = 0, m = 0;
+
+       if (CONFIG_IS_ENABLED(MMC)) {
+               fallbacks[m++] = BOOT_DEVICE_MMC1;
+               fallbacks[m++] = BOOT_DEVICE_MMC2;
+       }
+       if (CONFIG_IS_ENABLED(SPI_LOAD))
+               fallbacks[m++] = BOOT_DEVICE_SPI;
+
+       spl_boot_list[n++] = spl_boot_device();
+       for (i = 0; i < m; i++)
+               if (fallbacks[i] != spl_boot_list[0])
+                       spl_boot_list[n++] = fallbacks[i];
+       spl_boot_list[n] = BOOT_DEVICE_NONE;
+}
+
 void spl_board_init(void)
 {
 }
-- 
2.55.0


Reply via email to