Re: [PATCH 1/6] disk: part_efi: Size the partition entry array from the block size
Simon Glass <[email protected]> Tue, 4 Aug 2026 07:05:30 -0600
| Newsgroups | gmane.comp.boot-loaders.u-boot |
|---|---|
| Message-ID | <CAFLszTi3gEBx331wH2bNLh+8rZ7vVip0BQ0rnQXUPyoyiF0CrQ@mail.gmail.com> |
On 2026-07-31T12:39:59, Alexey Charkov <[email protected]> wrote: > disk: part_efi: Size the partition entry array from the block size > > gpt_fill_header() computes last_usable_lba and first_usable_lba from > hardcoded block counts that silently assumes 512-byte sectors and the > default number of partition entries. > > The partition entry array holds GPT_ENTRY_NUMBERS entries of 128 bytes > each, so the number of blocks it needs depends on both the entry count > and the block size. write_gpt_table() derives that count correctly and > writes the backup array at last_usable_lba + 1, so whenever the two > disagree the backup array no longer immediately precedes the backup GPT > header. Furthermore, on a device with 4096-byte native sectors, such as > UFS flash, and the default 128 entries, the array is 4 blocks rather than > 32. Current code reserves 34 blocks at each end of the disk for any block > size and wastes about 114 KiB at each end. > > Add a new helper gpt_pte_blocks() and use it in all four places which > currently calculate the number of blocks each in its own way, so the > layout written by gpt_fill_header() and the extent written by > write_gpt_table() cannot drift apart again. With this, first_usable_lba > on 4096-byte sectors is 6, last_usable_lba is lba - 6, and the backup > array occupies lba - 5 .. lba - 2, immediately preceding the backup > header, as the UEFI specification describes. > > Note that this changes the 512-byte layout too for boards that do not use > the default entry count. CONFIG_EFI_PARTITION_ENTRIES_NUMBERS is > "default 56 if ARCH_SUNXI" and is set to 64 by a number of Rockchip > defconfigs: > > entries array blocks first_usable_lba last_usable_lba > 56 14 34 -> 16 lba - 34 -> lba - 16 > 64 16 34 -> 18 lba - 34 -> lba - 18 > 128 32 34 -> 34 lba - 34 -> lba - 34 > > Existing partition tables stay readable either way, since is_gpt_valid() > locates the entry array from the on-disk partition_entry_lba. Only newly > written tables change. Partitions given without an explicit start= will > now be placed lower on those boards; on sunxi first_usable_lba lands on > the 8 KiB SPL offset, so such boards should keep specifying start= > explicitly. > > While here, report both LBAs when the requested layout does not fit, since > the existing "Partitions layout exceeds disk size" debug message gives no > clue as to by how much, making it less helpful in debugging. > > Co-developed-by: Anton Burticica <[email protected]> > Signed-off-by: Anton Burticica <[email protected]> > Signed-off-by: Alexey Charkov <[email protected]> > > disk/part_efi.c | 47 +++++++++++++++++++++++++++++++++++------------ > 1 file changed, 35 insertions(+), 12 deletions(-) Reviewed-by: Simon Glass <[email protected]>