Blame view

cmd/part.c 4.25 KB
5cf41dccf   Stephen Warren   cmd_part: add par...
1
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>
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
16
   * SPDX-License-Identifier:	GPL-2.0+
5cf41dccf   Stephen Warren   cmd_part: add par...
17
18
19
20
21
22
23
   */
  
  #include <common.h>
  #include <config.h>
  #include <command.h>
  #include <part.h>
  #include <vsprintf.h>
0e350f81e   Jeroen Hofstee   common: commands:...
24
  static int do_part_uuid(int argc, char * const argv[])
5cf41dccf   Stephen Warren   cmd_part: add par...
25
26
  {
  	int part;
4101f6879   Simon Glass   dm: Drop the bloc...
27
  	struct blk_desc *dev_desc;
5cf41dccf   Stephen Warren   cmd_part: add par...
28
29
30
31
32
33
  	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...
34
  	part = blk_get_device_part_str(argv[0], argv[1], &dev_desc, &info, 0);
5cf41dccf   Stephen Warren   cmd_part: add par...
35
36
37
38
  	if (part < 0)
  		return 1;
  
  	if (argc > 2)
382bee57f   Simon Glass   env: Rename seten...
39
  		env_set(argv[2], info.uuid);
5cf41dccf   Stephen Warren   cmd_part: add par...
40
41
42
43
44
45
  	else
  		printf("%s
  ", info.uuid);
  
  	return 0;
  }
0e350f81e   Jeroen Hofstee   common: commands:...
46
  static int do_part_list(int argc, char * const argv[])
5cf41dccf   Stephen Warren   cmd_part: add par...
47
48
  {
  	int ret;
4101f6879   Simon Glass   dm: Drop the bloc...
49
  	struct blk_desc *desc;
0798d6fd4   Sjoerd Simons   part: Add support...
50
51
52
  	char *var = NULL;
  	bool bootable = false;
  	int i;
5cf41dccf   Stephen Warren   cmd_part: add par...
53

0798d6fd4   Sjoerd Simons   part: Add support...
54
  	if (argc < 2)
5cf41dccf   Stephen Warren   cmd_part: add par...
55
  		return CMD_RET_USAGE;
0798d6fd4   Sjoerd Simons   part: Add support...
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
  	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...
77
  	ret = blk_get_device_by_str(argv[0], argv[1], &desc);
5cf41dccf   Stephen Warren   cmd_part: add par...
78
79
  	if (ret < 0)
  		return 1;
0798d6fd4   Sjoerd Simons   part: Add support...
80
  	if (var != NULL) {
e86df6ef4   Sjoerd Simons   part: let list pu...
81
  		int p;
0798d6fd4   Sjoerd Simons   part: Add support...
82
  		char str[512] = { '\0', };
a78f78ebe   Paul Kocialkowski   common: cmd_part:...
83
  		disk_partition_t info;
e86df6ef4   Sjoerd Simons   part: let list pu...
84
85
  
  		for (p = 1; p < 128; p++) {
0798d6fd4   Sjoerd Simons   part: Add support...
86
  			char t[5];
3e8bd4695   Simon Glass   dm: part: Rename ...
87
  			int r = part_get_info(desc, p, &info);
e86df6ef4   Sjoerd Simons   part: let list pu...
88

0798d6fd4   Sjoerd Simons   part: Add support...
89
90
91
92
93
  			if (r != 0)
  				continue;
  
  			if (bootable && !info.bootable)
  				continue;
653447b40   Stephen Warren   part: fix "part l...
94
  			sprintf(t, "%s%x", str[0] ? " " : "", p);
0798d6fd4   Sjoerd Simons   part: Add support...
95
  			strcat(str, t);
e86df6ef4   Sjoerd Simons   part: let list pu...
96
  		}
382bee57f   Simon Glass   env: Rename seten...
97
  		env_set(var, str);
e86df6ef4   Sjoerd Simons   part: let list pu...
98
99
  		return 0;
  	}
3e8bd4695   Simon Glass   dm: part: Rename ...
100
  	part_print(desc);
5cf41dccf   Stephen Warren   cmd_part: add par...
101
102
103
  
  	return 0;
  }
8607c4f12   Paul Kocialkowski   common: cmd_part:...
104
105
  static int do_part_start(int argc, char * const argv[])
  {
4101f6879   Simon Glass   dm: Drop the bloc...
106
  	struct blk_desc *desc;
8607c4f12   Paul Kocialkowski   common: cmd_part:...
107
108
109
110
111
112
113
114
115
116
117
118
  	disk_partition_t info;
  	char buf[512] = { 0 };
  	int part;
  	int err;
  	int ret;
  
  	if (argc < 3)
  		return CMD_RET_USAGE;
  	if (argc > 4)
  		return CMD_RET_USAGE;
  
  	part = simple_strtoul(argv[2], NULL, 0);
ebac37cfb   Simon Glass   dm: blk: Rename g...
119
  	ret = blk_get_device_by_str(argv[0], argv[1], &desc);
8607c4f12   Paul Kocialkowski   common: cmd_part:...
120
121
  	if (ret < 0)
  		return 1;
3e8bd4695   Simon Glass   dm: part: Rename ...
122
  	err = part_get_info(desc, part, &info);
8607c4f12   Paul Kocialkowski   common: cmd_part:...
123
124
125
126
127
128
  	if (err)
  		return 1;
  
  	snprintf(buf, sizeof(buf), LBAF, info.start);
  
  	if (argc > 3)
382bee57f   Simon Glass   env: Rename seten...
129
  		env_set(argv[3], buf);
8607c4f12   Paul Kocialkowski   common: cmd_part:...
130
131
132
133
134
135
136
137
138
  	else
  		printf("%s
  ", buf);
  
  	return 0;
  }
  
  static int do_part_size(int argc, char * const argv[])
  {
4101f6879   Simon Glass   dm: Drop the bloc...
139
  	struct blk_desc *desc;
8607c4f12   Paul Kocialkowski   common: cmd_part:...
140
141
142
143
144
145
146
147
148
149
150
151
  	disk_partition_t info;
  	char buf[512] = { 0 };
  	int part;
  	int err;
  	int ret;
  
  	if (argc < 3)
  		return CMD_RET_USAGE;
  	if (argc > 4)
  		return CMD_RET_USAGE;
  
  	part = simple_strtoul(argv[2], NULL, 0);
ebac37cfb   Simon Glass   dm: blk: Rename g...
152
  	ret = blk_get_device_by_str(argv[0], argv[1], &desc);
8607c4f12   Paul Kocialkowski   common: cmd_part:...
153
154
  	if (ret < 0)
  		return 1;
3e8bd4695   Simon Glass   dm: part: Rename ...
155
  	err = part_get_info(desc, part, &info);
8607c4f12   Paul Kocialkowski   common: cmd_part:...
156
157
158
159
160
161
  	if (err)
  		return 1;
  
  	snprintf(buf, sizeof(buf), LBAF, info.size);
  
  	if (argc > 3)
382bee57f   Simon Glass   env: Rename seten...
162
  		env_set(argv[3], buf);
8607c4f12   Paul Kocialkowski   common: cmd_part:...
163
164
165
166
167
168
  	else
  		printf("%s
  ", buf);
  
  	return 0;
  }
0e350f81e   Jeroen Hofstee   common: commands:...
169
  static int do_part(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
5cf41dccf   Stephen Warren   cmd_part: add par...
170
171
172
173
174
175
176
177
  {
  	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:...
178
179
180
181
  	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...
182
183
184
185
186
  
  	return CMD_RET_USAGE;
  }
  
  U_BOOT_CMD(
0798d6fd4   Sjoerd Simons   part: Add support...
187
  	part,	CONFIG_SYS_MAXARGS,	1,	do_part,
5cf41dccf   Stephen Warren   cmd_part: add par...
188
  	"disk partition related commands",
8ca584ecf   maxin.john@enea.com   cmd_part: fix usa...
189
190
  	"uuid <interface> <dev>:<part>
  "
5cf41dccf   Stephen Warren   cmd_part: add par...
191
192
193
194
195
196
197
198
  	"    - 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...
199
200
  	"    - print a device's partition table
  "
0798d6fd4   Sjoerd Simons   part: Add support...
201
202
203
204
  	"part list <interface> <dev> [flags] <varname>
  "
  	"    - set environment variable to the list of partitions
  "
8607c4f12   Paul Kocialkowski   common: cmd_part:...
205
206
207
208
209
210
211
212
213
  	"      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)
  "
  	"part size <interface> <dev> <part> <varname>
  "
  	"    - set environment variable to the size of the partition (in blocks)"
5cf41dccf   Stephen Warren   cmd_part: add par...
214
  );