[PATCH v3 u-boot] mmc: spl: Make partition choice in default_spl_mmc_emmc_boot_partition() more explicit

Pali Rohár pali at kernel.org
Sat Jul 8 00:54:38 CEST 2023


To make eMMC partition choosing in default_spl_mmc_emmc_boot_partition()
function better understandable, rewrite it via explicit switch-case code
pattern.

Also indicate an error when eMMC EXT_CSD[179] register is configured by
user to value which is not suitable for eMMC booting and SPL do not know
how to interpret it.

Signed-off-by: Pali Rohár <pali at kernel.org>
---
Changes in v3:
* Instead of showing (verbose) warning, make them as errors and
  propagate them back to caller.
* Add comment with explanation what happened and how to fix possible
  misconfigured configuration.

Changes in v2:
* Disable showing warning on sama5d2_xplained due to size restrictions
---
This patch depends on another patch:
mmc: spl: Add comments for default_spl_mmc_emmc_boot_partition()
https://patchwork.ozlabs.org/project/uboot/patch/20230404202805.8523-1-pali@kernel.org/
---
 common/spl/spl_mmc.c | 56 +++++++++++++++++++++++++++++++++++++-------
 1 file changed, 48 insertions(+), 8 deletions(-)

diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
index f7a42a11477d..656363a3b51a 100644
--- a/common/spl/spl_mmc.c
+++ b/common/spl/spl_mmc.c
@@ -408,15 +408,46 @@ int default_spl_mmc_emmc_boot_partition(struct mmc *mmc)
 	 *
 	 * Note: See difference between EXT_CSD_EXTRACT_PARTITION_ACCESS
 	 * and EXT_CSD_EXTRACT_BOOT_PART, specially about User area value.
-	 *
-	 * FIXME: When booting from this eMMC device is explicitly
-	 * disabled then we use User area for booting. This is incorrect.
-	 * Probably we should skip this eMMC device and select the next
-	 * one for booting. Or at least throw warning about this fallback.
 	 */
-	part = EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config);
-	if (part == 7)
-		part = 0;
+	if (mmc->part_config == MMCPART_NOAVAILABLE)
+		part = 0; /* If partitions are not supported then we have only User Area partition */
+	else {
+		switch(EXT_CSD_EXTRACT_BOOT_PART(mmc->part_config)) {
+		case 0: /* Booting from this eMMC device is disabled */
+			/*
+			 * This eMMC device has disabled booting.
+			 * This may happen because of misconfiguration of eMMC device or
+			 * because user explicitly wanted to not boot from this eMMC device.
+			 * eMMC boot configuration can be changed by "mmc partconf" command.
+			 */
+			part = -ENXIO; /* negative value indicates error */
+			/* Note that error message is printed by caller of this function. */
+			break;
+		case 1: /* Boot partition 1 is used for booting */
+			part = 1;
+			break;
+		case 2: /* Boot partition 2 is used for booting */
+			part = 2;
+			break;
+		case 7: /* User area is used for booting */
+			part = 0;
+			break;
+		default: /* Other values are reserved */
+			/*
+			 * This eMMC device has configured booting from reserved value.
+			 * This may happen because of misconfiguration of eMMC device or
+			 * because this is newer eMMC device than what U-Boot understand.
+			 * If newer eMMC specification defines meaning for some reserved
+			 * values then switch above should be updated for new cases.
+			 * At this stage we do not know how to interpret this reserved
+			 * value so return error.
+			 * eMMC boot configuration can be changed by "mmc partconf" command.
+			 */
+			part = -EINVAL; /* negative value indicates error */
+			/* Note that error message is printed by caller of this function. */
+			break;
+		}
+	}
 #endif
 	return part;
 }
@@ -471,6 +502,15 @@ int spl_mmc_load(struct spl_image_info *spl_image,
 	switch (boot_mode) {
 	case MMCSD_MODE_EMMCBOOT:
 		part = spl_mmc_emmc_boot_partition(mmc);
+		if (part < 0) {
+#ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
+			if (part == -ENXIO)
+				puts("spl: mmc booting disabled\n");
+			else
+				puts("spl: mmc misconfigured\n");
+#endif
+			return part;
+		}
 
 		if (CONFIG_IS_ENABLED(MMC_TINY))
 			err = mmc_switch_part(mmc, part);
-- 
2.20.1



More information about the U-Boot mailing list