[PATCH 2/4] mach-snapdragon: CapsuleUpdate: support all boot methods
Caleb Connolly
caleb.connolly at linaro.org
Thu Apr 3 14:47:45 CEST 2025
On 4/1/25 14:42, Ilias Apalodimas wrote:
> Hi Caleb
>
> On Wed, 26 Mar 2025 at 19:41, Caleb Connolly <caleb.connolly at 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.
Ahh nice, I'll do that.
> 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?
Yes, having a "uefi" partition is only the case on 2 boards that I'm
aware of, and both have a/b variants. The xbl and boot partitions exist
on A/B and non-A/B devices so we have to handle all variants there.
>
>> + /*
>> + * 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)
Thanks
>
>> + } 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
--
Caleb (they/them)
More information about the U-Boot
mailing list