Blame view

cmd/part.c 4.51 KB
83d290c56   Tom Rini   SPDX: Convert all...
1
  // SPDX-License-Identifier: GPL-2.0+
5cf41dccf   Stephen Warren   cmd_part: add par...
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  /*
   * Copyright (c) 2012, NVIDIA CORPORATION.  All rights reserved.
   *
   * made from cmd_ext2, which was:
   *
   * (C) Copyright 2004
   * esd gmbh <www.esd-electronics.com>
   * Reinhard Arlt <reinhard.arlt@esd-electronics.com>
   *
   * made from cmd_reiserfs by
   *
   * (C) Copyright 2003 - 2004
   * Sysgo Real-Time Solutions, AG <www.elinos.com>
   * Pavel Bartusek <pba@sysgo.com>
5cf41dccf   Stephen Warren   cmd_part: add par...
16
17
18
19
20
21
22
   */
  
  #include <common.h>
  #include <config.h>
  #include <command.h>
  #include <part.h>
  #include <vsprintf.h>
64e6a49a1   Sam Protsenko   cmd: part: Extrac...
23
24
25
26
  enum cmd_part_info {
  	CMD_PART_INFO_START = 0,
  	CMD_PART_INFO_SIZE,
  };
0e350f81e   Jeroen Hofstee   common: commands:...
27
  static int do_part_uuid(int argc, char * const argv[])
