xref: /rk3399_rockchip-uboot/cmd/part.c (revision 2e192b245ed36a63bab0ef576999a95e23f60ecd)
1*2e192b24SSimon Glass /*
2*2e192b24SSimon Glass  * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
3*2e192b24SSimon Glass  *
4*2e192b24SSimon Glass  * made from cmd_ext2, which was:
5*2e192b24SSimon Glass  *
6*2e192b24SSimon Glass  * (C) Copyright 2004
7*2e192b24SSimon Glass  * esd gmbh <www.esd-electronics.com>
8*2e192b24SSimon Glass  * Reinhard Arlt <reinhard.arlt@esd-electronics.com>
9*2e192b24SSimon Glass  *
10*2e192b24SSimon Glass  * made from cmd_reiserfs by
11*2e192b24SSimon Glass  *
12*2e192b24SSimon Glass  * (C) Copyright 2003 - 2004
13*2e192b24SSimon Glass  * Sysgo Real-Time Solutions, AG <www.elinos.com>
14*2e192b24SSimon Glass  * Pavel Bartusek <pba@sysgo.com>
15*2e192b24SSimon Glass  *
16*2e192b24SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
17*2e192b24SSimon Glass  */
18*2e192b24SSimon Glass 
19*2e192b24SSimon Glass #include <common.h>
20*2e192b24SSimon Glass #include <config.h>
21*2e192b24SSimon Glass #include <command.h>
22*2e192b24SSimon Glass #include <part.h>
23*2e192b24SSimon Glass #include <vsprintf.h>
24*2e192b24SSimon Glass 
25*2e192b24SSimon Glass #ifndef CONFIG_PARTITION_UUIDS
26*2e192b24SSimon Glass #error CONFIG_PARTITION_UUIDS must be enabled for CONFIG_CMD_PART to be enabled
27*2e192b24SSimon Glass #endif
28*2e192b24SSimon Glass 
29*2e192b24SSimon Glass static int do_part_uuid(int argc, char * const argv[])
30*2e192b24SSimon Glass {
31*2e192b24SSimon Glass 	int part;
32*2e192b24SSimon Glass 	block_dev_desc_t *dev_desc;
33*2e192b24SSimon Glass 	disk_partition_t info;
34*2e192b24SSimon Glass 
35*2e192b24SSimon Glass 	if (argc < 2)
36*2e192b24SSimon Glass 		return CMD_RET_USAGE;
37*2e192b24SSimon Glass 	if (argc > 3)
38*2e192b24SSimon Glass 		return CMD_RET_USAGE;
39*2e192b24SSimon Glass 
40*2e192b24SSimon Glass 	part = get_device_and_partition(argv[0], argv[1], &dev_desc, &info, 0);
41*2e192b24SSimon Glass 	if (part < 0)
42*2e192b24SSimon Glass 		return 1;
43*2e192b24SSimon Glass 
44*2e192b24SSimon Glass 	if (argc > 2)
45*2e192b24SSimon Glass 		setenv(argv[2], info.uuid);
46*2e192b24SSimon Glass 	else
47*2e192b24SSimon Glass 		printf("%s\n", info.uuid);
48*2e192b24SSimon Glass 
49*2e192b24SSimon Glass 	return 0;
50*2e192b24SSimon Glass }
51*2e192b24SSimon Glass 
52*2e192b24SSimon Glass static int do_part_list(int argc, char * const argv[])
53*2e192b24SSimon Glass {
54*2e192b24SSimon Glass 	int ret;
55*2e192b24SSimon Glass 	block_dev_desc_t *desc;
56*2e192b24SSimon Glass 	char *var = NULL;
57*2e192b24SSimon Glass 	bool bootable = false;
58*2e192b24SSimon Glass 	int i;
59*2e192b24SSimon Glass 
60*2e192b24SSimon Glass 	if (argc < 2)
61*2e192b24SSimon Glass 		return CMD_RET_USAGE;
62*2e192b24SSimon Glass 
63*2e192b24SSimon Glass 	if (argc > 2) {
64*2e192b24SSimon Glass 		for (i = 2; i < argc ; i++) {
65*2e192b24SSimon Glass 			if (argv[i][0] == '-') {
66*2e192b24SSimon Glass 				if (!strcmp(argv[i], "-bootable")) {
67*2e192b24SSimon Glass 					bootable = true;
68*2e192b24SSimon Glass 				} else {
69*2e192b24SSimon Glass 					printf("Unknown option %s\n", argv[i]);
70*2e192b24SSimon Glass 					return CMD_RET_USAGE;
71*2e192b24SSimon Glass 				}
72*2e192b24SSimon Glass 			} else {
73*2e192b24SSimon Glass 				var = argv[i];
74*2e192b24SSimon Glass 				break;
75*2e192b24SSimon Glass 			}
76*2e192b24SSimon Glass 		}
77*2e192b24SSimon Glass 
78*2e192b24SSimon Glass 		/* Loops should have been exited at the last argument, which
79*2e192b24SSimon Glass 		 * as it contained the variable */
80*2e192b24SSimon Glass 		if (argc != i + 1)
81*2e192b24SSimon Glass 			return CMD_RET_USAGE;
82*2e192b24SSimon Glass 	}
83*2e192b24SSimon Glass 
84*2e192b24SSimon Glass 	ret = get_device(argv[0], argv[1], &desc);
85*2e192b24SSimon Glass 	if (ret < 0)
86*2e192b24SSimon Glass 		return 1;
87*2e192b24SSimon Glass 
88*2e192b24SSimon Glass 	if (var != NULL) {
89*2e192b24SSimon Glass 		int p;
90*2e192b24SSimon Glass 		char str[512] = { '\0', };
91*2e192b24SSimon Glass 		disk_partition_t info;
92*2e192b24SSimon Glass 
93*2e192b24SSimon Glass 		for (p = 1; p < 128; p++) {
94*2e192b24SSimon Glass 			char t[5];
95*2e192b24SSimon Glass 			int r = get_partition_info(desc, p, &info);
96*2e192b24SSimon Glass 
97*2e192b24SSimon Glass 			if (r != 0)
98*2e192b24SSimon Glass 				continue;
99*2e192b24SSimon Glass 
100*2e192b24SSimon Glass 			if (bootable && !info.bootable)
101*2e192b24SSimon Glass 				continue;
102*2e192b24SSimon Glass 
103*2e192b24SSimon Glass 			sprintf(t, "%s%x", str[0] ? " " : "", p);
104*2e192b24SSimon Glass 			strcat(str, t);
105*2e192b24SSimon Glass 		}
106*2e192b24SSimon Glass 		setenv(var, str);
107*2e192b24SSimon Glass 		return 0;
108*2e192b24SSimon Glass 	}
109*2e192b24SSimon Glass 
110*2e192b24SSimon Glass 	print_part(desc);
111*2e192b24SSimon Glass 
112*2e192b24SSimon Glass 	return 0;
113*2e192b24SSimon Glass }
114*2e192b24SSimon Glass 
115*2e192b24SSimon Glass static int do_part_start(int argc, char * const argv[])
116*2e192b24SSimon Glass {
117*2e192b24SSimon Glass 	block_dev_desc_t *desc;
118*2e192b24SSimon Glass 	disk_partition_t info;
119*2e192b24SSimon Glass 	char buf[512] = { 0 };
120*2e192b24SSimon Glass 	int part;
121*2e192b24SSimon Glass 	int err;
122*2e192b24SSimon Glass 	int ret;
123*2e192b24SSimon Glass 
124*2e192b24SSimon Glass 	if (argc < 3)
125*2e192b24SSimon Glass 		return CMD_RET_USAGE;
126*2e192b24SSimon Glass 	if (argc > 4)
127*2e192b24SSimon Glass 		return CMD_RET_USAGE;
128*2e192b24SSimon Glass 
129*2e192b24SSimon Glass 	part = simple_strtoul(argv[2], NULL, 0);
130*2e192b24SSimon Glass 
131*2e192b24SSimon Glass 	ret = get_device(argv[0], argv[1], &desc);
132*2e192b24SSimon Glass 	if (ret < 0)
133*2e192b24SSimon Glass 		return 1;
134*2e192b24SSimon Glass 
135*2e192b24SSimon Glass 	err = get_partition_info(desc, part, &info);
136*2e192b24SSimon Glass 	if (err)
137*2e192b24SSimon Glass 		return 1;
138*2e192b24SSimon Glass 
139*2e192b24SSimon Glass 	snprintf(buf, sizeof(buf), LBAF, info.start);
140*2e192b24SSimon Glass 
141*2e192b24SSimon Glass 	if (argc > 3)
142*2e192b24SSimon Glass 		setenv(argv[3], buf);
143*2e192b24SSimon Glass 	else
144*2e192b24SSimon Glass 		printf("%s\n", buf);
145*2e192b24SSimon Glass 
146*2e192b24SSimon Glass 	return 0;
147*2e192b24SSimon Glass }
148*2e192b24SSimon Glass 
149*2e192b24SSimon Glass static int do_part_size(int argc, char * const argv[])
150*2e192b24SSimon Glass {
151*2e192b24SSimon Glass 	block_dev_desc_t *desc;
152*2e192b24SSimon Glass 	disk_partition_t info;
153*2e192b24SSimon Glass 	char buf[512] = { 0 };
154*2e192b24SSimon Glass 	int part;
155*2e192b24SSimon Glass 	int err;
156*2e192b24SSimon Glass 	int ret;
157*2e192b24SSimon Glass 
158*2e192b24SSimon Glass 	if (argc < 3)
159*2e192b24SSimon Glass 		return CMD_RET_USAGE;
160*2e192b24SSimon Glass 	if (argc > 4)
161*2e192b24SSimon Glass 		return CMD_RET_USAGE;
162*2e192b24SSimon Glass 
163*2e192b24SSimon Glass 	part = simple_strtoul(argv[2], NULL, 0);
164*2e192b24SSimon Glass 
165*2e192b24SSimon Glass 	ret = get_device(argv[0], argv[1], &desc);
166*2e192b24SSimon Glass 	if (ret < 0)
167*2e192b24SSimon Glass 		return 1;
168*2e192b24SSimon Glass 
169*2e192b24SSimon Glass 	err = get_partition_info(desc, part, &info);
170*2e192b24SSimon Glass 	if (err)
171*2e192b24SSimon Glass 		return 1;
172*2e192b24SSimon Glass 
173*2e192b24SSimon Glass 	snprintf(buf, sizeof(buf), LBAF, info.size);
174*2e192b24SSimon Glass 
175*2e192b24SSimon Glass 	if (argc > 3)
176*2e192b24SSimon Glass 		setenv(argv[3], buf);
177*2e192b24SSimon Glass 	else
178*2e192b24SSimon Glass 		printf("%s\n", buf);
179*2e192b24SSimon Glass 
180*2e192b24SSimon Glass 	return 0;
181*2e192b24SSimon Glass }
182*2e192b24SSimon Glass 
183*2e192b24SSimon Glass static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
184*2e192b24SSimon Glass {
185*2e192b24SSimon Glass 	if (argc < 2)
186*2e192b24SSimon Glass 		return CMD_RET_USAGE;
187*2e192b24SSimon Glass 
188*2e192b24SSimon Glass 	if (!strcmp(argv[1], "uuid"))
189*2e192b24SSimon Glass 		return do_part_uuid(argc - 2, argv + 2);
190*2e192b24SSimon Glass 	else if (!strcmp(argv[1], "list"))
191*2e192b24SSimon Glass 		return do_part_list(argc - 2, argv + 2);
192*2e192b24SSimon Glass 	else if (!strcmp(argv[1], "start"))
193*2e192b24SSimon Glass 		return do_part_start(argc - 2, argv + 2);
194*2e192b24SSimon Glass 	else if (!strcmp(argv[1], "size"))
195*2e192b24SSimon Glass 		return do_part_size(argc - 2, argv + 2);
196*2e192b24SSimon Glass 
197*2e192b24SSimon Glass 	return CMD_RET_USAGE;
198*2e192b24SSimon Glass }
199*2e192b24SSimon Glass 
200*2e192b24SSimon Glass U_BOOT_CMD(
201*2e192b24SSimon Glass 	part,	CONFIG_SYS_MAXARGS,	1,	do_part,
202*2e192b24SSimon Glass 	"disk partition related commands",
203*2e192b24SSimon Glass 	"uuid <interface> <dev>:<part>\n"
204*2e192b24SSimon Glass 	"    - print partition UUID\n"
205*2e192b24SSimon Glass 	"part uuid <interface> <dev>:<part> <varname>\n"
206*2e192b24SSimon Glass 	"    - set environment variable to partition UUID\n"
207*2e192b24SSimon Glass 	"part list <interface> <dev>\n"
208*2e192b24SSimon Glass 	"    - print a device's partition table\n"
209*2e192b24SSimon Glass 	"part list <interface> <dev> [flags] <varname>\n"
210*2e192b24SSimon Glass 	"    - set environment variable to the list of partitions\n"
211*2e192b24SSimon Glass 	"      flags can be -bootable (list only bootable partitions)\n"
212*2e192b24SSimon Glass 	"part start <interface> <dev> <part> <varname>\n"
213*2e192b24SSimon Glass 	"    - set environment variable to the start of the partition (in blocks)\n"
214*2e192b24SSimon Glass 	"part size <interface> <dev> <part> <varname>\n"
215*2e192b24SSimon Glass 	"    - set environment variable to the size of the partition (in blocks)"
216*2e192b24SSimon Glass );
217