diff options
author | Stephen Warren <swarren@nvidia.com> | 2012-09-21 09:50:59 +0000 |
---|---|---|
committer | Tom Rini <trini@ti.com> | 2012-09-25 15:05:44 -0700 |
commit | 894bfbbfb772de2f8640f91aee322f3cb2577cb7 (patch) | |
tree | e75c671a8826b41d81059227868d0ef86b4557de | |
parent | c04d68c69458526d30bd542ff2f8f83cc20ccfc5 (diff) |
disk: part_efi: parse and store partition UUID
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 derived from the Linux kernel,
tag v3.6-rc4 file lib/vsprintf.c function uuid_string().
Signed-off-by: Stephen Warren <swarren@nvidia.com>
-rw-r--r-- | disk/part.c | 5 | ||||
-rw-r--r-- | disk/part_efi.c | 25 | ||||
-rw-r--r-- | include/part.h | 3 |
3 files changed, 33 insertions, 0 deletions
diff --git a/disk/part.c b/disk/part.c index 0dd4b0f0c63..64d76e83806 100644 --- a/disk/part.c +++ b/disk/part.c @@ -391,6 +391,11 @@ int get_partition_info(block_dev_desc_t *dev_desc, int part defined(CONFIG_MMC) || \ defined(CONFIG_SYSTEMACE) +#ifdef CONFIG_PARTITION_UUIDS + /* The common case is no UUID support */ + info->uuid[0] = 0; +#endif + 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 2962fd8f671..264ea9c77f6 100644 --- a/disk/part_efi.c +++ b/disk/part_efi.c @@ -154,6 +154,28 @@ void print_part_efi(block_dev_desc_t * dev_desc) return; } +#ifdef CONFIG_PARTITION_UUIDS +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; + } + } +} +#endif + int get_partition_info_efi(block_dev_desc_t * dev_desc, int part, disk_partition_t * info) { @@ -190,6 +212,9 @@ 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"); +#ifdef CONFIG_PARTITION_UUIDS + uuid_string(gpt_pte[part - 1].unique_partition_guid.b, info->uuid); +#endif 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 3f780a1f925..27ea283f1ed 100644 --- a/include/part.h +++ b/include/part.h @@ -94,6 +94,9 @@ typedef struct disk_partition { uchar name[32]; /* partition name */ uchar type[32]; /* string type description */ int bootable; /* Active/Bootable flag is set */ +#ifdef CONFIG_PARTITION_UUIDS + char uuid[37]; /* filesystem UUID as string, if exists */ +#endif } disk_partition_t; /* Misc _get_dev functions */ |