From: Stephen Warren <swar...@nvidia.com> Each EFI partition table entry contains a UUID. Extend U-Boot's struct disk_partition to be able to store this information, and modify get_partition_info_efi() to fill it in.
The implementation of uuid_string() was stolen from the Linux kernel. Signed-off-by: Stephen Warren <swar...@nvidia.com> --- Note: I made this field part of struct disk_partition, and wrote a generic command to retrieve it, rather than adding an EFI-/GPT-specific command, since I imagine the kernel's PARTUUID support could be extended to support e.g. NT disk signatures, or other partition types, in the future. disk/part.c | 3 +++ disk/part_efi.c | 21 +++++++++++++++++++++ include/part.h | 1 + 3 files changed, 25 insertions(+), 0 deletions(-) diff --git a/disk/part.c b/disk/part.c index 76f3939..266d77e 100644 --- a/disk/part.c +++ b/disk/part.c @@ -294,6 +294,9 @@ void init_part (block_dev_desc_t * dev_desc) int get_partition_info (block_dev_desc_t *dev_desc, int part , disk_partition_t *info) { + /* The common case is no UUID support */ + info->uuid[0] = 0; + switch (dev_desc->part_type) { #ifdef CONFIG_MAC_PARTITION case PART_TYPE_MAC: diff --git a/disk/part_efi.c b/disk/part_efi.c index 02927a0..199c054 100644 --- a/disk/part_efi.c +++ b/disk/part_efi.c @@ -154,6 +154,26 @@ void print_part_efi(block_dev_desc_t * dev_desc) return; } +static void uuid_string(unsigned char *uuid, char *str) +{ + static const u8 le[16] = {3, 2, 1, 0, 5, 4, 7, 6, 8, 9, 10, 11, + 12, 13, 14, 15}; + int i; + + for (i = 0; i < 16; i++) { + sprintf(str, "%02x", uuid[le[i]]); + str += 2; + switch (i) { + case 3: + case 5: + case 7: + case 9: + *str++ = '-'; + break; + } + } +} + int get_partition_info_efi(block_dev_desc_t * dev_desc, int part, disk_partition_t * info) { @@ -183,6 +203,7 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int part, sprintf((char *)info->name, "%s", print_efiname(&gpt_pte[part - 1])); sprintf((char *)info->type, "U-Boot"); + uuid_string(gpt_pte[part - 1].unique_partition_guid.b, info->uuid); debug("%s: start 0x%lX, size 0x%lX, name %s", __func__, info->start, info->size, info->name); diff --git a/include/part.h b/include/part.h index e1478f4..52002f5 100644 --- a/include/part.h +++ b/include/part.h @@ -93,6 +93,7 @@ typedef struct disk_partition { ulong blksz; /* block size in bytes */ uchar name[32]; /* partition name */ uchar type[32]; /* string type description */ + char uuid[37]; /* filesystem UUID as string, if exists */ } disk_partition_t; /* Misc _get_dev functions */ -- 1.7.0.4 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot