[U-Boot] [PATCH v2] gpt: add part-uuid and part-num subcommands
Andrey Yurovsky
yurovsky at gmail.com
Thu Dec 14 05:06:49 UTC 2017
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 <yurovsky at 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
More information about the U-Boot
mailing list