It is useful to be able to retrieve a partition UUID or number given the partition label when working with disks that have a GPT. For instance some systems use the partition label to indicate the purpose of the partition (such as "rootfs0" being the 0th root file system in an A/B image scheme).
Add "gpt part-uuid" to retrieve the partition UUID for a given label and "gpt part-num" to retrieve the partition number for a given label along with some documentation. Signed-off-by: Andrey Yurovsky <yurov...@gmail.com> --- cmd/gpt.c | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ doc/README.gpt | 21 ++++++++++++++++ 2 files changed, 96 insertions(+) diff --git a/cmd/gpt.c b/cmd/gpt.c index 707d861766..557e18788a 100644 --- a/cmd/gpt.c +++ b/cmd/gpt.c @@ -355,6 +355,72 @@ static int do_get_gpt_info(struct blk_desc *dev_desc) } return ret; } + +static struct disk_part *find_part_by_label(const char *label) +{ + struct disk_part *part = NULL; + struct disk_part *curr; + + list_for_each_entry(curr, &disk_partitions, list) { + /* Check for the first match of the label we're looking + * for against the partition label + */ + if (!strcmp((const char *)curr->gpt_part_info.name, + label)) { + part = curr; + break; + } + } + + return part; +} + +/** + * Find a partition UUID by label and save that UUID to the environment + * variable specified + */ +static int do_get_part_uuid(struct blk_desc *dev_desc, const char *label, + const char *namestr) +{ + int ret; + + ret = get_gpt_info(dev_desc); + if (ret > 0) { + struct disk_part *part = find_part_by_label(label); + + if (part) { + env_set(namestr, part->gpt_part_info.uuid); + ret = 0; + } + + del_gpt_info(); + } + + return ret; +} + +/** + * Find a partition number by label and save that number to the environment + * variable specified + */ +static int do_get_part_num(struct blk_desc *dev_desc, const char *label, + const char *namestr) +{ + int ret = get_gpt_info(dev_desc); + + if (ret > 0) { + struct disk_part *part = find_part_by_label(label); + + if (part) { + env_set_ulong(namestr, part->partnum); + ret = 0; + } + + del_gpt_info(); + } + + return ret; +} #endif /** @@ -851,6 +917,10 @@ static int do_gpt(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) #ifdef CONFIG_CMD_GPT_RENAME } else if (strcmp(argv[1], "read") == 0) { ret = do_get_gpt_info(blk_dev_desc); + } else if (strcmp(argv[1], "part-uuid") == 0 && argc == 6) { + ret = do_get_part_uuid(blk_dev_desc, argv[4], argv[5]); + } else if (strcmp(argv[1], "part-num") == 0 && argc == 6) { + ret = do_get_part_num(blk_dev_desc, argv[4], argv[5]); } else if ((strcmp(argv[1], "swap") == 0) || (strcmp(argv[1], "rename") == 0)) { ret = do_rename_gpt_parts(blk_dev_desc, argv[1], argv[4], argv[5]); @@ -887,6 +957,11 @@ U_BOOT_CMD(gpt, CONFIG_SYS_MAXARGS, 1, do_gpt, " gpt guid mmc 0\n" " gpt guid mmc 0 varname\n" #ifdef CONFIG_CMD_GPT_RENAME + "gpt partition label commands:\n" + "gpt part-uuid <interface> <dev> <label> <varname>\n" + " - set environment variable to UUID of label\n" + "gpt part-num <interface> <dev> <label> <varname>\n" + " - set environment variable to partition number of label\n" "gpt partition renaming commands:\n" "gpt swap <interface> <dev> <name1> <name2>\n" " - change all partitions named name1 to name2\n" diff --git a/doc/README.gpt b/doc/README.gpt index d3db8bce1c..edb99b6c68 100644 --- a/doc/README.gpt +++ b/doc/README.gpt @@ -275,6 +275,27 @@ Some strings can be also used at the place of known GUID : They are also used to display the type of partition in "part list" command. +Identifying Partitions in U-Boot: +================================= + +Two subcommands may be used to identify partitions by their label. This can be +useful for determining which partition to use or for setting boot arguments. +The 'gpt part-uuid' command looks up a partition UUID for a given label and +stores it in an environment variable. The 'gpt part-num' command looks up a +partition number for a given label and stores it in an environment variable. +The first partition with a matching label is used. + +For example, to find the UUID of a partition named 'rootfs0' and then use it +for boot arguments: + +U-BOOT> gpt part-uuid mmc 0 rootfs0 rootfsuuid +U-BOOT> setenv bootargs root=PARTUUID=${rootfsuuid} + +Or, for example, to find the partition number for a partition named 'kernel' +and load a file from it: + +U-BOOT> gpt part-num mmc 0 kernel kernelnum +U-BOOT> fatload mmc 0:${kernelnum} ${loadaddr} zImage Useful info: ============ -- 2.14.3 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot