183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
22e192b24SSimon Glass /*
32e192b24SSimon Glass * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
42e192b24SSimon Glass *
52e192b24SSimon Glass * made from cmd_ext2, which was:
62e192b24SSimon Glass *
72e192b24SSimon Glass * (C) Copyright 2004
82e192b24SSimon Glass * esd gmbh <www.esd-electronics.com>
92e192b24SSimon Glass * Reinhard Arlt <reinhard.arlt@esd-electronics.com>
102e192b24SSimon Glass *
112e192b24SSimon Glass * made from cmd_reiserfs by
122e192b24SSimon Glass *
132e192b24SSimon Glass * (C) Copyright 2003 - 2004
142e192b24SSimon Glass * Sysgo Real-Time Solutions, AG <www.elinos.com>
152e192b24SSimon Glass * Pavel Bartusek <pba@sysgo.com>
162e192b24SSimon Glass */
172e192b24SSimon Glass
182e192b24SSimon Glass #include <common.h>
192e192b24SSimon Glass #include <config.h>
202e192b24SSimon Glass #include <command.h>
212e192b24SSimon Glass #include <part.h>
222e192b24SSimon Glass #include <vsprintf.h>
232e192b24SSimon Glass
2464e6a49aSSam Protsenko enum cmd_part_info {
2564e6a49aSSam Protsenko CMD_PART_INFO_START = 0,
2664e6a49aSSam Protsenko CMD_PART_INFO_SIZE,
2764e6a49aSSam Protsenko };
2864e6a49aSSam Protsenko
do_part_uuid(int argc,char * const argv[])292e192b24SSimon Glass static int do_part_uuid(int argc, char * const argv[])
302e192b24SSimon Glass {
312e192b24SSimon Glass int part;
324101f687SSimon Glass struct blk_desc *dev_desc;
332e192b24SSimon Glass disk_partition_t info;
342e192b24SSimon Glass
352e192b24SSimon Glass if (argc < 2)
362e192b24SSimon Glass return CMD_RET_USAGE;
372e192b24SSimon Glass if (argc > 3)
382e192b24SSimon Glass return CMD_RET_USAGE;
392e192b24SSimon Glass
40e35929e4SSimon Glass part = blk_get_device_part_str(argv[0], argv[1], &dev_desc, &info, 0);
412e192b24SSimon Glass if (part < 0)
422e192b24SSimon Glass return 1;
432e192b24SSimon Glass
442e192b24SSimon Glass if (argc > 2)
45382bee57SSimon Glass env_set(argv[2], info.uuid);
462e192b24SSimon Glass else
472e192b24SSimon Glass printf("%s\n", info.uuid);
482e192b24SSimon Glass
492e192b24SSimon Glass return 0;
502e192b24SSimon Glass }
512e192b24SSimon Glass
do_part_list(int argc,char * const argv[])522e192b24SSimon Glass static int do_part_list(int argc, char * const argv[])
532e192b24SSimon Glass {
542e192b24SSimon Glass int ret;
554101f687SSimon Glass struct blk_desc *desc;
562e192b24SSimon Glass char *var = NULL;
572e192b24SSimon Glass bool bootable = false;
582e192b24SSimon Glass int i;
592e192b24SSimon Glass
602e192b24SSimon Glass if (argc < 2)
612e192b24SSimon Glass return CMD_RET_USAGE;
622e192b24SSimon Glass
632e192b24SSimon Glass if (argc > 2) {
642e192b24SSimon Glass for (i = 2; i < argc ; i++) {
652e192b24SSimon Glass if (argv[i][0] == '-') {
662e192b24SSimon Glass if (!strcmp(argv[i], "-bootable")) {
672e192b24SSimon Glass bootable = true;
682e192b24SSimon Glass } else {
692e192b24SSimon Glass printf("Unknown option %s\n", argv[i]);
702e192b24SSimon Glass return CMD_RET_USAGE;
712e192b24SSimon Glass }
722e192b24SSimon Glass } else {
732e192b24SSimon Glass var = argv[i];
742e192b24SSimon Glass break;
752e192b24SSimon Glass }
762e192b24SSimon Glass }
772e192b24SSimon Glass
782e192b24SSimon Glass /* Loops should have been exited at the last argument, which
792e192b24SSimon Glass * as it contained the variable */
802e192b24SSimon Glass if (argc != i + 1)
812e192b24SSimon Glass return CMD_RET_USAGE;
822e192b24SSimon Glass }
832e192b24SSimon Glass
84ebac37cfSSimon Glass ret = blk_get_device_by_str(argv[0], argv[1], &desc);
852e192b24SSimon Glass if (ret < 0)
862e192b24SSimon Glass return 1;
872e192b24SSimon Glass
882e192b24SSimon Glass if (var != NULL) {
892e192b24SSimon Glass int p;
902e192b24SSimon Glass char str[512] = { '\0', };
912e192b24SSimon Glass disk_partition_t info;
922e192b24SSimon Glass
93*7e295116SKever Yang for (p = 1; p < MAX_SEARCH_PARTITIONS; p++) {
942e192b24SSimon Glass char t[5];
953e8bd469SSimon Glass int r = part_get_info(desc, p, &info);
962e192b24SSimon Glass
972e192b24SSimon Glass if (r != 0)
982e192b24SSimon Glass continue;
992e192b24SSimon Glass
1002e192b24SSimon Glass if (bootable && !info.bootable)
1012e192b24SSimon Glass continue;
1022e192b24SSimon Glass
1032e192b24SSimon Glass sprintf(t, "%s%x", str[0] ? " " : "", p);
1042e192b24SSimon Glass strcat(str, t);
1052e192b24SSimon Glass }
106382bee57SSimon Glass env_set(var, str);
1072e192b24SSimon Glass return 0;
1082e192b24SSimon Glass }
1092e192b24SSimon Glass
1103e8bd469SSimon Glass part_print(desc);
1112e192b24SSimon Glass
1122e192b24SSimon Glass return 0;
1132e192b24SSimon Glass }
1142e192b24SSimon Glass
do_part_info(int argc,char * const argv[],enum cmd_part_info param)11564e6a49aSSam Protsenko static int do_part_info(int argc, char * const argv[], enum cmd_part_info param)
1162e192b24SSimon Glass {
1174101f687SSimon Glass struct blk_desc *desc;
1182e192b24SSimon Glass disk_partition_t info;
1192e192b24SSimon Glass char buf[512] = { 0 };
12036df616aSSam Protsenko char *endp;
1212e192b24SSimon Glass int part;
1222e192b24SSimon Glass int err;
1232e192b24SSimon Glass int ret;
1242e192b24SSimon Glass
1252e192b24SSimon Glass if (argc < 3)
1262e192b24SSimon Glass return CMD_RET_USAGE;
1272e192b24SSimon Glass if (argc > 4)
1282e192b24SSimon Glass return CMD_RET_USAGE;
1292e192b24SSimon Glass
130ebac37cfSSimon Glass ret = blk_get_device_by_str(argv[0], argv[1], &desc);
1312e192b24SSimon Glass if (ret < 0)
1322e192b24SSimon Glass return 1;
1332e192b24SSimon Glass
13436df616aSSam Protsenko part = simple_strtoul(argv[2], &endp, 0);
13536df616aSSam Protsenko if (*endp == '\0') {
1363e8bd469SSimon Glass err = part_get_info(desc, part, &info);
1372e192b24SSimon Glass if (err)
1382e192b24SSimon Glass return 1;
13936df616aSSam Protsenko } else {
14036df616aSSam Protsenko part = part_get_info_by_name(desc, argv[2], &info);
14136df616aSSam Protsenko if (part == -1)
14236df616aSSam Protsenko return 1;
14336df616aSSam Protsenko }
1442e192b24SSimon Glass
14564e6a49aSSam Protsenko switch (param) {
14664e6a49aSSam Protsenko case CMD_PART_INFO_START:
1472e192b24SSimon Glass snprintf(buf, sizeof(buf), LBAF, info.start);
14864e6a49aSSam Protsenko break;
14964e6a49aSSam Protsenko case CMD_PART_INFO_SIZE:
15064e6a49aSSam Protsenko snprintf(buf, sizeof(buf), LBAF, info.size);
15164e6a49aSSam Protsenko break;
15264e6a49aSSam Protsenko default:
15364e6a49aSSam Protsenko printf("** Unknown cmd_part_info value: %d\n", param);
15464e6a49aSSam Protsenko return 1;
15564e6a49aSSam Protsenko }
1562e192b24SSimon Glass
1572e192b24SSimon Glass if (argc > 3)
158382bee57SSimon Glass env_set(argv[3], buf);
1592e192b24SSimon Glass else
1602e192b24SSimon Glass printf("%s\n", buf);
1612e192b24SSimon Glass
1622e192b24SSimon Glass return 0;
1632e192b24SSimon Glass }
1642e192b24SSimon Glass
do_part_start(int argc,char * const argv[])16564e6a49aSSam Protsenko static int do_part_start(int argc, char * const argv[])
16664e6a49aSSam Protsenko {
16764e6a49aSSam Protsenko return do_part_info(argc, argv, CMD_PART_INFO_START);
16864e6a49aSSam Protsenko }
16964e6a49aSSam Protsenko
do_part_size(int argc,char * const argv[])1702e192b24SSimon Glass static int do_part_size(int argc, char * const argv[])
1712e192b24SSimon Glass {
17264e6a49aSSam Protsenko return do_part_info(argc, argv, CMD_PART_INFO_SIZE);
1732e192b24SSimon Glass }
1742e192b24SSimon Glass
do_part(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])1752e192b24SSimon Glass static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
1762e192b24SSimon Glass {
1772e192b24SSimon Glass if (argc < 2)
1782e192b24SSimon Glass return CMD_RET_USAGE;
1792e192b24SSimon Glass
1802e192b24SSimon Glass if (!strcmp(argv[1], "uuid"))
1812e192b24SSimon Glass return do_part_uuid(argc - 2, argv + 2);
1822e192b24SSimon Glass else if (!strcmp(argv[1], "list"))
1832e192b24SSimon Glass return do_part_list(argc - 2, argv + 2);
1842e192b24SSimon Glass else if (!strcmp(argv[1], "start"))
1852e192b24SSimon Glass return do_part_start(argc - 2, argv + 2);
1862e192b24SSimon Glass else if (!strcmp(argv[1], "size"))
1872e192b24SSimon Glass return do_part_size(argc - 2, argv + 2);
1882e192b24SSimon Glass
1892e192b24SSimon Glass return CMD_RET_USAGE;
1902e192b24SSimon Glass }
1912e192b24SSimon Glass
1922e192b24SSimon Glass U_BOOT_CMD(
1932e192b24SSimon Glass part, CONFIG_SYS_MAXARGS, 1, do_part,
1942e192b24SSimon Glass "disk partition related commands",
1952e192b24SSimon Glass "uuid <interface> <dev>:<part>\n"
1962e192b24SSimon Glass " - print partition UUID\n"
1972e192b24SSimon Glass "part uuid <interface> <dev>:<part> <varname>\n"
1982e192b24SSimon Glass " - set environment variable to partition UUID\n"
1992e192b24SSimon Glass "part list <interface> <dev>\n"
2002e192b24SSimon Glass " - print a device's partition table\n"
2012e192b24SSimon Glass "part list <interface> <dev> [flags] <varname>\n"
2022e192b24SSimon Glass " - set environment variable to the list of partitions\n"
2032e192b24SSimon Glass " flags can be -bootable (list only bootable partitions)\n"
2042e192b24SSimon Glass "part start <interface> <dev> <part> <varname>\n"
2052e192b24SSimon Glass " - set environment variable to the start of the partition (in blocks)\n"
20636df616aSSam Protsenko " part can be either partition number or partition name\n"
2072e192b24SSimon Glass "part size <interface> <dev> <part> <varname>\n"
20836df616aSSam Protsenko " - set environment variable to the size of the partition (in blocks)\n"
20936df616aSSam Protsenko " part can be either partition number or partition name"
2102e192b24SSimon Glass );
211