xref: /openbmc/u-boot/cmd/part.c (revision d1e15041)
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