uuid: add selection by string for known partition type GUID
authorPatrick Delaunay <patrick.delaunay73@gmail.com>
Tue, 27 Oct 2015 10:00:28 +0000 (11:00 +0100)
committerTom Rini <trini@konsulko.com>
Thu, 12 Nov 2015 20:58:58 +0000 (15:58 -0500)
short strings can be used in type parameter of gpt command
to replace the guid string for the types known by u-boot

      partitions = name=boot,size=0x6bc00,type=data; \
                   name=root,size=0x7538ba00,type=linux;
      gpt write mmc 0 $partitions

and they are also used to display the type of partition
in "part list" command

  Partition Map for MMC device 0  --   Partition Type: EFI

  Part Start LBA End LBA Name
Attributes
Type GUID
Partition GUID
    1 0x00000022 0x0000037f "boot"
attrs: 0x0000000000000000
type: ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
type: data
guid: d117f98e-6f2c-d04b-a5b2-331a19f91cb2
    2 0x00000380 0x003a9fdc "root"
attrs: 0x0000000000000000
type: 0fc63daf-8483-4772-8e79-3d69d8477de4
type: linux
guid: 25718777-d0ad-7443-9e60-02cb591c9737

Signed-off-by: Patrick Delaunay <patrick.delaunay73@gmail.com>
disk/part_efi.c
doc/README.gpt
include/uuid.h
lib/uuid.c

index c124143bd9f9b87ba32dbf7ab3b037f42a4f5c38..ea9c615ee581c32ad3816a55bdd40e64439450b1 100644 (file)
@@ -223,6 +223,10 @@ void print_part_efi(block_dev_desc_t * dev_desc)
                uuid_bin = (unsigned char *)gpt_pte[i].partition_type_guid.b;
                uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID);
                printf("\ttype:\t%s\n", uuid);
+#ifdef CONFIG_PARTITION_TYPE_GUID
+               if (!uuid_guid_get_str(uuid_bin, uuid))
+                       printf("\ttype:\t%s\n", uuid);
+#endif
                uuid_bin = (unsigned char *)gpt_pte[i].unique_partition_guid.b;
                uuid_bin_to_str(uuid_bin, uuid, UUID_STR_FORMAT_GUID);
                printf("\tguid:\t%s\n", uuid);
index bf9b8bd2781c6ec32a5eea44e4b88301f84f1030..35902ce0c882fd8be6d6279046085528307da39d 100644 (file)
@@ -184,6 +184,30 @@ can specify a other partition type guid:
        name=kernel,size=60MiB,uuid=...,
        type=0FC63DAF-8483-4772-8E79-3D69D8477DE4;"
 
+Some strings can be also used at the place of known GUID :
+       "system" = PARTITION_SYSTEM_GUID
+                  (C12A7328-F81F-11D2-BA4B-00A0C93EC93B)
+       "mbr"    = LEGACY_MBR_PARTITION_GUID
+                  (024DEE41-33E7-11D3-9D69-0008C781F39F)
+       "msft"   = PARTITION_MSFT_RESERVED_GUID
+                  (E3C9E316-0B5C-4DB8-817D-F92DF00215AE)
+       "data"   = PARTITION_BASIC_DATA_GUID
+                   (EBD0A0A2-B9E5-4433-87C0-68B6B72699C7)
+       "linux"  = PARTITION_LINUX_FILE_SYSTEM_DATA_GUID
+                  (0FC63DAF-8483-4772-8E79-3D69D8477DE4)
+       "raid"   = PARTITION_LINUX_RAID_GUID
+                  (A19D880F-05FC-4D3B-A006-743F0F84911E)
+       "swap"   = PARTITION_LINUX_SWAP_GUID
+                  (0657FD6D-A4AB-43C4-84E5-0933C84B4F4F)
+       "lvm"    = PARTITION_LINUX_LVM_GUID
+                  (E6D6D379-F507-44C2-A23C-238F2A3DF928)
+
+    "partitions=uuid_disk=...;name=u-boot,size=60MiB,uuid=...;
+       name=kernel,size=60MiB,uuid=...,type=linux;"
+
+They are also used to display the type of partition in "part list" command.
+
+
 Useful info:
 ============
 
