cmd: gpt: Add option to write GPT partitions to environment variable

This change would enhance the existing 'gpt read' command to allow
(optionally) writing of the read GPT partitions to an environment
variable in the UBOOT partitions layout format. This would allow users
to easily change the overall partition settings by editing said variable
and then using the variable in the 'gpt write' and 'gpt verify' commands.

Signed-off-by: Farhan Ali <farhan.ali@broadcom.com>
Cc: Simon Glass <sjg@chromium.org>
Cc: Heinrich Schuchardt <xypron.glpk@gmx.de>
Cc: Corneliu Doban <cdoban@broadcom.com>
Cc: Rayagonda Kokatanur <rayagonda.kokatanur@broadcom.com>
Cc: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Farhan Ali 2021-02-26 10:17:33 -08:00 committed by Tom Rini
parent 8c72842af5
commit 653cd92d66
2 changed files with 55 additions and 8 deletions

View File

@ -350,17 +350,46 @@ static int get_gpt_info(struct blk_desc *dev_desc)
} }
/* a wrapper to test get_gpt_info */ /* a wrapper to test get_gpt_info */
static int do_get_gpt_info(struct blk_desc *dev_desc) static int do_get_gpt_info(struct blk_desc *dev_desc, char * const namestr)
{ {
int ret; int numparts;
ret = get_gpt_info(dev_desc); numparts = get_gpt_info(dev_desc);
if (ret > 0) {
if (numparts > 0) {
if (namestr) {
char disk_guid[UUID_STR_LEN + 1];
char *partitions_list;
int partlistlen;
int ret = -1;
ret = get_disk_guid(dev_desc, disk_guid);
if (ret < 0)
return ret;
partlistlen = calc_parts_list_len(numparts);
partitions_list = malloc(partlistlen);
if (!partitions_list) {
del_gpt_info();
return -ENOMEM;
}
memset(partitions_list, '\0', partlistlen);
ret = create_gpt_partitions_list(numparts, disk_guid,
partitions_list);
if (ret < 0)
printf("Error: Could not create partition list string!\n");
else
env_set(namestr, partitions_list);
free(partitions_list);
} else {
print_gpt_info(); print_gpt_info();
}
del_gpt_info(); del_gpt_info();
return 0; return 0;
} }
return ret; return numparts;
} }
#endif #endif
@ -982,7 +1011,7 @@ static int do_gpt(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
ret = do_disk_guid(blk_dev_desc, argv[4]); ret = do_disk_guid(blk_dev_desc, argv[4]);
#ifdef CONFIG_CMD_GPT_RENAME #ifdef CONFIG_CMD_GPT_RENAME
} else if (strcmp(argv[1], "read") == 0) { } else if (strcmp(argv[1], "read") == 0) {
ret = do_get_gpt_info(blk_dev_desc); ret = do_get_gpt_info(blk_dev_desc, (argc == 5) ? argv[4] : NULL);
} else if ((strcmp(argv[1], "swap") == 0) || } else if ((strcmp(argv[1], "swap") == 0) ||
(strcmp(argv[1], "rename") == 0)) { (strcmp(argv[1], "rename") == 0)) {
ret = do_rename_gpt_parts(blk_dev_desc, argv[1], argv[4], argv[5]); ret = do_rename_gpt_parts(blk_dev_desc, argv[1], argv[4], argv[5]);
@ -1028,8 +1057,9 @@ U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt,
" gpt guid mmc 0 varname\n" " gpt guid mmc 0 varname\n"
#ifdef CONFIG_CMD_GPT_RENAME #ifdef CONFIG_CMD_GPT_RENAME
"gpt partition renaming commands:\n" "gpt partition renaming commands:\n"
" gpt read <interface> <dev>\n" " gpt read <interface> <dev> [<varname>]\n"
" - read GPT into a data structure for manipulation\n" " - read GPT into a data structure for manipulation\n"
" - read GPT partitions into environment variable\n"
" gpt swap <interface> <dev> <name1> <name2>\n" " gpt swap <interface> <dev> <name1> <name2>\n"
" - change all partitions named name1 to name2\n" " - change all partitions named name1 to name2\n"
" and vice-versa\n" " and vice-versa\n"

View File

@ -237,6 +237,23 @@ doc/arch/index.rst:
=> gpt swap host 0 name othername => gpt swap host 0 name othername
[ . . . ] [ . . . ]
Modifying GPT partition layout from U-Boot:
===========================================
The entire GPT partition layout can be exported to an environment
variable and then modified enmasse. Users can change the partition
numbers, offsets, names and sizes. The resulting variable can used to
reformat the device. Here is an example of reading the GPT partitions
into a variable and then modifying them:
U-BOOT> gpt read mmc 0 current_partitions
U-BOOT> env edit current_partitions
edit: uuid_disk=[...];name=part1,start=0x4000,size=0x4000,uuid=[...];
name=part2,start=0xc000,size=0xc000,uuid=[...];[ . . . ]
U-BOOT> gpt write mmc 0 $current_partitions
U-BOOT> gpt verify mmc 0 $current_partitions
Partition type GUID: Partition type GUID:
==================== ====================