On 4/1/25 14:42, Ilias Apalodimas wrote:
Hi Caleb

On Wed, 26 Mar 2025 at 19:41, Caleb Connolly <[email protected]> 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)

Reply via email to