Hi Caleb On Wed, 26 Mar 2025 at 19:41, Caleb Connolly <caleb.conno...@linaro.org> wrote: > > Expand capsule update support to correctly identify which partition > U-Boot is flashed to (between xbl, uefi, and boot including A/B > variants). > > Use qcom_boot_source to determine if we were chainloaded from ABL, > meaning U-Boot is on the boot partition, otherwise we assume uefi if > it's available, finally leaving the xbl partition. > > Set a different fw_name based on the target partition to prevent GUID > collisions, since a board may support U-Boot flashed to boot or XBL we > need to differentiate them since the U-Boot binary must be built > differently. >
[...] > - if (!strncmp(info.name, partname, strlen(partname))) { > - log_debug("Found active %s partition: '%s'!\n", > partname, info.name); > - strlcpy(name, info.name, sizeof(info.name)); > - return partnum; > + desc = dev_get_uclass_plat(dev); > + if (!desc || desc->part_type == PART_TYPE_UNKNOWN) > + continue; > + for (partnum = 1;; partnum++) { > + ret = part_get_info(desc, partnum, &info); > + if (ret) > + break; > + > + slot_status = (struct part_slot_status > *)&info.type_flags; > + > + /* > + * Qualcomm Linux devices have a "uefi" partition, > it's A/B but the > + * flags might not be set so we assume the A > partition unless the B > + * partition is active. > + */ > + if (!strncmp(info.name, "uefi", strlen("uefi"))) since it's a static string, use sizeof() to compute it at build time. I get what you are trying to do here and automatically detect the boot partition, I'll have a closer look in case we can somehow make this loop shorter. { > + /* > + * If U-Boot was chainloaded somehow we can't > be flashed to > + * the uefi partition > + */ > + if (qcom_boot_source != QCOM_BOOT_SOURCE_XBL) > + continue; > + > + *target_part_type = TARGET_PART_UEFI; > + /* > + * Found an active UEFI partition, this is > where U-Boot is > + * flashed. > + */ > + if (slot_status->active) > + goto found; > + > + /* Prefer A slot if it's not marked active */ > + if (get_part_slot(info.name) == SLOT_A) { SLOT_NONE only applies to non-uefi partitions? > + /* > + * If we found the A slot after the B > slot (both > + * inactive) then we assume U-Boot is > on the A slot. > + */ > + if (uefi_partnum >= 0) > + goto found; > + > + /* Didn't find the B slot yet */ > + uefi_partnum = partnum; > + strlcpy(ptn_name, info.name, 32); sizeof(ptn_name) > + } else { > + /* > + * Found inactive B slot after > inactive A slot, return > + * the A slot > + */ > + if (uefi_partnum >= 0) { > + partnum = uefi_partnum; > + goto found; > + } > + > + /* > + * Didn't find the A slot yet. Record > that we found the > + * B slot [...] Cheers /Ilias