5cf41dccf   Stephen Warren   cmd_part: add par...
28
29
  {
  	int part;
4101f6879   Simon Glass   dm: Drop the bloc...
30
  	struct blk_desc *dev_desc;
5cf41dccf   Stephen Warren   cmd_part: add par...
31
32
33
34
35
36
  	disk_partition_t info;
  
  	if (argc < 2)
  		return CMD_RET_USAGE;
  	if (argc > 3)
  		return CMD_RET_USAGE;
e35929e4a   Simon Glass   dm: blk: Rename g...
37
  	part = blk_get_device_part_str(argv[0], argv[1], &dev_desc, &info, 0);
5cf41dccf   Stephen Warren   cmd_part: add par...
38
39
40
41
  	if (part < 0)
  		return 1;
  
  	if (argc > 2)
382bee57f   Simon Glass   env: Rename seten...
42
  		env_set(argv[2], info.uuid);
5cf41dccf   Stephen Warren   cmd_part: add par...
43
44
45
46
47
48
  	else
  		printf("%s
  ", info.uuid);
  
  	return 0;
  }
0e350f81e   Jeroen Hofstee   common: commands:...
49
  static int do_part_list(int argc, char * const argv[])
5cf41dccf   Stephen Warren   cmd_part: add par...
50
51
  {
  	int ret;
4101f6879   Simon Glass   dm: Drop the bloc...
52
  	struct blk_desc *desc;
0798d6fd4   Sjoerd Simons   part: Add support...
53
54
55
  	char *var = NULL;
  	bool bootable = false;
  	int i;
5cf41dccf   Stephen Warren   cmd_part: add par...
56

0798d6fd4   Sjoerd Simons   part: Add support...
57
  	if (argc < 2)
5cf41dccf   Stephen Warren   cmd_part: add par...
58
  		return CMD_RET_USAGE;
0798d6fd4   Sjoerd Simons   part: Add support...
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
  	if (argc > 2) {
  		for (i = 2; i < argc ; i++) {
  			if (argv[i][0] == '-') {
  				if (!strcmp(argv[i], "-bootable")) {
  					bootable = true;
  				} else {
  					printf("Unknown option %s
  ", argv[i]);
  					return CMD_RET_USAGE;
  				}
  			} else {
  				var = argv[i];
  				break;
  			}
  		}
  
  		/* Loops should have been exited at the last argument, which
  		 * as it contained the variable */
  		if (argc != i + 1)
  			return CMD_RET_USAGE;
  	}
ebac37cfb   Simon Glass   dm: blk: Rename g...
80
  	ret = blk_get_device_by_str(argv[0], argv[1], &desc);
5cf41dccf   Stephen Warren   cmd_part: add par...
81
82
  	if (ret < 0)
  		return 1;
0798d6fd4   Sjoerd Simons   part: Add support...
83
  	if (var != NULL) {
e86df6ef4   Sjoerd Simons   part: let list pu...
84
  		int p;
0798d6fd4   Sjoerd Simons   part: Add support...
85
  		char str[512] = { '\0', };
a78f78ebe   Paul Kocialkowski   common: cmd_part:...
86
  		disk_partition_t info;
e86df6ef4   Sjoerd Simons   part: let list pu...
87

7e2951160   Kever Yang   cmd: part: use MA...
88
  		for (p = 1; p < MAX_SEARCH_PARTITIONS; p++) {
0798d6fd4   Sjoerd Simons   part: Add support...
89
  			char t[5];
3e8bd4695   Simon Glass   dm: part: Rename ...
90
  			int r = part_get_info(desc, p, &info);
e86df6ef4   Sjoerd Simons   part: let list pu...
91

0798d6fd4   Sjoerd Simons   part: Add support...
92
93
94
95
96
  			if (r != 0)
  				continue;
  
  			if (bootable && !info.bootable)
  				continue;
653447b40   Stephen Warren   part: fix "part l...
97
  			sprintf(t, "%s%x", str[0] ? " " : "", p);
0798d6fd4   Sjoerd Simons   part: Add support...
98
  			strcat(str, t);
e86df6ef4   Sjoerd Simons   part: let list pu...
99
  		}
382bee57f   Simon Glass   env: Rename seten...
100
  		env_set(var, str);
e86df6ef4   Sjoerd Simons   part: let list pu...
101
102
  		return 0;
  	}
3e8bd4695   Simon Glass   dm: part: Rename ...
103
  	part_print(desc);
5cf41dccf   Stephen Warren   cmd_part: add par...
104
105
106
  
  	return 0;
  }
64e6a49a1   Sam Protsenko   cmd: part: Extrac...
107
  static int do_part_info(int argc, char * const argv[], enum cmd_part_info param)
8607c4f12   Paul Kocialkowski   common: cmd_part:...
108
  {
4101f6879   Simon Glass   dm: Drop the bloc...
109
  	struct blk_desc *desc;
8607c4f12   Paul Kocialkowski   common: cmd_part:...
110
111
  	disk_partition_t info;
  	char buf[512] = { 0 };
36df616a2   Sam Protsenko   cmd: part: Allow ...
112
  	char *endp;
8607c4f12   Paul Kocialkowski   common: cmd_part:...
113
114
115
116
117
118
119
120
  	int part;
  	int err;
  	int ret;
  
  	if (argc < 3)
  		return CMD_RET_USAGE;
  	if (argc > 4)
  		return CMD_RET_USAGE;
ebac37cfb   Simon Glass   dm: blk: Rename g...
121
  	ret = blk_get_device_by_str(argv[0], argv[1], &desc);
8607c4f12   Paul Kocialkowski   common: cmd_part:...
122
123
  	if (ret < 0)
  		return 1;
36df616a2   Sam Protsenko   cmd: part: Allow ...
124
125
126
127
128
129
130
131
132
133
  	part = simple_strtoul(argv[2], &endp, 0);
  	if (*endp == '\0') {
  		err = part_get_info(desc, part, &info);
  		if (err)
  			return 1;
  	} else {
  		part = part_get_info_by_name(desc, argv[2], &info);
  		if (part == -1)
  			return 1;
  	}
8607c4f12   Paul Kocialkowski   common: cmd_part:...
134

64e6a49a1   Sam Protsenko   cmd: part: Extrac...
135
136
137
138
139
140
141
142
143
144
145
146
  	switch (param) {
  	case CMD_PART_INFO_START:
  		snprintf(buf, sizeof(buf), LBAF, info.start);
  		break;
  	case CMD_PART_INFO_SIZE:
  		snprintf(buf, sizeof(buf), LBAF, info.size);
  		break;
  	default:
  		printf("** Unknown cmd_part_info value: %d
  ", param);
  		return 1;
  	}
8607c4f12   Paul Kocialkowski   common: cmd_part:...
147
148
  
  	if (argc > 3)
382bee57f   Simon Glass   env: Rename seten...
149
  		env_set(argv[3], buf);
8607c4f12   Paul Kocialkowski   common: cmd_part:...
150
151
152
153
154
155
  	else
  		printf("%s
  ", buf);
  
  	return 0;
  }
64e6a49a1   Sam Protsenko   cmd: part: Extrac...
156
  static int do_part_start(int argc, char * const argv[])
8607c4f12   Paul Kocialkowski   common: cmd_part:...
157
  {
64e6a49a1   Sam Protsenko   cmd: part: Extrac...
158
159
  	return do_part_info(argc, argv, CMD_PART_INFO_START);
  }
8607c4f12   Paul Kocialkowski   common: cmd_part:...
160

64e6a49a1   Sam Protsenko   cmd: part: Extrac...
161
162
163
  static int do_part_size(int argc, char * const argv[])
  {
  	return do_part_info(argc, argv, CMD_PART_INFO_SIZE);
8607c4f12   Paul Kocialkowski   common: cmd_part:...
164
  }
0e350f81e   Jeroen Hofstee   common: commands:...
165
  static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
5cf41dccf   Stephen Warren   cmd_part: add par...
166
167
168
169
170
171
172
173
  {
  	if (argc < 2)
  		return CMD_RET_USAGE;
  
  	if (!strcmp(argv[1], "uuid"))
  		return do_part_uuid(argc - 2, argv + 2);
  	else if (!strcmp(argv[1], "list"))
  		return do_part_list(argc - 2, argv + 2);
8607c4f12   Paul Kocialkowski   common: cmd_part:...
174
175
176
177
  	else if (!strcmp(argv[1], "start"))
  		return do_part_start(argc - 2, argv + 2);
  	else if (!strcmp(argv[1], "size"))
  		return do_part_size(argc - 2, argv + 2);
5cf41dccf   Stephen Warren   cmd_part: add par...
178
179
180
181
182
  
  	return CMD_RET_USAGE;
  }
  
  U_BOOT_CMD(
0798d6fd4   Sjoerd Simons   part: Add support...
183
  	part,	CONFIG_SYS_MAXARGS,	1,	do_part,
5cf41dccf   Stephen Warren   cmd_part: add par...
184
  	"disk partition related commands",
8ca584ecf   maxin.john@enea.com   cmd_part: fix usa...
185
186
  	"uuid <interface> <dev>:<part>
  "
5cf41dccf   Stephen Warren   cmd_part: add par...
187
188
189
190
191
192
193
194
  	"    - print partition UUID
  "
  	"part uuid <interface> <dev>:<part> <varname>
  "
  	"    - set environment variable to partition UUID
  "
  	"part list <interface> <dev>
  "
e86df6ef4   Sjoerd Simons   part: let list pu...
195
196
  	"    - print a device's partition table
  "
0798d6fd4   Sjoerd Simons   part: Add support...
197
198
199
200
  	"part list <interface> <dev> [flags] <varname>
  "
  	"    - set environment variable to the list of partitions
  "
8607c4f12   Paul Kocialkowski   common: cmd_part:...
201
202
203
204
205
206
  	"      flags can be -bootable (list only bootable partitions)
  "
  	"part start <interface> <dev> <part> <varname>
  "
  	"    - set environment variable to the start of the partition (in blocks)
  "
36df616a2   Sam Protsenko   cmd: part: Allow ...
207
208
  	"      part can be either partition number or partition name
  "
8607c4f12   Paul Kocialkowski   common: cmd_part:...
209
210
  	"part size <interface> <dev> <part> <varname>
  "
36df616a2   Sam Protsenko   cmd: part: Allow ...
211
212
213
  	"    - set environment variable to the size of the partition (in blocks)
  "
  	"      part can be either partition number or partition name"
5cf41dccf   Stephen Warren   cmd_part: add par...
214
  );