Re: [PATCH 1/7] qcom: capsule: add FIT capsule support with multi-partition
Balaji Selvanathan via U-Boot <[email protected]> Mon, 3 Aug 2026 12:12:54 +0530
| Newsgroups | gmane.comp.boot-loaders.u-boot |
|---|---|
| Message-ID | <[email protected]> |
Hi Ilias, On 7/31/2026 3:06 PM, Ilias Apalodimas wrote: > Hi Casey, > > On Wed, 29 Jul 2026 at 13:45, Balaji Selvanathan > <[email protected]> wrote: >> Hi Casey, Ilias, >> >> On 7/28/2026 5:51 PM, Casey Connolly wrote: >>> On 28/07/2026 13:44, Balaji Selvanathan wrote: >>>> Hi Ilias, >>>> >>>> On 7/27/2026 9:57 PM, Balaji Selvanathan wrote: >>>>> Hi Ilias, >>>>> >>>>> On 7/27/2026 6:11 PM, Ilias Apalodimas wrote: >>>>>> On Mon, 27 Jul 2026 at 13:00, Balaji Selvanathan >>>>>> <[email protected]> wrote: >>>>>>> Hi Ilias, Casey, >>>>>>> >>>>>>> On 7/24/2026 12:37 AM, Casey Connolly wrote: >>>>>>>> On 23/07/2026 18:43, Balaji Selvanathan wrote: >>>>>>>>> Hi Casey, >>>>>>>>> >>>>>>>>> On 7/22/2026 8:19 PM, Casey Connolly wrote: >>>>>>>>>> Hi Balaji, >>>>>>>>>> >>>>>>>>>> On 22/07/2026 11:23, Balaji Selvanathan wrote: >>>>>>>>>>> Hi Casey, >>>>>>>>>>> >>>>>>>>>>> On 7/18/2026 4:19 PM, Casey Connolly wrote: >>>>>>>>>>>> On 7/17/26 18:16, Balaji Selvanathan wrote: >>>>>>>>>>>>> Hi Casey, Ilias, Simon, >>>>>>>>>>>>> >>>>>>>>>>>>> On 5/26/2026 7:05 PM, Casey Connolly wrote: >>>>>>>>>>>>>> Hi Balaji, >>>>>>>>>>>>>> >>>>>>>>>>>>>> On 25/05/2026 13:24, Balaji Selvanathan wrote: >>>>>>>>>>>>>>> Hi Ilias, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On 5/23/2026 6:23 PM, Ilias Apalodimas wrote: >>>>>>>>>>>>>>>> [...] >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> To support multi-image RAW capsules, we would need to: >>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>> 1. Enhance mkeficapsule to create multi-image capsules? >>>>>>>>>>>>>>>>>> There's an equivalent tool in EDKII that can produce a >>>>>>>>>>>>>>>>>> capsule >>>>>>>>>>>>>>>>>> with >>>>>>>>>>>>>>>>>> multiple payloads. There were also patches posted for >>>>>>>>>>>>>>>>>> mkeficapsule, >>>>>>>>>>>>>>>>>> but need some minor tweaks to merge them >>>>>>>>>>>>>>>>> Can you please point me those patches? I did a search >>>>>>>>>>>>>>>>> myself, but >>>>>>>>>>>>>>>>> couldnt find those patches. >>>>>>>>>>>>>>>> https://lore.kernel.org/u-boot/20240419065542.1160527-1- >>>>>>>>>>>>>>>> [email protected]/ >>>>>>>>>>>>>>> This patch you mentioned here can create capsule with only one >>>>>>>>>>>>>>> payload; >>>>>>>>>>>>>>> means for multiple binaries we need to create multiple >>>>>>>>>>>>>>> capsules. I >>>>>>>>>>>>>>> have >>>>>>>>>>>>>>> also asked the person who made this series to respin, but >>>>>>>>>>>>>>> havent >>>>>>>>>>>>>>> heard >>>>>>>>>>>>>>> back from him. >>>>>>>>>>>>>> From a quick look it seems like it would be fairly >>>>>>>>>>>>>> straightforward to >>>>>>>>>>>>>> extend mkeficapsule to support multiple images, the capsule >>>>>>>>>>>>>> header >>>>>>>>>>>>>> has >>>>>>>>>>>>>> an item_offset_list[] array with offsets to each image, today >>>>>>>>>>>>>> we just >>>>>>>>>>>>>> write 1 but it shouldn't be too much of a challenge to put a >>>>>>>>>>>>>> loop in >>>>>>>>>>>>>> here and extend the argument parsing. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Given that we a) already use raw capsules and b) they are >>>>>>>>>>>>>> part of the >>>>>>>>>>>>>> EFI spec, I'm gonna try and save us all some time and just >>>>>>>>>>>>>> put my >>>>>>>>>>>>>> foot >>>>>>>>>>>>>> down here. A single raw EFI capsule file can already support >>>>>>>>>>>>>> updating >>>>>>>>>>>>>> multiple images, U-Boot already has all of the machinery for >>>>>>>>>>>>>> it with >>>>>>>>>>>>>> the >>>>>>>>>>>>>> exception of mkeficapsule but I expect that's something you can >>>>>>>>>>>>>> tackle. >>>>>>>>>>>>>> >>>>>>>>>>>>>> The upside to this is that you will be able to build capsule >>>>>>>>>>>>>> files >>>>>>>>>>>>>> for >>>>>>>>>>>>>> updating xbl/tz/hyp/aop that can be consumed by U-Boot and edk2! >>>>>>>>>>>>> Thanks for the detailed feedback. >>>>>>>>>>>>> >>>>>>>>>>>>> We agree — we'll drop the FIT capsule approach and move >>>>>>>>>>>>> forward with >>>>>>>>>>>>> RAW capsules. >>>>>>>>>>>>> >>>>>>>>>>>>> Here's the plan: >>>>>>>>>>>>> >>>>>>>>>>>>> 1. mkeficapsule tool: Extend Sughosh's multi-payload capsule >>>>>>>>>>>>> series >>>>>>>>>>>>> [1] to support generating multi-image capsules from a config >>>>>>>>>>>>> file, so we can build a single capsule covering all the >>>>>>>>>>>>> partitions >>>>>>>>>>>>> we need to update. >>>>>>>>>>>>> 2. U-Boot (Qualcomm): Today the Qualcomm capsule update code only >>>>>>>>>>>>> supports a single firmware image (U-Boot itself) via a >>>>>>>>>>>>> single-entry fw_images[] array. We'll move to a SoC- >>>>>>>>>>>>> specific, >>>>>>>>>>>>> multi- entry fw_images[] array (defined per board, e.g. >>>>>>>>>>>>> board/qualcomm/<board>/fw_images.c), so a single capsule >>>>>>>>>>>>> update >>>>>>>>>>>>> flow can cover multiple firmware components — each with its own >>>>>>>>>>>>> ESRT entry and FMP image_index — instead of just U-Boot. >>>>>>>>>>>> No need for this, just build fw_images[] on the fly derived >>>>>>>>>>>> from the >>>>>>>>>>>> partition table on the board, with an entry for each partition >>>>>>>>>>>> that >>>>>>>>>>>> can be updated. You just need to add a map from partition label to >>>>>>>>>>>> fw_name string, starting with the xbl/uefi/boot partitions we >>>>>>>>>>>> already >>>>>>>>>>>> handle. >>>>>>>>>>>> >>>>>>>>>>>> The entire point of having logic here was to avoid per-board >>>>>>>>>>>> stuff, if >>>>>>>>>>>> you're thinking "ah I'll do this per-board" you should immediately >>>>>>>>>>>> wonder "but can we do it dynamically instead?". >>>>>>>>>>>> >>>>>>>>>>>> Thanks, >>>>>>>>>>>> Casey >>>>>>>>>>> Hi Casey, Ilias, >>>>>>>>>>> >>>>>>>>>>> Thanks for the pointer — agreed, building fw_images[] >>>>>>>>>>> dynamically >>>>>>>>>>> from >>>>>>>>>>> the partition table is the right call, avoids per-target code >>>>>>>>>>> entirely. >>>>>>>>>> Can I talk to a human instead of an LLM please? >>>>>>>>>> >>>>>>>>>>> Plan: >>>>>>>>>>> - Keep a fixed table mapping "partition label → fw_name + a >>>>>>>>>>> fixed >>>>>>>>>>> image index", this mapping going to be a superset list for all >>>>>>>>>>> the Boot >>>>>>>>>>> FW images supported in different Qualcomm targets. >>>>>>>>>> This reads vaguely like a rephrasing of what I proposed, not >>>>>>>>>> clear if >>>>>>>>>> you really understand it though. >>>>>>>>>> >>>>>>>>>>> Sample table: >>>>>>>>>>> >>>>>>>>>>> ┌──────────────────┬───────────────┬───────┬────────────────────────┐ >>>>>>>>>>> │ part_base_name │ fw_name │ index >>>>>>>>>>> │ guid >>>>>>>>>>> (fixed) │ >>>>>>>>>>> ├──────────────────|───────────────|───────-| >>>>>>>>>>> ───────────────────────- | >>>>>>>>>>> │ xbl │ QCOM_XBL │ 1 >>>>>>>>>>> │ QCOM_XBL_GUID │ >>>>>>>>>>> │ ubootspl │ QCOM_UBOOTSPL│ 2 │ >>>>>>>>>>> QCOM_UBOOTSPL_GUID │ >>>>>>>>>>> │ uboot │ QCOM_UBOOT │ 3 >>>>>>>>>>> │ QCOM_UBOOT_GUID │ >>>>>>>>>>> └──────────────────┴───────────────┴───────┴────────────────────────┘ >>>>>>>>>>> >>>>>>>>>>> Target-1 supports xbl and Target-2 supports ubootspl. >>>>>>>>>>> >>>>>>>>>>> - At boot, scan the partition table against this table. Only >>>>>>>>>>> partitions actually present on that target get an fw_images[]/ >>>>>>>>>>> ESRT entry >>>>>>>>>>> — nothing hardcoded per target. >>>>>>>>>>> >>>>>>>>>>> - The image index for each partition type stays fixed and >>>>>>>>>>> published, >>>>>>>>>>> so whoever builds a capsule (mkeficapsule) always knows which >>>>>>>>>>> index to >>>>>>>>>>> target, regardless of what's discovered at runtime. >>>>>>>>>>> >>>>>>>>>>> One wrinkle I want to flag: today's SetImage() path assumes >>>>>>>>>>> dfu_alt_num = image_index - 1, i.e. it picks the Nth entry in >>>>>>>>>>> dfu_alt_info purely by >>>>>>>>>>> position. If a partition from the middle of the table is >>>>>>>>>>> missing on a >>>>>>>>>>> given target, everything after it would shift by one position >>>>>>>>>>> and the >>>>>>>>>>> wrong >>>>>>>>>>> partition would get flashed — silently. Since I'd rather >>>>>>>>>>> not touch >>>>>>>>>>> that logic in common code, my plan is to keep every fixed index's >>>>>>>>>>> position in >>>>>>>>>>> dfu_alt_info stable by inserting a placeholder (U-Boot's >>>>>>>>>>> existing >>>>>>>>>>> virt >>>>>>>>>>> DFU backend, which just no-ops) wherever a partition is absent, >>>>>>>>>>> so the >>>>>>>>>>> position >>>>>>>>>>> math stays correct for everything after it. The missing >>>>>>>>>>> partition >>>>>>>>>>> itself simply won't have an fw_images[]/ESRT entry, so a capsule >>>>>>>>>>> can't >>>>>>>>>>> target it >>>>>>>>>>> anyway — it'd get rejected before reaching DFU. >>>>>>>>>> Skipping past this noise... Ilias probably knows better here but >>>>>>>>>> yes the >>>>>>>>>> way dfu_alt_num is derived from ImageIndex does impose a >>>>>>>>>> limitation here >>>>>>>>>> currently where we need to ensure the indexes always start at 1 and >>>>>>>>>> count up. >>>>>>>>>> >>>>>>>>>> That being said, it's already quite complicated to have to >>>>>>>>>> maintain a >>>>>>>>>> database of the indices for each board, and even more complicated >>>>>>>>>> when >>>>>>>>>> we have boards that may or may not be using U-Boot SPL (for >>>>>>>>>> example). >>>>>>>>>> >>>>>>>>>> Having fixed ImageIndex values for each image would then seem to >>>>>>>>>> make >>>>>>>>>> the most sense as we could just use fwu to set dfu_alt_num (or >>>>>>>>>> another >>>>>>>>>> platform specific mechanism), however the EFI spec is clear that the >>>>>>>>>> ImageIndex of EFI_FIRMWARE_IMAGE_DESCRIPTOR must be <= >>>>>>>>>> DescriptorCount >>>>>>>>>> as returned by fmp->GetImageInfo(), so we would need to also have >>>>>>>>>> dummy >>>>>>>>>> entries in the fw_images[] array so it doesn't really solve our >>>>>>>>>> problem. >>>>>>>>>> >>>>>>>>>> https://uefi.org/specs/ >>>>>>>>>> UEFI/2.9_A/23_Firmware_Update_and_Reporting.html >>>>>>>>>> >>>>>>>>>> Currently, other than for setting dfu_alt_num, the only other place >>>>>>>>>> where the image index needs to match is in efi_fmp_find() which was >>>>>>>>>> added by [1] seemingly to prevent an incorrect image index in the >>>>>>>>>> /capsule/ file causing dfu_alt_num to be set wrong resulting in the >>>>>>>>>> wrong partition being flashed. In other words, we should be able >>>>>>>>>> to find >>>>>>>>>> a way to safely remove this check. >>>>>>>>>> >>>>>>>>>> But alas, it seems like we are stuck with fmp->SetImage() being >>>>>>>>>> called >>>>>>>>>> with the image index from the capsule file per the spec, and it >>>>>>>>>> is the >>>>>>>>>> only way to identify the target partition without doing other hacks. >>>>>>>>>> >>>>>>>>>> I'd like to get some feedback from Ilias on this, since adding dummy >>>>>>>>>> entries really doesn't feel like an acceptable approach to me. >>>>>>>>>> The only >>>>>>>>>> alternatives I can think of also don't seem great... Either: >>>>>>>>>> >>>>>>>>>> 1. Sidestep the EFI spec by either caching data in the call to >>>>>>>>>> GetImageInfo() or by assuming that the void *image pointer >>>>>>>>>> immediately >>>>>>>>>> follows the efi_firmware_management_capsule_image_header (this is >>>>>>>>>> true >>>>>>>>>> for us today but would be a fragile assumption to make). >>>>>>>>>> 2. Use the internal image index (looked up via the image name and >>>>>>>>>> type_id) as the index when calling fmp->set_image() - going >>>>>>>>>> against the >>>>>>>>>> spec. >>>>>>>>>> >>>>>>>>>> It's not really clear to me what purpose the ImageIndex property >>>>>>>>>> serves, >>>>>>>>>> since GetImageInfo() is meant to match on the ImageTypeId anyway, I >>>>>>>>>> assume it relates somehow to the fact that there can be multiple >>>>>>>>>> instances of the firmware management protocol, but in U-Boot we only >>>>>>>>>> have one. >>>>>>>>>> >>>>>>>>>> I think the other way forward would be to use the only included >>>>>>>>>> escape >>>>>>>>>> hatch in the UEFI spec with a custom GUID in the capsule header >>>>>>>>>> capsule_guid field which would let us have a custom mechanism >>>>>>>>>> which in >>>>>>>>>> our case could just be a soft-fork of the existing spec with minor >>>>>>>>>> changes so we can just remove/ignore the UpdateImageIndex field >>>>>>>>>> in the >>>>>>>>>> capsule. Maybe this would be the most correct solution? >>>>>>>>>> >>>>>>>>>> Hopefully Ilias has some time to chime in on this, I'm sure we >>>>>>>>>> can find >>>>>>>>>> a way to go about this that doesn't involve exposing dummy data. >>>>>>>>>> >>>>>>>>>> Thanks, >>>>>>>>>> // Casey >>>>>>>>> I feel we are complicating it by trying to go for dynamic fw_images. >>>>>>>>> >>>>>>>>> Rather than introducing a solution that diverges from the UEFI >>>>>>>>> specification, shall we use a board-specific static fw_images[] >>>>>>>> Well, the solution I proposed at the end very much doesn't diverge >>>>>>>> from >>>>>>>> the spec, that was kinda the point. >>>>>>>> >>>>>>>>> definition. This approach is simpler, remains spec-compliant, and >>>>>>>>> other >>>>>>>> Simpler for you to implement or simpler to maintain? I think that's >>>>>>>> quite debatable... >>>>>>>> >>>>>>>>> vendors (like NXP, TI) have also implemented static fw_images (in >>>>>>>>> board/ >>>>>>>>> nxp, board/ti). >>>>>>>> The decision not to do this for mach-snapdragon was quite intentional >>>>>>>> and was the motivator behind dynamic generation of image GUIDs: >>>>>>>> https://lore.kernel.org/u-boot/20240830-b4-dynamic-uuid- >>>>>>>> [email protected]/ >>>>>>>> >>>>>>>> The image index issue was always bound to come up, and it's absolutely >>>>>>>> something we should be solving and not just sidestepping. We already >>>>>>>> support dynamic fw_images[] anyway and it's already being used by some >>>>>>>> devices, so we need to maintain the existing support regardless. >>>>>>>> >>>>>>>> As I understand it, Qualcomm also intend to support multiple boot >>>>>>>> media >>>>>>>> (UFS, eMMC, SPI flash) with a single U-Boot binary, so to some extent >>>>>>>> this array must be dynamic. And since at boot time we have all the >>>>>>>> info >>>>>>>> we need to generate fw_images, keeping a static list per-board is at >>>>>>>> best lazy and at worst will just make things even more complicated >>>>>>>> when >>>>>>>> we suddenly want to support configurations with/without OP-TEE and >>>>>>>> with/without SPL. >>>>>>>> >>>>>>>> So unless I'm missing something here I think there's a strong case >>>>>>>> here >>>>>>>> to add support for ignoring the capsule provided image index, but >>>>>>>> we'll >>>>>>>> see what Ilias has to say when he's back from vacation. >>>>>>> Okay Casey. >>>>>>> >>>>>>> Hi Ilias, >>>>>>> >>>>>>> Request your input on this. >>>>>> So the problem you are trying to fix here, is that you have boards >>>>>> with multiple configurations, that their image index might change, but >>>>>> you want to update them with a single capsule right? >>>>>> >>>>>> If that's the case, we can have a board specific function that does >>>>>> nothing by default, but on the qualcomm case, re-arranges the capsule >>>>>> image indexes *after* the capsule authentication has passed. I think >>>>>> this still violates the EFI spec, but I am ok with it. >>>>>> >>>>>> Cheers >>>>>> /Ilias >>>>> Hi Ilias, >>>>> >>>>> Thanks for the input. Just to make sure we're on the same page: >>>>> >>>>> Our understanding is that we'd add a board-specific hook (default >>>>> no-op, so other vendors are unaffected) that runs after the capsule >>>>> signature is verified but before dfu_alt_num is >>>>> derived from image_index. On Qualcomm boards, this hook would look >>>>> at the partitions actually present at boot and remap the capsule's >>>>> (fixed, published) image_index to whatever position that image >>>>> actually occupies in dfu_alt_info on that specific target — rather >>>>> than assuming a fixed 1:1 mapping between image_index and position. >>>>> >>>>> To be clear on scope: we're not ignoring the image_index value >>>>> itself — it's still read from the capsule and used as-is to look up >>>>> which firmware component (xbl/uboot/etc.) is being >>> no, the entire point is that the image index is bunk, why are you >>> feeding these emails through an LLM? >>> >>>>> targeted. What we're overriding is the spec's assumption that this >>>>> index also encodes position, i.e. that dfu_alt_num = image_index - 1 >>>>> and that image_index stays within descriptor_count. >>> the spec's assumption????? this has nothing to do with the spec >>>>> Since our FMP descriptor list is built dynamically per-board, a >>>>> fixed global index can exceed the descriptor count on boards missing >>>>> some partitions, so we remap it to the correct DFU >>> no >>>>> position ourselves instead. >>>>> >>>>> Is that a correct read of what you had in mind? >>> please use plain text formatting for emails. >>>>> Regards, >>>>> >>>>> Balaji >>>> If the above assumption is correct, then we will have following problems, >>>> >>>> During authentication, U-Boot performs anti-rollback checks. >>>> >>>> As part of this flow, the Image Index is converted to an Image GUID >>>> using fw_images[]. >>>> >>>> Since the capsule Image Index does not match the fw_images[] Image Index >>>> at this stage, the anti-rollback logic may resolve the wrong GUID or >>>> fail to find a matching entry in fw_images[]. >>> I'd like to understand from Ilias why we need to authenticate the >>> firmware first before adjusting the image index, I'd hope we could avoid >>> that? Unless changing the index would invalidate the checksum > I was remembering the FMP parts wrong. Looking at the spec again, it > seems that UpdateImageIndex is not part of the signed payload. So you > can switch it before that. > >>> The image is authenticated inside of fmp->SetImage() at which point we >>> don't have the image type ID or name so it's too late at that point. We >>> would need to adjust it earlier. > Yea that should be fine > >>> perhaps we could go about it another way, what if we add a dfu_alt_num >>> field to efi_fw_image (and add a flag to efi_capsule_update_info to >>> indicate if the new field is valid), then in efi_capsule.c just before >>> we call efi_fmp_find() we can call a new weak function that would adjust >>> the image index of the matching efi_fw_image so it matches whatever is >>> in the capsule. Then we don't have to care what it is since we can use >>> the right dfu_alt_num field anyway. > > Doesn't that have to be defined per board config though? > >>> Maybe this could just all be done in efi_capsule.c and not even need a >>> platform hook, either gated behind a config option or just behind the >>> new efi_fw_image.dfu_alt_num field being used. >>> >>> I worry that's too much of a workaround that might cause issues down the >>> line but I'm not really familiar enough with this to be sure. > I think the workaround is not too big of a hack. You are essentially > remapping some image indexes based on runtime info of the board > because you want a single capsule to support multiple confugurations. Thanks for the suggestion. Will go ahead with this approach and will soon post the series. Regards, Balaji > >> Casey, >> >> We have checked and this approach seems to be fine. In this approach >> though, it comes back to the issue we saw earlier: the image index (from >> the capsule) could be > descriptor count. >> >> If this is fine, then we can proceed with this approach. Atleast we >> won't be creating dummy dfu strings. >> >> Ilias, >> >> Would like to hear your view on this, so we are all on the same page. >> >> Regards, >> >> Balaji >> >>>> Regards, >>>> >>>> Balaji >>>> >>>>>>> Regards, >>>>>>> >>>>>>> Balaji >>>>>>> >>>>>>>>> Regards, >>>>>>>>> >>>>>>>>> Balaji >>>>>>>>> >>>>>>>>>> [1]: 7cf06f09cc51 ("capsule: Put a check for image index before the >>>>>>>>>> update") >>>>>>>>>> >>>>>>>>>>> Let me know if this approach sounds reasonable. >>>>>>>>>>> >>>>>>>>>>> Thanks, >>>>>>>>>>> Balaji >>>>>>>>>>>>> Will send an updated series once the mkeficapsule and qcom >>>>>>>>>>>>> capsule >>>>>>>>>>>>> update changes are in shape. >>>>>>>>>>>>> >>>>>>>>>>>>> [1] https://lore.kernel.org/u-boot/20240419065542.1160527-1- >>>>>>>>>>>>> [email protected]/ >>>>>>>>>>>>> >>>>>>>>>>>>> Regards, >>>>>>>>>>>>> Balaji >>>>>>>>>>>>>> Kind regards,