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

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;
gpt write mmc 0 $partitions
Signed-off-by: Patrick Delaunay patrick.delaunay73@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 */

On Tue, Oct 13, 2015 at 9:23 AM, Patrick Delaunay patrick.delaunay73@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@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

On Thu, Oct 15, 2015 at 03:58:24PM -0500, Rob Herring wrote:
On Tue, Oct 13, 2015 at 9:23 AM, Patrick Delaunay patrick.delaunay73@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.
... and if someone wants to add MBR support, there's enough use cases for it (mainly around flashing/factory stuff) that I wouldn't object. So yes, lets do this with that kind of thing in mind.

2015-10-15 23:46 GMT+02:00 Tom Rini trini@konsulko.com:
On Thu, Oct 15, 2015 at 03:58:24PM -0500, Rob Herring wrote:
On Tue, Oct 13, 2015 at 9:23 AM, Patrick Delaunay patrick.delaunay73@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.
... and if someone wants to add MBR support, there's enough use cases for it (mainly around flashing/factory stuff) that I wouldn't object. So yes, lets do this with that kind of thing in mind.
Hi,
if you prefer, I can modify the parameter name to "type" as proposed in a version 2 of the patchset.
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},type=0fc63daf-8483-4772-8e79-3d69d8477de4;
and to be coherent, I will also modify the field in the struct disk_partition_t to type_guid
+#ifdef CONFIG_PARTITION_TYPE_GUID + char type_guid[37]; /* type GUID as string, if exists */ +#endif } disk_partition_t;
Patrick

On Mon, Oct 19, 2015 at 04:59:28PM +0200, Patrick Delaunay wrote:
2015-10-15 23:46 GMT+02:00 Tom Rini trini@konsulko.com:
On Thu, Oct 15, 2015 at 03:58:24PM -0500, Rob Herring wrote:
On Tue, Oct 13, 2015 at 9:23 AM, Patrick Delaunay patrick.delaunay73@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.
... and if someone wants to add MBR support, there's enough use cases for it (mainly around flashing/factory stuff) that I wouldn't object. So yes, lets do this with that kind of thing in mind.
Hi,
if you prefer, I can modify the parameter name to "type" as proposed in a version 2 of the patchset.
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},type=0fc63daf-8483-4772-8e79-3d69d8477de4;
and to be coherent, I will also modify the field in the struct disk_partition_t to type_guid
+#ifdef CONFIG_PARTITION_TYPE_GUID
- char type_guid[37]; /* type GUID as string, if exists */
+#endif } disk_partition_t;
Sounds like a plan, thanks!
participants (3)
-
Patrick Delaunay
-
Rob Herring
-
Tom Rini