uuid: add selection by string for known partition type GUID

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>
diff --git a/lib/uuid.c b/lib/uuid.c
index f6b4423..c8584ed 100644
--- a/lib/uuid.c
+++ b/lib/uuid.c
@@ -80,10 +80,65 @@
 	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 @@
 	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));