提交 7561b258 编写于 作者: P Patrick Delaunay 提交者: Tom Rini

gpt: add optional parameter type in gpt command

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: NPatrick Delaunay <patrick.delaunay73@gmail.com>
上级 b38c108a
...@@ -218,6 +218,23 @@ static int set_gpt_info(block_dev_desc_t *dev_desc, ...@@ -218,6 +218,23 @@ static int set_gpt_info(block_dev_desc_t *dev_desc,
strcpy((char *)parts[i].uuid, p); strcpy((char *)parts[i].uuid, p);
free(val); 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 */ /* name */
val = extract_val(tok, "name"); val = extract_val(tok, "name");
if (!val) { /* name is mandatory */ if (!val) { /* name is mandatory */
......
...@@ -392,6 +392,9 @@ int get_partition_info(block_dev_desc_t *dev_desc, int part, ...@@ -392,6 +392,9 @@ int get_partition_info(block_dev_desc_t *dev_desc, int part,
/* The common case is no UUID support */ /* The common case is no UUID support */
info->uuid[0] = 0; info->uuid[0] = 0;
#endif #endif
#ifdef CONFIG_PARTITION_TYPE_GUID
info->type_guid[0] = 0;
#endif
switch (dev_desc->part_type) { switch (dev_desc->part_type) {
#ifdef CONFIG_MAC_PARTITION #ifdef CONFIG_MAC_PARTITION
...@@ -532,6 +535,9 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str, ...@@ -532,6 +535,9 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str,
#ifdef CONFIG_PARTITION_UUIDS #ifdef CONFIG_PARTITION_UUIDS
info->uuid[0] = 0; info->uuid[0] = 0;
#endif #endif
#ifdef CONFIG_PARTITION_TYPE_GUID
info->type_guid[0] = 0;
#endif
return 0; return 0;
} }
...@@ -639,6 +645,9 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str, ...@@ -639,6 +645,9 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str,
#ifdef CONFIG_PARTITION_UUIDS #ifdef CONFIG_PARTITION_UUIDS
info->uuid[0] = 0; info->uuid[0] = 0;
#endif #endif
#ifdef CONFIG_PARTITION_TYPE_GUID
info->type_guid[0] = 0;
#endif
ret = 0; ret = 0;
goto cleanup; goto cleanup;
......
...@@ -283,6 +283,10 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int part, ...@@ -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_bin_to_str(gpt_pte[part - 1].unique_partition_guid.b, info->uuid,
UUID_STR_FORMAT_GUID); UUID_STR_FORMAT_GUID);
#endif #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__, debug("%s: start 0x" LBAF ", size 0x" LBAF ", name %s\n", __func__,
info->start, info->size, info->name); info->start, info->size, info->name);
...@@ -419,6 +423,10 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e, ...@@ -419,6 +423,10 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
char *str_uuid; char *str_uuid;
unsigned char *bin_uuid; unsigned char *bin_uuid;
#endif #endif
#ifdef CONFIG_PARTITION_TYPE_GUID
char *str_type_guid;
unsigned char *bin_type_guid;
#endif
for (i = 0; i < parts; i++) { for (i = 0; i < parts; i++) {
/* partition starting lba */ /* partition starting lba */
...@@ -445,9 +453,26 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e, ...@@ -445,9 +453,26 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
else else
gpt_e[i].ending_lba = cpu_to_le64(offset - 1); 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 */ /* partition type GUID */
memcpy(gpt_e[i].partition_type_guid.b, memcpy(gpt_e[i].partition_type_guid.b,
&PARTITION_BASIC_DATA_GUID, 16); &PARTITION_BASIC_DATA_GUID, 16);
#endif
#ifdef CONFIG_PARTITION_UUIDS #ifdef CONFIG_PARTITION_UUIDS
str_uuid = partitions[i].uuid; str_uuid = partitions[i].uuid;
......
...@@ -171,6 +171,19 @@ To restore GUID partition table one needs to: ...@@ -171,6 +171,19 @@ To restore GUID partition table one needs to:
2. From u-boot prompt type: 2. From u-boot prompt type:
gpt write mmc 0 $partitions 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: Useful info:
============ ============
......
...@@ -93,6 +93,9 @@ typedef struct disk_partition { ...@@ -93,6 +93,9 @@ typedef struct disk_partition {
#ifdef CONFIG_PARTITION_UUIDS #ifdef CONFIG_PARTITION_UUIDS
char uuid[37]; /* filesystem UUID as string, if exists */ char uuid[37]; /* filesystem UUID as string, if exists */
#endif #endif
#ifdef CONFIG_PARTITION_TYPE_GUID
char type_guid[37]; /* type GUID as string, if exists */
#endif
} disk_partition_t; } disk_partition_t;
/* Misc _get_dev functions */ /* Misc _get_dev functions */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册