blob: f04a7c7c8e6e096698606d5ea7cfafd9da900320 [file] [log] [blame]
Sam Protsenko94f6d0d2020-01-24 17:53:42 +02001// SPDX-License-Identifier: GPL-2.0+
2/*
3 * (C) Copyright 2020
4 * Sam Protsenko <joe.skb7@gmail.com>
5 */
6
7#include <android_image.h>
8#include <common.h>
Simon Glass09140112020-05-10 11:40:03 -06009#include <command.h>
Simon Glass4d72caa2020-05-10 11:40:01 -060010#include <image.h>
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020011#include <mapmem.h>
12
13#define abootimg_addr() \
14 (_abootimg_addr == -1 ? image_load_addr : _abootimg_addr)
15
16/* Please use abootimg_addr() macro to obtain the boot image address */
17static ulong _abootimg_addr = -1;
Safae Ouajih86b62942023-02-06 00:50:04 +010018static ulong _avendor_bootimg_addr = -1;
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020019
Simon Glass09140112020-05-10 11:40:03 -060020static int abootimg_get_ver(int argc, char *const argv[])
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020021{
Safae Ouajihd71a7322023-02-06 00:50:03 +010022 const struct andr_boot_img_hdr_v0 *hdr;
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020023 int res = CMD_RET_SUCCESS;
24
25 if (argc > 1)
26 return CMD_RET_USAGE;
27
28 hdr = map_sysmem(abootimg_addr(), sizeof(*hdr));
Safae Ouajih734cb472023-02-06 00:50:05 +010029 if (!is_android_boot_image_header(hdr)) {
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020030 printf("Error: Boot Image header is incorrect\n");
31 res = CMD_RET_FAILURE;
32 goto exit;
33 }
34
35 if (argc == 0)
36 printf("%u\n", hdr->header_version);
37 else
38 env_set_ulong(argv[0], hdr->header_version);
39
40exit:
41 unmap_sysmem(hdr);
42 return res;
43}
44
Simon Glass09140112020-05-10 11:40:03 -060045static int abootimg_get_recovery_dtbo(int argc, char *const argv[])
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020046{
47 ulong addr;
48 u32 size;
49
50 if (argc > 2)
51 return CMD_RET_USAGE;
52
53 if (!android_image_get_dtbo(abootimg_addr(), &addr, &size))
54 return CMD_RET_FAILURE;
55
56 if (argc == 0) {
57 printf("%lx\n", addr);
58 } else {
59 env_set_hex(argv[0], addr);
60 if (argc == 2)
61 env_set_hex(argv[1], size);
62 }
63
64 return CMD_RET_SUCCESS;
65}
66
Simon Glass09140112020-05-10 11:40:03 -060067static int abootimg_get_dtb_load_addr(int argc, char *const argv[])
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020068{
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020069 if (argc > 1)
70 return CMD_RET_USAGE;
Safae Ouajih607b0752023-02-06 00:50:08 +010071 struct andr_image_data img_data = {0};
72 const struct andr_boot_img_hdr_v0 *hdr;
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020073
74 hdr = map_sysmem(abootimg_addr(), sizeof(*hdr));
Safae Ouajih607b0752023-02-06 00:50:08 +010075 if (!android_image_get_data(hdr, &img_data)) {
76 unmap_sysmem(hdr);
77 return CMD_RET_FAILURE;
78 }
79 unmap_sysmem(hdr);
80
81 if (img_data.header_version < 2) {
82 printf("Error: header_version must be >= 2 for this\n");
83 return CMD_RET_FAILURE;
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020084 }
85
Safae Ouajih607b0752023-02-06 00:50:08 +010086 if (!img_data.dtb_load_addr) {
87 printf("Error: failed to read dtb_load_addr\n");
88 return CMD_RET_FAILURE;
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020089 }
90
91 if (argc == 0)
Safae Ouajih607b0752023-02-06 00:50:08 +010092 printf("%lx\n", (ulong)img_data.dtb_load_addr);
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020093 else
Safae Ouajih607b0752023-02-06 00:50:08 +010094 env_set_hex(argv[0], (ulong)img_data.dtb_load_addr);
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020095
Safae Ouajih607b0752023-02-06 00:50:08 +010096 return CMD_RET_SUCCESS;
Sam Protsenko94f6d0d2020-01-24 17:53:42 +020097}
98
Simon Glass09140112020-05-10 11:40:03 -060099static int abootimg_get_dtb_by_index(int argc, char *const argv[])
Sam Protsenko94f6d0d2020-01-24 17:53:42 +0200100{
101 const char *index_str;
102 u32 num;
103 char *endp;
104 ulong addr;
105 u32 size;
106
107 if (argc < 1 || argc > 3)
108 return CMD_RET_USAGE;
109
110 index_str = argv[0] + strlen("--index=");
111 if (index_str[0] == '\0') {
112 printf("Error: Wrong index num\n");
113 return CMD_RET_FAILURE;
114 }
115
116 num = simple_strtoul(index_str, &endp, 0);
117 if (*endp != '\0') {
118 printf("Error: Wrong index num\n");
119 return CMD_RET_FAILURE;
120 }
121
122 if (!android_image_get_dtb_by_index(abootimg_addr(), num,
123 &addr, &size)) {
124 return CMD_RET_FAILURE;
125 }
126
127 if (argc == 1) {
128 printf("%lx\n", addr);
129 } else {
130 if (env_set_hex(argv[1], addr)) {
131 printf("Error: Can't set [addr_var]\n");
132 return CMD_RET_FAILURE;
133 }
134
135 if (argc == 3) {
136 if (env_set_hex(argv[2], size)) {
137 printf("Error: Can't set [size_var]\n");
138 return CMD_RET_FAILURE;
139 }
140 }
141 }
142
143 return CMD_RET_SUCCESS;
144}
145
Simon Glass09140112020-05-10 11:40:03 -0600146static int abootimg_get_dtb(int argc, char *const argv[])
Sam Protsenko94f6d0d2020-01-24 17:53:42 +0200147{
148 if (argc < 1)
149 return CMD_RET_USAGE;
150
151 if (strstr(argv[0], "--index="))
152 return abootimg_get_dtb_by_index(argc, argv);
153
154 return CMD_RET_USAGE;
155}
156
Simon Glass09140112020-05-10 11:40:03 -0600157static int do_abootimg_addr(struct cmd_tbl *cmdtp, int flag, int argc,
158 char *const argv[])
Sam Protsenko94f6d0d2020-01-24 17:53:42 +0200159{
160 char *endp;
161 ulong img_addr;
162
Safae Ouajih86b62942023-02-06 00:50:04 +0100163 if (argc < 2 || argc > 3)
Sam Protsenko94f6d0d2020-01-24 17:53:42 +0200164 return CMD_RET_USAGE;
165
Simon Glass7e5f4602021-07-24 09:03:29 -0600166 img_addr = hextoul(argv[1], &endp);
Sam Protsenko94f6d0d2020-01-24 17:53:42 +0200167 if (*endp != '\0') {
168 printf("Error: Wrong image address\n");
169 return CMD_RET_FAILURE;
170 }
171
172 _abootimg_addr = img_addr;
Safae Ouajih86b62942023-02-06 00:50:04 +0100173
174 if (argc == 3) {
175 img_addr = simple_strtoul(argv[2], &endp, 16);
176 if (*endp != '\0') {
177 printf("Error: Wrong vendor image address\n");
178 return CMD_RET_FAILURE;
179 }
180
181 _avendor_bootimg_addr = img_addr;
182 }
183
Sam Protsenko94f6d0d2020-01-24 17:53:42 +0200184 return CMD_RET_SUCCESS;
185}
186
Simon Glass09140112020-05-10 11:40:03 -0600187static int do_abootimg_get(struct cmd_tbl *cmdtp, int flag, int argc,
188 char *const argv[])
Sam Protsenko94f6d0d2020-01-24 17:53:42 +0200189{
190 const char *param;
191
192 if (argc < 2)
193 return CMD_RET_USAGE;
194
195 param = argv[1];
196 argc -= 2;
197 argv += 2;
198 if (!strcmp(param, "ver"))
199 return abootimg_get_ver(argc, argv);
200 else if (!strcmp(param, "recovery_dtbo"))
201 return abootimg_get_recovery_dtbo(argc, argv);
202 else if (!strcmp(param, "dtb_load_addr"))
203 return abootimg_get_dtb_load_addr(argc, argv);
204 else if (!strcmp(param, "dtb"))
205 return abootimg_get_dtb(argc, argv);
206
207 return CMD_RET_USAGE;
208}
209
Simon Glass09140112020-05-10 11:40:03 -0600210static int do_abootimg_dump(struct cmd_tbl *cmdtp, int flag, int argc,
211 char *const argv[])
Sam Protsenko94f6d0d2020-01-24 17:53:42 +0200212{
213 if (argc != 2)
214 return CMD_RET_USAGE;
215
216 if (!strcmp(argv[1], "dtb")) {
217 if (android_image_print_dtb_contents(abootimg_addr()))
218 return CMD_RET_FAILURE;
219 } else {
220 return CMD_RET_USAGE;
221 }
222
223 return CMD_RET_SUCCESS;
224}
225
Simon Glass09140112020-05-10 11:40:03 -0600226static struct cmd_tbl cmd_abootimg_sub[] = {
Safae Ouajih86b62942023-02-06 00:50:04 +0100227 U_BOOT_CMD_MKENT(addr, 3, 1, do_abootimg_addr, "", ""),
Sam Protsenko94f6d0d2020-01-24 17:53:42 +0200228 U_BOOT_CMD_MKENT(dump, 2, 1, do_abootimg_dump, "", ""),
229 U_BOOT_CMD_MKENT(get, 5, 1, do_abootimg_get, "", ""),
230};
231
Simon Glass09140112020-05-10 11:40:03 -0600232static int do_abootimg(struct cmd_tbl *cmdtp, int flag, int argc,
233 char *const argv[])
Sam Protsenko94f6d0d2020-01-24 17:53:42 +0200234{
Simon Glass09140112020-05-10 11:40:03 -0600235 struct cmd_tbl *cp;
Sam Protsenko94f6d0d2020-01-24 17:53:42 +0200236
237 cp = find_cmd_tbl(argv[1], cmd_abootimg_sub,
238 ARRAY_SIZE(cmd_abootimg_sub));
239
240 /* Strip off leading 'abootimg' command argument */
241 argc--;
242 argv++;
243
244 if (!cp || argc > cp->maxargs)
245 return CMD_RET_USAGE;
246 if (flag == CMD_FLAG_REPEAT && !cmd_is_repeatable(cp))
247 return CMD_RET_SUCCESS;
248
249 return cp->cmd(cmdtp, flag, argc, argv);
250}
251
252U_BOOT_CMD(
253 abootimg, CONFIG_SYS_MAXARGS, 0, do_abootimg,
254 "manipulate Android Boot Image",
Safae Ouajih86b62942023-02-06 00:50:04 +0100255 "addr <boot_img_addr> [<vendor_boot_img_addr>]>\n"
Sam Protsenko94f6d0d2020-01-24 17:53:42 +0200256 " - set the address in RAM where boot image is located\n"
257 " ($loadaddr is used by default)\n"
258 "abootimg dump dtb\n"
259 " - print info for all DT blobs in DTB area\n"
260 "abootimg get ver [varname]\n"
261 " - get header version\n"
262 "abootimg get recovery_dtbo [addr_var [size_var]]\n"
263 " - get address and size (hex) of recovery DTBO area in the image\n"
264 " [addr_var]: variable name to contain DTBO area address\n"
265 " [size_var]: variable name to contain DTBO area size\n"
266 "abootimg get dtb_load_addr [varname]\n"
267 " - get load address (hex) of DTB, from image header\n"
268 "abootimg get dtb --index=<num> [addr_var [size_var]]\n"
269 " - get address and size (hex) of DT blob in the image by index\n"
270 " <num>: index number of desired DT blob in DTB area\n"
271 " [addr_var]: variable name to contain DT blob address\n"
272 " [size_var]: variable name to contain DT blob size"
273);