12e192b24SSimon Glass /*
22e192b24SSimon Glass * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
32e192b24SSimon Glass *
42e192b24SSimon Glass * made from cmd_ext2, which was:
52e192b24SSimon Glass *
62e192b24SSimon Glass * (C) Copyright 2004
72e192b24SSimon Glass * esd gmbh <www.esd-electronics.com>
82e192b24SSimon Glass * Reinhard Arlt <reinhard.arlt@esd-electronics.com>
92e192b24SSimon Glass *
102e192b24SSimon Glass * made from cmd_reiserfs by
112e192b24SSimon Glass *
122e192b24SSimon Glass * (C) Copyright 2003 - 2004
132e192b24SSimon Glass * Sysgo Real-Time Solutions, AG <www.elinos.com>
142e192b24SSimon Glass * Pavel Bartusek <pba@sysgo.com>
152e192b24SSimon Glass *
162e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+
172e192b24SSimon Glass */
182e192b24SSimon Glass
192e192b24SSimon Glass #include <common.h>
202e192b24SSimon Glass #include <config.h>
212e192b24SSimon Glass #include <command.h>
222e192b24SSimon Glass #include <part.h>
232e192b24SSimon Glass #include <vsprintf.h>
242e192b24SSimon Glass
do_part_uuid(int argc,char * const argv[])252e192b24SSimon Glass static int do_part_uuid(int argc, char * const argv[])
262e192b24SSimon Glass {
272e192b24SSimon Glass int part;
284101f687SSimon Glass struct blk_desc *dev_desc;
292e192b24SSimon Glass disk_partition_t info;
302e192b24SSimon Glass
312e192b24SSimon Glass if (argc < 2)
322e192b24SSimon Glass return CMD_RET_USAGE;
332e192b24SSimon Glass if (argc > 3)
342e192b24SSimon Glass return CMD_RET_USAGE;
352e192b24SSimon Glass
36e35929e4SSimon Glass part = blk_get_device_part_str(argv[0], argv[1], &dev_desc, &info, 0);
372e192b24SSimon Glass if (part < 0)
382e192b24SSimon Glass return 1;
392e192b24SSimon Glass
402e192b24SSimon Glass if (argc > 2)
41382bee57SSimon Glass env_set(argv[2], info.uuid);
422e192b24SSimon Glass else
432e192b24SSimon Glass printf("%s\n", info.uuid);
442e192b24SSimon Glass
452e192b24SSimon Glass return 0;
462e192b24SSimon Glass }
472e192b24SSimon Glass
do_part_list(int argc,char * const argv[])482e192b24SSimon Glass static int do_part_list(int argc, char * const argv[])
492e192b24SSimon Glass {
502e192b24SSimon Glass int ret;
514101f687SSimon Glass struct blk_desc *desc;
522e192b24SSimon Glass char *var = NULL;
532e192b24SSimon Glass bool bootable = false;
542e192b24SSimon Glass int i;
552e192b24SSimon Glass
562e192b24SSimon Glass if (argc < 2)
572e192b24SSimon Glass return CMD_RET_USAGE;
582e192b24SSimon Glass
592e192b24SSimon Glass if (argc > 2) {
602e192b24SSimon Glass for (i = 2; i < argc ; i++) {
612e192b24SSimon Glass if (argv[i][0] == '-') {
622e192b24SSimon Glass if (!strcmp(argv[i], "-bootable")) {
632e192b24SSimon Glass bootable = true;
642e192b24SSimon Glass } else {
652e192b24SSimon Glass printf("Unknown option %s\n", argv[i]);
662e192b24SSimon Glass return CMD_RET_USAGE;
672e192b24SSimon Glass }
682e192b24SSimon Glass } else {
692e192b24SSimon Glass var = argv[i];
702e192b24SSimon Glass break;
712e192b24SSimon Glass }
722e192b24SSimon Glass }
732e192b24SSimon Glass
742e192b24SSimon Glass /* Loops should have been exited at the last argument, which
752e192b24SSimon Glass * as it contained the variable */
762e192b24SSimon Glass if (argc != i + 1)
772e192b24SSimon Glass return CMD_RET_USAGE;
782e192b24SSimon Glass }
792e192b24SSimon Glass
80ebac37cfSSimon Glass ret = blk_get_device_by_str(argv[0], argv[1], &desc);
812e192b24SSimon Glass if (ret < 0)
822e192b24SSimon Glass return 1;
832e192b24SSimon Glass
842e192b24SSimon Glass if (var != NULL) {
852e192b24SSimon Glass int p;
862e192b24SSimon Glass char str[512] = { '\0', };
872e192b24SSimon Glass disk_partition_t info;
882e192b24SSimon Glass
89*d61082e9SKever Yang for (p = 1; p < MAX_SEARCH_PARTITIONS; p++) {
902e192b24SSimon Glass char t[5];
913e8bd469SSimon Glass int r = part_get_info(desc, p, &info);
922e192b24SSimon Glass
932e192b24SSimon Glass if (r != 0)
942e192b24SSimon Glass continue;
952e192b24SSimon Glass
962e192b24SSimon Glass if (bootable && !info.bootable)
972e192b24SSimon Glass continue;
982e192b24SSimon Glass
992e192b24SSimon Glass sprintf(t, "%s%x", str[0] ? " " : "", p);
1002e192b24SSimon Glass strcat(str, t);
1012e192b24SSimon Glass }
102382bee57SSimon Glass env_set(var, str);
1032e192b24SSimon Glass return 0;
1042e192b24SSimon Glass }
1052e192b24SSimon Glass
1063e8bd469SSimon Glass part_print(desc);
1072e192b24SSimon Glass
1082e192b24SSimon Glass return 0;
1092e192b24SSimon Glass }
1102e192b24SSimon Glass
do_part_start(int argc,char * const argv[])1112e192b24SSimon Glass static int do_part_start(int argc, char * const argv[])
1122e192b24SSimon Glass {
1134101f687SSimon Glass struct blk_desc *desc;
1142e192b24SSimon Glass disk_partition_t info;
1152e192b24SSimon Glass char buf[512] = { 0 };
1162e192b24SSimon Glass int part;
1172e192b24SSimon Glass int err;
1182e192b24SSimon Glass int ret;
1192e192b24SSimon Glass
1202e192b24SSimon Glass if (argc < 3)
1212e192b24SSimon Glass return CMD_RET_USAGE;
1222e192b24SSimon Glass if (argc > 4)
1232e192b24SSimon Glass return CMD_RET_USAGE;
1242e192b24SSimon Glass
1252e192b24SSimon Glass part = simple_strtoul(argv[2], NULL, 0);
1262e192b24SSimon Glass
127ebac37cfSSimon Glass ret = blk_get_device_by_str(argv[0], argv[1], &desc);
1282e192b24SSimon Glass if (ret < 0)
1292e192b24SSimon Glass return 1;
1302e192b24SSimon Glass
1313e8bd469SSimon Glass err = part_get_info(desc, part, &info);
1322e192b24SSimon Glass if (err)
1332e192b24SSimon Glass return 1;
1342e192b24SSimon Glass
1352e192b24SSimon Glass snprintf(buf, sizeof(buf), LBAF, info.start);
1362e192b24SSimon Glass
1372e192b24SSimon Glass if (argc > 3)
138382bee57SSimon Glass env_set(argv[3], buf);
1392e192b24SSimon Glass else
1402e192b24SSimon Glass printf("%s\n", buf);
1412e192b24SSimon Glass
1422e192b24SSimon Glass return 0;
1432e192b24SSimon Glass }
1442e192b24SSimon Glass
do_part_size(int argc,char * const argv[])1452e192b24SSimon Glass static int do_part_size(int argc, char * const argv[])
1462e192b24SSimon Glass {
1474101f687SSimon Glass struct blk_desc *desc;
1482e192b24SSimon Glass disk_partition_t info;
1492e192b24SSimon Glass char buf[512] = { 0 };
1502e192b24SSimon Glass int part;
1512e192b24SSimon Glass int err;
1522e192b24SSimon Glass int ret;
1532e192b24SSimon Glass
1542e192b24SSimon Glass if (argc < 3)
1552e192b24SSimon Glass return CMD_RET_USAGE;
1562e192b24SSimon Glass if (argc > 4)
1572e192b24SSimon Glass return CMD_RET_USAGE;
1582e192b24SSimon Glass
1592e192b24SSimon Glass part = simple_strtoul(argv[2], NULL, 0);
1602e192b24SSimon Glass
161ebac37cfSSimon Glass ret = blk_get_device_by_str(argv[0], argv[1], &desc);
1622e192b24SSimon Glass if (ret < 0)
1632e192b24SSimon Glass return 1;
1642e192b24SSimon Glass
1653e8bd469SSimon Glass err = part_get_info(desc, part, &info);
1662e192b24SSimon Glass if (err)
1672e192b24SSimon Glass return 1;
1682e192b24SSimon Glass
1692e192b24SSimon Glass snprintf(buf, sizeof(buf), LBAF, info.size);
1702e192b24SSimon Glass
1712e192b24SSimon Glass if (argc > 3)
172382bee57SSimon Glass env_set(argv[3], buf);
1732e192b24SSimon Glass else
1742e192b24SSimon Glass printf("%s\n", buf);
1752e192b24SSimon Glass
1762e192b24SSimon Glass return 0;
1772e192b24SSimon Glass }
1782e192b24SSimon Glass
do_part(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])1792e192b24SSimon Glass static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
1802e192b24SSimon Glass {
1812e192b24SSimon Glass if (argc < 2)
1822e192b24SSimon Glass return CMD_RET_USAGE;
1832e192b24SSimon Glass
1842e192b24SSimon Glass if (!strcmp(argv[1], "uuid"))
1852e192b24SSimon Glass return do_part_uuid(argc - 2, argv + 2);
1862e192b24SSimon Glass else if (!strcmp(argv[1], "list"))
1872e192b24SSimon Glass return do_part_list(argc - 2, argv + 2);
1882e192b24SSimon Glass else if (!strcmp(argv[1], "start"))
1892e192b24SSimon Glass return do_part_start(argc - 2, argv + 2);
1902e192b24SSimon Glass else if (!strcmp(argv[1], "size"))
1912e192b24SSimon Glass return do_part_size(argc - 2, argv + 2);
1922e192b24SSimon Glass
1932e192b24SSimon Glass return CMD_RET_USAGE;
1942e192b24SSimon Glass }
1952e192b24SSimon Glass
1962e192b24SSimon Glass U_BOOT_CMD(
1972e192b24SSimon Glass part, CONFIG_SYS_MAXARGS, 1, do_part,
1982e192b24SSimon Glass "disk partition related commands",
1992e192b24SSimon Glass "uuid <interface> <dev>:<part>\n"
2002e192b24SSimon Glass " - print partition UUID\n"
2012e192b24SSimon Glass "part uuid <interface> <dev>:<part> <varname>\n"
2022e192b24SSimon Glass " - set environment variable to partition UUID\n"
2032e192b24SSimon Glass "part list <interface> <dev>\n"
2042e192b24SSimon Glass " - print a device's partition table\n"
2052e192b24SSimon Glass "part list <interface> <dev> [flags] <varname>\n"
2062e192b24SSimon Glass " - set environment variable to the list of partitions\n"
2072e192b24SSimon Glass " flags can be -bootable (list only bootable partitions)\n"
2082e192b24SSimon Glass "part start <interface> <dev> <part> <varname>\n"
2092e192b24SSimon Glass " - set environment variable to the start of the partition (in blocks)\n"
2102e192b24SSimon Glass "part size <interface> <dev> <part> <varname>\n"
2112e192b24SSimon Glass " - set environment variable to the size of the partition (in blocks)"
2122e192b24SSimon Glass );
213