arm64: zynqmp: spl: fix dual SD controller support
authorJean-Francois Dagenais <jeff.dagenais@gmail.com>
Mon, 3 Apr 2017 01:44:34 +0000 (21:44 -0400)
committerMichal Simek <michal.simek@xilinx.com>
Mon, 19 Jun 2017 14:53:09 +0000 (16:53 +0200)
When enabling both SDHCI controllers, spl_mmc.c would actually choose
device sdhci0 even if booted from sdhci1 (boot_device). This is because
spl_mmc_get_device_index(boot_device) expects BOOT_DEVICE_MMC2[_2] in
order to return index 1 instead of 0.

The #if defined(...) statement is copied from board/xilinx/zynqmp/zynqmp.c

So the key to properly enabling both controllers as boot sources is
defining both CONFIG_ZYNQ_SDHCI0 and CONFIG_ZYNQ_SDHCI1 in your board's
include/configs/*.h.

Signed-off-by: Jean-Francois Dagenais <jeff.dagenais@gmail.com>
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/arm/cpu/armv8/zynqmp/spl.c

index 7b78d23..6afa074 100644 (file)
@@ -83,10 +83,15 @@ u32 spl_boot_device(void)
        case JTAG_MODE:
                return BOOT_DEVICE_RAM;
 #ifdef CONFIG_SPL_MMC_SUPPORT
+       case SD_MODE1:
        case SD1_LSHFT_MODE:
-       case EMMC_MODE:
+/* if both controllers enabled, then these two are the second controller */
+#if defined(CONFIG_ZYNQ_SDHCI0) && defined(CONFIG_ZYNQ_SDHCI1)
+               return BOOT_DEVICE_MMC2;
+/* else, fall through, the one SDHCI controller that is enabled is number 1 */
+#endif
        case SD_MODE:
-       case SD_MODE1:
+       case EMMC_MODE:
                return BOOT_DEVICE_MMC1;
 #endif
 #ifdef CONFIG_SPL_DFU_SUPPORT
@@ -111,6 +116,7 @@ u32 spl_boot_mode(const u32 boot_device)
        case BOOT_DEVICE_RAM:
                return 0;
        case BOOT_DEVICE_MMC1:
+       case BOOT_DEVICE_MMC2:
                return MMCSD_MODE_FS;
        default:
                puts("spl: error: unsupported device\n");