From: Alexey Minnekhanov Date: Fri, 7 Nov 2025 23:29:35 +0000 (+0300) Subject: mach-snapdragon: capsule_update: Fix eMMC detection for non-UFS devices X-Git-Tag: v2026.04-rc1~31^2~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bf4045ede829b00b1f82794df84152e7ca839d65;p=thirdparty%2Fu-boot.git mach-snapdragon: capsule_update: Fix eMMC detection for non-UFS devices Currently (since 2026.01-rc) on all SDM630/660 based devices this is printed, after observing long boot delay (several seconds) before executing preboot commands: QCOM-FMP: Failed to find boot partition find_target_partition() function incorrectly assumes that eMMC is always at number 0. In general you can't rely on device numbering to determine if particular block device is eMMC or SD-card, because it depends on how aliases are defined in device tree "chosen" node. Some SoCs have MMC numbers starting at 1, not 0; so mmc1 is eMMC, mmc2 is SD-card. Make eMMC detection reliable by using IS_SD() macro from mmc.h header. Using this method target boot partition can be found successfully. With debug prints enabled, this is printed: QCOM-FMP: skipped SD-Card (devnum 2) QCOM-FMP: Capsule update target: boot (disk 1:60) QCOM-FMP: DFU string: 'mmc 0=u-boot.bin part 1 60' Without debug prints nothing is printed, no error about failure to find boot partition. Fixes: fe80a5f80095 ("mach-snapdragon: CapsuleUpdate: support all boot methods") Signed-off-by: Alexey Minnekhanov Reviewed-by: Casey Connolly Link: https://patch.msgid.link/20251107232935.283843-1-alexeymin@minlexx.ru Signed-off-by: Casey Connolly --- diff --git a/arch/arm/mach-snapdragon/capsule_update.c b/arch/arm/mach-snapdragon/capsule_update.c index 3699d91852d..586682434b7 100644 --- a/arch/arm/mach-snapdragon/capsule_update.c +++ b/arch/arm/mach-snapdragon/capsule_update.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -80,6 +81,23 @@ static enum ab_slot get_part_slot(const char *partname) return SLOT_NONE; } +/* Shamelessly copied from lib/efi_loader/efi_device_path.c @ 33 */ +/* + * Determine if an MMC device is an SD card. + * + * @desc block device descriptor + * Return: true if the device is an SD card + */ +static bool is_sd(struct blk_desc *desc) +{ + struct mmc *mmc = find_mmc_device(desc->devnum); + + if (!mmc) + return false; + + return IS_SD(mmc) != 0U; +} + /* * Determine which partition U-Boot is flashed to based on the boot source (ABL/XBL), * the slot status, and prioritizing the uefi partition over xbl if found. @@ -109,19 +127,21 @@ static int find_target_partition(int *devnum, enum uclass_id *uclass, if (device_get_uclass_id(dev) != UCLASS_BLK) continue; + desc = dev_get_uclass_plat(dev); + /* If we have a UFS then don't look at any other block devices */ if (have_ufs) { if (device_get_uclass_id(dev->parent->parent) != UCLASS_UFS) continue; + } /* - * If we don't have UFS, then U-Boot must be on the eMMC which is always the first - * MMC device. + * If we don't have UFS, then U-Boot must be on the eMMC */ - } else if (dev->parent->seq_ > 0) { + else if (IS_ENABLED(CONFIG_MMC) && is_sd(desc)) { + log_debug("skipped SD-Card (devnum %d)\n", desc->devnum); continue; } - desc = dev_get_uclass_plat(dev); if (!desc || desc->part_type == PART_TYPE_UNKNOWN) continue; for (partnum = 1;; partnum++) {