]> git.ipfire.org Git - people/ms/u-boot.git/commitdiff
gpt: add optional parameter type in gpt command
authorPatrick Delaunay <patrick.delaunay73@gmail.com>
Tue, 27 Oct 2015 10:00:27 +0000 (11:00 +0100)
committerTom Rini <trini@konsulko.com>
Thu, 12 Nov 2015 20:58:58 +0000 (15:58 -0500)
code under flag CONFIG_PARTITION_TYPE_GUID
add parameter "type" to select partition type guid

example of use with gpt command :

  partitions = uuid_disk=${uuid_gpt_disk}; \
      name=boot,size=0x6bc00,uuid=${uuid_gpt_boot}; \
      name=root,size=0x7538ba00,uuid=${uuid_gpt_root}, \
         type=0fc63daf-8483-4772-8e79-3d69d8477de4;

  gpt write mmc 0 $partitions

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

index c56fe15d3b7ca6303da35031e08836ecce52f3c9..e3c0297a1ce5bdb89f3c9d687296f064a9c67890 100644 (file)
@@ -218,6 +218,23 @@ static int set_gpt_info(block_dev_desc_t *dev_desc,
                        strcpy((char *)parts[i].uuid, p);
                        free(val);
                }
+#ifdef CONFIG_PARTITION_TYPE_GUID
+               /* guid */
+               val = extract_val(tok, "type");
+               if (val) {
+                       /* 'type' is optional */
+                       if (extract_env(val, &p))
+                               p = val;
+                       if (strlen(p) >= sizeof(parts[i].type_guid)) {
+                               printf("Wrong type guid format for partition %d\n",
+                                      i);
+                               errno = -4;
+                               goto err;
+                       }
+                       strcpy((char *)parts[i].type_guid, p);
+                       free(val);
+               }
+#endif
                /* name */
                val = extract_val(tok, "name");
                if (!val) { /* name is mandatory */
index e57a252d948dfb4fc3f6c69533c44241673afb01..909712e5011932dfe9acfff008ca58e145ade1f2 100644 (file)
@@ -392,6 +392,9 @@ int get_partition_info(block_dev_desc_t *dev_desc, int part,
        /* The common case is no UUID support */
        info->uuid[0] = 0;
 #endif
+#ifdef CONFIG_PARTITION_TYPE_GUID
+       info->type_guid[0] = 0;
+#endif
 
        switch (dev_desc->part_type) {
 #ifdef CONFIG_MAC_PARTITION
@@ -532,6 +535,9 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str,
 #ifdef CONFIG_PARTITION_UUIDS
                info->uuid[0] = 0;
 #endif
+#ifdef CONFIG_PARTITION_TYPE_GUID
+               info->type_guid[0] = 0;
+#endif
 
                return 0;
        }
@@ -639,6 +645,9 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str,
 #ifdef CONFIG_PARTITION_UUIDS
                info->uuid[0] = 0;
 #endif
+#ifdef CONFIG_PARTITION_TYPE_GUID
+               info->type_guid[0] = 0;
+#endif
 
                ret = 0;
                goto cleanup;
index 15627f29e8bd4ad33ba1688ad846d131e9c0cb8c..c124143bd9f9b87ba32dbf7ab3b037f42a4f5c38 100644 (file)
@@ -283,6 +283,10 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int part,
        uuid_bin_to_str(gpt_pte[part - 1].unique_partition_guid.b, info->uuid,
                        UUID_STR_FORMAT_GUID);
 #endif
+#ifdef CONFIG_PARTITION_TYPE_GUID
+       uuid_bin_to_str(gpt_pte[part - 1].partition_type_guid.b,
+                       info->type_guid, UUID_STR_FORMAT_GUID);
+#endif
 
        debug("%s: start 0x" LBAF ", size 0x" LBAF ", name %s\n", __func__,
              info->start, info->size, info->name);
@@ -419,6 +423,10 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
        char *str_uuid;
        unsigned char *bin_uuid;
 #endif
+#ifdef CONFIG_PARTITION_TYPE_GUID
+       char *str_type_guid;
+       unsigned char *bin_type_guid;
+#endif
 
        for (i = 0; i < parts; i++) {
                /* partition starting lba */
@@ -445,9 +453,26 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
                else
                        gpt_e[i].ending_lba = cpu_to_le64(offset - 1);
 
+#ifdef CONFIG_PARTITION_TYPE_GUID
+               str_type_guid = partitions[i].type_guid;
+               bin_type_guid = gpt_e[i].partition_type_guid.b;
+               if (strlen(str_type_guid)) {
+                       if (uuid_str_to_bin(str_type_guid, bin_type_guid,
+                                           UUID_STR_FORMAT_GUID)) {
+                               printf("Partition no. %d: invalid type guid: %s\n",
+                                      i, str_type_guid);
+                               return -1;
+                       }
+               } else {
+                       /* default partition type GUID */
+                       memcpy(bin_type_guid,
+                              &PARTITION_BASIC_DATA_GUID, 16);
+               }
+#else
                /* partition type GUID */
                memcpy(gpt_e[i].partition_type_guid.b,
                        &PARTITION_BASIC_DATA_GUID, 16);
+#endif
 
 #ifdef CONFIG_PARTITION_UUIDS
                str_uuid = partitions[i].uuid;
index 6e298d211a2d3376f4eba93290d59dcefefd6397..bf9b8bd2781c6ec32a5eea44e4b88301f84f1030 100644 (file)
@@ -171,6 +171,19 @@ To restore GUID partition table one needs to:
 2. From u-boot prompt type:
    gpt write mmc 0 $partitions
 
+Partition type GUID:
+====================
+
+For created partition, the used partition type GUID is
+PARTITION_BASIC_DATA_GUID (EBD0A0A2-B9E5-4433-87C0-68B6B72699C7).
+
+If you define 'CONFIG_PARTITION_TYPE_GUID', a optionnal parameter 'type'
+can specify a other partition type guid:
+
+     "partitions=uuid_disk=...;name=u-boot,size=60MiB,uuid=...;
+       name=kernel,size=60MiB,uuid=...,
+       type=0FC63DAF-8483-4772-8E79-3D69D8477DE4;"
+
 Useful info:
 ============
 
index 8ea9b3049a4989daa02fa06dda99f3f00232f47b..8b5ac12e2ba387b6f55f9d123136cfcb3049f439 100644 (file)
@@ -93,6 +93,9 @@ typedef struct disk_partition {
 #ifdef CONFIG_PARTITION_UUIDS
        char    uuid[37];       /* filesystem UUID as string, if exists */
 #endif
+#ifdef CONFIG_PARTITION_TYPE_GUID
+       char    type_guid[37];  /* type GUID as string, if exists       */
+#endif
 } disk_partition_t;
 
 /* Misc _get_dev functions */