cmd: part: Add 'number' sub-command
authorRuslan Trofymenko <ruslan.trofymenko@linaro.org>
Fri, 14 Jun 2019 14:01:26 +0000 (17:01 +0300)
committerTom Rini <trini@konsulko.com>
Wed, 24 Jul 2019 17:16:29 +0000 (13:16 -0400)
This sub-command serves for getting the partition index from
partition name. Also it can be used to test the existence of specified
partition.

Use case:
For example, in most CI environments this U-Boot command for automatic
testing of Linux rootfs is used:

    => setenv bootpart 1:f

where 0xf is "userdata" partition. But the number of "userdata"
partition can be changed any time, when partition table is changed.

So it would be nice to get rid of that 0xf magic number and use
partition name instead, like this:

    => part number mmc 1 userdata part_num
    => setenv bootpart 1:${part_num}

Signed-off-by: Ruslan Trofymenko <ruslan.trofymenko@linaro.org>
Signed-off-by: Igor Opaniuk <igor.opaniuk@gmail.com>
Reviewed-by: Alistair Strachan <astrachan@google.com>
Reviewed-by: Sam Protsenko <semen.protsenko@linaro.org>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Sam Protsenko <semen.protsenko@linaro.org>
cmd/part.c

index bfb6488b0f2b9eb602149181a37291c54370e6da..653e13ced17c4f932a685a42a30e48b48f479615 100644 (file)
@@ -24,6 +24,7 @@
 enum cmd_part_info {
        CMD_PART_INFO_START = 0,
        CMD_PART_INFO_SIZE,
+       CMD_PART_INFO_NUMBER
 };
 
 static int do_part_uuid(int argc, char * const argv[])
@@ -149,6 +150,9 @@ static int do_part_info(int argc, char * const argv[], enum cmd_part_info param)
        case CMD_PART_INFO_SIZE:
                snprintf(buf, sizeof(buf), LBAF, info.size);
                break;
+       case CMD_PART_INFO_NUMBER:
+               snprintf(buf, sizeof(buf), "%d", part);
+               break;
        default:
                printf("** Unknown cmd_part_info value: %d\n", param);
                return 1;
@@ -172,6 +176,11 @@ static int do_part_size(int argc, char * const argv[])
        return do_part_info(argc, argv, CMD_PART_INFO_SIZE);
 }
 
+static int do_part_number(int argc, char * const argv[])
+{
+       return do_part_info(argc, argv, CMD_PART_INFO_NUMBER);
+}
+
 static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 {
        if (argc < 2)
@@ -185,6 +194,8 @@ static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
                return do_part_start(argc - 2, argv + 2);
        else if (!strcmp(argv[1], "size"))
                return do_part_size(argc - 2, argv + 2);
+       else if (!strcmp(argv[1], "number"))
+               return do_part_number(argc - 2, argv + 2);
 
        return CMD_RET_USAGE;
 }
@@ -206,5 +217,8 @@ U_BOOT_CMD(
        "      part can be either partition number or partition name\n"
        "part size <interface> <dev> <part> <varname>\n"
        "    - set environment variable to the size of the partition (in blocks)\n"
-       "      part can be either partition number or partition name"
+       "      part can be either partition number or partition name\n"
+       "part number <interface> <dev> <part> <varname>\n"
+       "    - set environment variable to the partition number using the partition name\n"
+       "      part must be specified as partition name"
 );