diff mbox

[U-Boot,v2,2/3] gpt: add optional parameter type in gpt command

Message ID 1445429689-26361-2-git-send-email-patrick.delaunay73@gmail.com
State Changes Requested
Delegated to: Tom Rini
Headers show

Commit Message

Patrick Delaunay Oct. 21, 2015, 12:14 p.m. UTC
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>
---

Changes in v2:
- change guid to type in gpt command parameter
- change guid to type_guid  in disk_partition_t
- remove 'S' at the end of some flag CONFIG_PARTITION_TYPE_GUID

 common/cmd_gpt.c | 17 +++++++++++++++++
 disk/part.c      |  9 +++++++++
 disk/part_efi.c  | 25 +++++++++++++++++++++++++
 include/part.h   |  3 +++
 4 files changed, 54 insertions(+)

Comments

Simon Glass Oct. 21, 2015, 11:24 p.m. UTC | #1
Hi Patrick,

On 21 October 2015 at 06:14, Patrick Delaunay
<patrick.delaunay73@gmail.com> wrote:
> 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>
> ---
>
> Changes in v2:
> - change guid to type in gpt command parameter
> - change guid to type_guid  in disk_partition_t
> - remove 'S' at the end of some flag CONFIG_PARTITION_TYPE_GUID
>
>  common/cmd_gpt.c | 17 +++++++++++++++++
>  disk/part.c      |  9 +++++++++
>  disk/part_efi.c  | 25 +++++++++++++++++++++++++
>  include/part.h   |  3 +++
>  4 files changed, 54 insertions(+)

Can you add some documentation somewhere for these patches?

Regards,
Simon
Tom Rini Oct. 23, 2015, 4:52 p.m. UTC | #2
On Wed, Oct 21, 2015 at 02:14:48PM +0200, Patrick Delaunay wrote:

> 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>

Reviewed-by: Tom Rini <trini@konsulko.com>

But I want to echo Simon's comment that we should update the docs a bit,
perhaps a few more words and an example in doc/README.gpt.
Patrick Delaunay Oct. 27, 2015, 9:51 a.m. UTC | #3
Hi,

Ok. I will provided documentation update in version 3.

Patrick
Le 23 oct. 2015 6:52 PM, "Tom Rini" <trini@konsulko.com> a écrit :

> On Wed, Oct 21, 2015 at 02:14:48PM +0200, Patrick Delaunay wrote:
>
> > 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>
>
> Reviewed-by: Tom Rini <trini@konsulko.com>
>
> But I want to echo Simon's comment that we should update the docs a bit,
> perhaps a few more words and an example in doc/README.gpt.
>
> --
> Tom
>
diff mbox

Patch

diff --git a/common/cmd_gpt.c b/common/cmd_gpt.c
index c56fe15..e3c0297 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, "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 */
diff --git a/disk/part.c b/disk/part.c
index 43485c9..a47ec8c 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_GUID
+	info->type_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_GUID
+		info->type_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_GUID
+		info->type_guid[0] = 0;
+#endif
 
 		ret = 0;
 		goto cleanup;
diff --git a/disk/part_efi.c b/disk/part_efi.c
index 15627f2..c124143 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->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;
diff --git a/include/part.h b/include/part.h
index 8ea9b30..8b5ac12 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	type_guid[37];	/* type GUID as string, if exists	*/
+#endif
 } disk_partition_t;
 
 /* Misc _get_dev functions */