[U-Boot] [PATCH 2/3] gpt: add optional parameter guid in gpt command

Rob Herring robh at kernel.org
Thu Oct 15 22:58:24 CEST 2015


On Tue, Oct 13, 2015 at 9:23 AM, Patrick Delaunay
<patrick.delaunay73 at gmail.com> wrote:
> code under flag CONFIG_PARTITION_TYPE_GUID
> add parameter guid to select partition type guid
>
> example of use with gpt command :
>
>   partitions = uuid_disk=${uuid_gpt_disk};name=boot,start=0x4400,
>   size=0x6bc00,uuid=${uuid_gpt_boot};name=root,start=0x70000,
>   size=0x7538ba00,uuid=${uuid_gpt_root},
>   guid=0fc63daf-8483-4772-8e79-3d69d8477de4;

The mixture of UUID and GUID is confusing. What we want are the
GUIDs/UUIDs for unique ID and the partition type. I would just call
the partition type "type". This would allow the same format to be used
for MBR partitions if someone wanted to do support for that.

Rob

>
>   gpt write mmc 0 $partitions
>
> Signed-off-by: Patrick Delaunay <patrick.delaunay73 at gmail.com>
> ---
>
>  common/cmd_gpt.c | 17 +++++++++++++++++
>  disk/part.c      |  9 +++++++++
>  disk/part_efi.c  | 25 +++++++++++++++++++++++++
>  include/part.h   |  3 +++
>  4 files changed, 54 insertions(+)
>
> diff --git a/common/cmd_gpt.c b/common/cmd_gpt.c
> index c56fe15..1e8f927 100644
> --- a/common/cmd_gpt.c
> +++ b/common/cmd_gpt.c
> @@ -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, "guid");
> +        if (val) {
> +            /* 'guid' is optional */
> +            if (extract_env(val, &p))
> +                p = val;
> +            if (strlen(p) >= sizeof(parts[i].guid)) {
> +                printf("Wrong guid format for partition %d\n",
> +                       i);
> +                errno = -4;
> +                goto err;
> +            }
> +            strcpy((char *)parts[i].guid, p);
> +            free(val);
> +        }
> +#endif
>          /* name */
>          val = extract_val(tok, "name");
>          if (!val) { /* name is mandatory */
> diff --git a/disk/part.c b/disk/part.c
> index 43485c9..316454d 100644
> --- a/disk/part.c
> +++ b/disk/part.c
> @@ -391,6 +391,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_GUIDS
> +    info->guid[0] = 0;
> +#endif
>
>      switch (dev_desc->part_type) {
>  #ifdef CONFIG_MAC_PARTITION
> @@ -526,6 +529,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_GUIDS
> +        info->guid[0] = 0;
> +#endif
>
>          return 0;
>      }
> @@ -610,6 +616,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_GUIDS
> +        info->guid[0] = 0;
> +#endif
>
>          ret = 0;
>          goto cleanup;
> diff --git a/disk/part_efi.c b/disk/part_efi.c
> index 15627f2..25bf8f9 100644
> --- a/disk/part_efi.c
> +++ b/disk/part_efi.c
> @@ -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->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_guid;
> +    unsigned char *bin_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_guid = partitions[i].guid;
> +        bin_guid = gpt_e[i].partition_type_guid.b;
> +        if (strlen(str_guid)) {
> +            if (uuid_str_to_bin(str_guid, bin_guid,
> +                        UUID_STR_FORMAT_GUID)) {
> +                printf("Partition no. %d: invalid type guid: %s\n",
> +                       i, str_guid);
> +                return -1;
> +            }
> +        } else {
> +            /* default partition type GUID */
> +            memcpy(bin_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;
> diff --git a/include/part.h b/include/part.h
> index 8ea9b30..d57d284 100644
> --- a/include/part.h
> +++ b/include/part.h
> @@ -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    guid[37];    /* type GUID as string, if exists    */
> +#endif
>  } disk_partition_t;
>
>  /* Misc _get_dev functions */
> --
> 1.9.1
>
>


More information about the U-Boot mailing list