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