xref: /rk3399_rockchip-uboot/cmd/part.c (revision d61082e9dfc265c229156f10d08b8019bc795bd1)
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