index 93027c1b286952650fc3e25e3fa90c504f2fcebd..c3f423fab47848e74445af2cdead0419daebbf67 100644 (file)
@@ -36,6 +36,10 @@ enum {
 int uuid_str_valid(const char *uuid);
 int uuid_str_to_bin(char *uuid_str, unsigned char *uuid_bin, int str_format);
 void uuid_bin_to_str(unsigned char *uuid_bin, char *uuid_str, int str_format);
+#ifdef CONFIG_PARTITION_TYPE_GUID
+int uuid_guid_get_bin(const char *guid_str, unsigned char *guid_bin);
+int uuid_guid_get_str(unsigned char *guid_bin, char *guid_str);
+#endif
 void gen_rand_uuid(unsigned char *uuid_bin);
 void gen_rand_uuid_str(char *uuid_str, int str_format);
 #endif
index f6b442355170927c207d5087e29e1241efc9c09f..c8584edcb861ad7e15ad207a8a27d83e822be56a 100644 (file)
@@ -80,10 +80,65 @@ int uuid_str_valid(const char *uuid)
        return 1;
 }
 
+#ifdef CONFIG_PARTITION_TYPE_GUID
+static const struct {
+       const char *string;
+       efi_guid_t guid;
+} list_guid[] = {
+       {"system",      PARTITION_SYSTEM_GUID},
+       {"mbr",         LEGACY_MBR_PARTITION_GUID},
+       {"msft",        PARTITION_MSFT_RESERVED_GUID},
+       {"data",        PARTITION_BASIC_DATA_GUID},
+       {"linux",       PARTITION_LINUX_FILE_SYSTEM_DATA_GUID},
+       {"raid",        PARTITION_LINUX_RAID_GUID},
+       {"swap",        PARTITION_LINUX_SWAP_GUID},
+       {"lvm",         PARTITION_LINUX_LVM_GUID}
+};
+
+/*
+ * uuid_guid_get_bin() - this function get GUID bin for string
+ *
+ * @param guid_str - pointer to partition type string
+ * @param guid_bin - pointer to allocated array for big endian output [16B]
+ */
+int uuid_guid_get_bin(const char *guid_str, unsigned char *guid_bin)
+{
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(list_guid); i++) {
+               if (!strcmp(list_guid[i].string, guid_str)) {
+                       memcpy(guid_bin, &list_guid[i].guid, 16);
+                       return 0;
+               }
+       }
+       return -ENODEV;
+}
+
+/*
+ * uuid_guid_get_str() - this function get string for GUID.
+ *
+ * @param guid_bin - pointer to string with partition type guid [16B]
+ * @param guid_str - pointer to allocated partition type string [7B]
+ */
+int uuid_guid_get_str(unsigned char *guid_bin, char *guid_str)
+{
+       int i;
+
+       *guid_str = 0;
+       for (i = 0; i < ARRAY_SIZE(list_guid); i++) {
+               if (!memcmp(list_guid[i].guid.b, guid_bin, 16)) {
+                       strcpy(guid_str, list_guid[i].string);
+                       return 0;
+               }
+       }
+       return -ENODEV;
+}
+#endif
+
 /*
  * uuid_str_to_bin() - convert string UUID or GUID to big endian binary data.
  *
- * @param uuid_str - pointer to UUID or GUID string [37B]
+ * @param uuid_str - pointer to UUID or GUID string [37B] or GUID shorcut
  * @param uuid_bin - pointer to allocated array for big endian output [16B]
  * @str_format     - UUID string format: 0 - UUID; 1 - GUID
  */
@@ -93,8 +148,13 @@ int uuid_str_to_bin(char *uuid_str, unsigned char *uuid_bin, int str_format)
        uint32_t tmp32;
        uint64_t tmp64;
 
-       if (!uuid_str_valid(uuid_str))
+       if (!uuid_str_valid(uuid_str)) {
+#ifdef CONFIG_PARTITION_TYPE_GUID
+               if (!uuid_guid_get_bin(uuid_str, uuid_bin))
+                       return 0;
+#endif
                return -EINVAL;
+       }
 
        if (str_format == UUID_STR_FORMAT_STD) {
                tmp32 = cpu_to_be32(simple_strtoul(uuid_str, NULL, 16));