blob: d7be402be7d4f0320d73fe6e7f0f2f5dbc6b30b2 [file] [log] [blame]
Stephen Warren4b0e5d02012-11-28 11:44:50 -07001/*
2 * Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Anton Staafc6244272011-02-24 10:17:50 -080015 *
16 * See file CREDITS for list of people who contributed to this
17 * project.
Anton Staafc6244272011-02-24 10:17:50 -080018 */
19
20#include "cbootimage.h"
Anton Staafc6244272011-02-24 10:17:50 -080021#include "data_layout.h"
22#include "context.h"
Anton Staafe517a4f2011-03-14 12:28:06 -070023#include "parse.h"
Peer Chen6f2cbc72012-03-13 11:12:39 +080024#include "t20/nvboot_bct_t20.h"
Anton Staafc6244272011-02-24 10:17:50 -080025#include <string.h>
26
27int enable_debug = 0;
28
Peer Chen6f2cbc72012-03-13 11:12:39 +080029bct_parse_interface *g_bct_parse_interf;
30
Anton Staafc6244272011-02-24 10:17:50 -080031typedef struct {
Peer Chen6f2cbc72012-03-13 11:12:39 +080032 parse_token id;
Anton Staafc6244272011-02-24 10:17:50 -080033 char const * message;
34} value_data;
35
Stephen Warrenb258a012012-11-29 17:53:51 -070036static value_data const values[] = {
Peer Chen6f2cbc72012-03-13 11:12:39 +080037 { token_boot_data_version, "Version = 0x%08x;\n" },
Stephen Warrenb258a012012-11-29 17:53:51 -070038 { token_block_size_log2, "BlockSize = 0x%08x;\n" },
Peer Chen6f2cbc72012-03-13 11:12:39 +080039 { token_page_size_log2, "PageSize = 0x%08x;\n" },
Stephen Warrenb258a012012-11-29 17:53:51 -070040 { token_partition_size, "PartitionSize = 0x%08x;\n" },
41 { token_bootloader_used, "# Bootloader used = %d;\n" },
Peer Chen6f2cbc72012-03-13 11:12:39 +080042 { token_bootloaders_max, "# Bootloaders max = %d;\n" },
43 { token_bct_size, "# BCT size = %d;\n" },
44 { token_hash_size, "# Hash size = %d;\n" },
45 { token_crypto_offset, "# Crypto offset = %d;\n" },
46 { token_crypto_length, "# Crypto length = %d;\n" },
47 { token_max_bct_search_blks, "# Max BCT search blocks = %d;\n" },
Anton Staafc6244272011-02-24 10:17:50 -080048};
49
Stephen Warrenb258a012012-11-29 17:53:51 -070050static value_data const bl_values[] = {
Peer Chen6f2cbc72012-03-13 11:12:39 +080051 { token_bl_version, "Version = 0x%08x;\n" },
52 { token_bl_start_blk, "Start block = %d;\n" },
53 { token_bl_start_page, "Start page = %d;\n" },
54 { token_bl_length, "Length = %d;\n" },
55 { token_bl_load_addr, "Load address = 0x%08x;\n" },
56 { token_bl_entry_point, "Entry point = 0x%08x;\n" },
57 { token_bl_attribute, "Attributes = 0x%08x;\n" },
Vincent Palatin99475842011-03-07 16:09:25 -050058};
59
Anton Staafe517a4f2011-03-14 12:28:06 -070060/*****************************************************************************/
61static void usage(void)
Anton Staafc6244272011-02-24 10:17:50 -080062{
63 printf("Usage: bct_dump bctfile\n");
Peer Chen6f2cbc72012-03-13 11:12:39 +080064 printf(" bctfile BCT filename to read and display\n");
Anton Staafc6244272011-02-24 10:17:50 -080065}
Anton Staafe517a4f2011-03-14 12:28:06 -070066/*****************************************************************************/
67static int max_width(field_item const * table)
68{
69 int width = 0;
70 int i;
Anton Staafc6244272011-02-24 10:17:50 -080071
Peer Chen6f2cbc72012-03-13 11:12:39 +080072 for (i = 0; table[i].name != NULL; ++i) {
Anton Staafe517a4f2011-03-14 12:28:06 -070073 int length = strlen(table[i].name);
74
75 if (width < length)
76 width = length;
77 }
78
79 return width;
80}
81/*****************************************************************************/
Anton Staaf20379c12011-03-14 15:38:59 -070082static enum_item const * find_enum_item(build_image_context *context,
83 enum_item const * table,
84 u_int32_t value)
85{
86 int i;
87
Peer Chen6f2cbc72012-03-13 11:12:39 +080088 for (i = 0; table[i].name != NULL; ++i) {
89 if (table[i].value == value)
Anton Staaf20379c12011-03-14 15:38:59 -070090 return table + i;
91 }
92
93 return NULL;
94}
95/*****************************************************************************/
96static void display_enum_value(build_image_context *context,
97 enum_item const * table,
98 u_int32_t value)
99{
100 enum_item const * e_item = find_enum_item(context, table, value);
101
102 if (e_item)
103 printf("%s", e_item->name);
104 else
105 printf("<UNKNOWN ENUM VALUE (%d)>", value);
106}
107/*****************************************************************************/
108static int display_field_value(build_image_context *context,
109 field_item const * item,
110 u_int32_t value)
Anton Staafe517a4f2011-03-14 12:28:06 -0700111{
Peer Chen6f2cbc72012-03-13 11:12:39 +0800112 switch (item->type) {
Anton Staafe517a4f2011-03-14 12:28:06 -0700113 case field_type_enum:
Anton Staaf20379c12011-03-14 15:38:59 -0700114 display_enum_value(context, item->enum_table, value);
115 break;
Anton Staafe517a4f2011-03-14 12:28:06 -0700116
117 case field_type_u32:
118 printf("0x%08x", value);
119 break;
120
121 case field_type_u8:
Anton Staaf20379c12011-03-14 15:38:59 -0700122 printf("%d", value);
Anton Staafe517a4f2011-03-14 12:28:06 -0700123 break;
124
125 default:
126 printf("<UNKNOWN FIELD TYPE (%d)>", item->type);
127 return 1;
128 }
129
130 return 0;
131}
132/*****************************************************************************/
133int main(int argc, char *argv[])
Anton Staafc6244272011-02-24 10:17:50 -0800134{
135 int e;
136 build_image_context context;
137 u_int32_t bootloaders_used;
Anton Staaf496f9652011-03-02 09:23:27 -0800138 u_int32_t parameters_used;
Vincent Palatin99475842011-03-07 16:09:25 -0500139 u_int32_t sdram_used;
Anton Staaf496f9652011-03-02 09:23:27 -0800140 nvboot_dev_type type;
Peer Chen6f2cbc72012-03-13 11:12:39 +0800141 nvboot_config_table *bct = NULL;
Anton Staafc6244272011-02-24 10:17:50 -0800142 u_int32_t data;
143 int i;
144 int j;
145
146 if (argc != 2)
147 usage();
148
149 memset(&context, 0, sizeof(build_image_context));
150
Peer Chen6f2cbc72012-03-13 11:12:39 +0800151 g_bct_parse_interf = malloc(sizeof(bct_parse_interface));
152 if (g_bct_parse_interf == NULL) {
153 printf("Insufficient memory to proceed.\n");
154 return -EINVAL;
Anton Staafc6244272011-02-24 10:17:50 -0800155 }
156
Peer Chen6f2cbc72012-03-13 11:12:39 +0800157 context.bct_filename = argv[1];
Anton Staafc6244272011-02-24 10:17:50 -0800158
Peer Chen6f2cbc72012-03-13 11:12:39 +0800159 e = read_bct_file(&context);
160 if (e != 0)
161 return e;
162 bct = (nvboot_config_table *)(context.bct);
Anton Staaf496f9652011-03-02 09:23:27 -0800163 /* Display root values */
Anton Staafc6244272011-02-24 10:17:50 -0800164 for (i = 0; i < sizeof(values) / sizeof(values[0]); ++i) {
Peer Chen6f2cbc72012-03-13 11:12:39 +0800165 e = g_bct_parse_interf->get_value(values[i].id,
166 &data,
167 context.bct);
Anton Staaf20379c12011-03-14 15:38:59 -0700168
169 if (e != 0)
170 data = -1;
Peer Chen6f2cbc72012-03-13 11:12:39 +0800171 else if (values[i].id == token_block_size_log2 ||
172 values[i].id == token_page_size_log2)
Anton Staaf20379c12011-03-14 15:38:59 -0700173 data = 1 << data;
174
175 printf(values[i].message, data);
Anton Staafc6244272011-02-24 10:17:50 -0800176 }
177
Anton Staaf496f9652011-03-02 09:23:27 -0800178 /* Display bootloader values */
Peer Chen6f2cbc72012-03-13 11:12:39 +0800179 e = g_bct_parse_interf->get_value(token_bootloader_used,
Anton Staaf2b6c88c2011-03-02 09:22:25 -0800180 &bootloaders_used,
181 context.bct);
Anton Staafc6244272011-02-24 10:17:50 -0800182
Anton Staaf20379c12011-03-14 15:38:59 -0700183 if ((e == 0) && (bootloaders_used > 0)) {
184 int bl_count = sizeof(bl_values) / sizeof(bl_values[0]);
Anton Staafc6244272011-02-24 10:17:50 -0800185
Anton Staaf20379c12011-03-14 15:38:59 -0700186 printf("#\n"
187 "# These values are set by cbootimage using the\n"
188 "# bootloader provided by the Bootloader=...\n"
189 "# configuration option.\n"
190 "#\n");
191
192 for (i = 0; i < bootloaders_used; ++i) {
193 for (j = 0; j < bl_count; ++j) {
Peer Chen6f2cbc72012-03-13 11:12:39 +0800194 e = g_bct_parse_interf->getbl_param(i,
Anton Staaf20379c12011-03-14 15:38:59 -0700195 bl_values[j].id,
196 &data,
197 context.bct);
198 printf("# Bootloader[%d].", i);
199
200 if (e != 0)
201 data = -1;
202
203 printf(bl_values[j].message, data);
204 }
Anton Staafc6244272011-02-24 10:17:50 -0800205 }
206 }
207
Anton Staaf20379c12011-03-14 15:38:59 -0700208 /* Display flash device parameters */
Peer Chen6f2cbc72012-03-13 11:12:39 +0800209 e = g_bct_parse_interf->get_value(token_num_param_sets,
Anton Staaf496f9652011-03-02 09:23:27 -0800210 &parameters_used,
211 context.bct);
212
213 for (i = 0; (e == 0) && (i < parameters_used); ++i) {
Anton Staafe517a4f2011-03-14 12:28:06 -0700214 field_item const * device_field_table = NULL;
Anton Staaf20379c12011-03-14 15:38:59 -0700215 char const * prefix = NULL;
Anton Staafe517a4f2011-03-14 12:28:06 -0700216 field_item const * item;
217
Peer Chen6f2cbc72012-03-13 11:12:39 +0800218 e = g_bct_parse_interf->get_dev_param(&context,
219 i,
220 token_dev_type,
221 &type);
Anton Staaf20379c12011-03-14 15:38:59 -0700222 printf("\n"
223 "DevType[%d] = ", i);
Peer Chen6f2cbc72012-03-13 11:12:39 +0800224 display_enum_value(&context, s_devtype_table_t20, type);
Anton Staaf20379c12011-03-14 15:38:59 -0700225 printf(";\n");
226
Peer Chen6f2cbc72012-03-13 11:12:39 +0800227 switch (type) {
Anton Staaf496f9652011-03-02 09:23:27 -0800228 case nvboot_dev_type_spi:
Peer Chen6f2cbc72012-03-13 11:12:39 +0800229 device_field_table = s_spiflash_table_t20;
Anton Staaf20379c12011-03-14 15:38:59 -0700230 prefix = "SpiFlashParams";
Anton Staaf496f9652011-03-02 09:23:27 -0800231 break;
232
233 case nvboot_dev_type_sdmmc:
Peer Chen6f2cbc72012-03-13 11:12:39 +0800234 if (bct->boot_data_version ==
235 NVBOOT_BOOTDATA_VERSION(3, 1))
236 device_field_table = s_sdmmc_table_t30;
237 else
238 device_field_table = s_sdmmc_table_t20;
Anton Staaf20379c12011-03-14 15:38:59 -0700239 prefix = "SdmmcParams";
Anton Staafe517a4f2011-03-14 12:28:06 -0700240 break;
241
242 case nvboot_dev_type_nand:
Peer Chen6f2cbc72012-03-13 11:12:39 +0800243 if (bct->boot_data_version ==
244 NVBOOT_BOOTDATA_VERSION(3, 1))
245 device_field_table = s_nand_table_t30;
246 else
247 device_field_table = s_nand_table_t20;
Anton Staaf20379c12011-03-14 15:38:59 -0700248 prefix = "NandParams";
Anton Staaf496f9652011-03-02 09:23:27 -0800249 break;
250
251 default:
Anton Staafe517a4f2011-03-14 12:28:06 -0700252 device_field_table = NULL;
Anton Staaf20379c12011-03-14 15:38:59 -0700253 prefix = "";
Anton Staaf496f9652011-03-02 09:23:27 -0800254 break;
255 }
256
Anton Staafe517a4f2011-03-14 12:28:06 -0700257 if (!device_field_table)
258 continue;
Anton Staaf496f9652011-03-02 09:23:27 -0800259
Anton Staafe517a4f2011-03-14 12:28:06 -0700260 int width = max_width(device_field_table);
261
262 for (item = device_field_table; item->name != NULL; ++item) {
Peer Chen6f2cbc72012-03-13 11:12:39 +0800263 g_bct_parse_interf->get_dev_param(&context,
264 i,
265 item->token,
266 &data);
Anton Staaf20379c12011-03-14 15:38:59 -0700267 printf("DeviceParam[%d].%s.%-*s = ",
268 i, prefix, width, item->name);
269
270 if (e != 0)
271 printf("<ERROR reading parameter (%d)>", e);
272 else
273 display_field_value(&context, item, data);
274
275 printf(";\n");
Anton Staaf496f9652011-03-02 09:23:27 -0800276 }
277 }
278
Anton Staaf20379c12011-03-14 15:38:59 -0700279 /* Display SDRAM parameters */
Peer Chen6f2cbc72012-03-13 11:12:39 +0800280 e = g_bct_parse_interf->get_value(token_num_sdram_sets,
Vincent Palatin99475842011-03-07 16:09:25 -0500281 &sdram_used,
282 context.bct);
283
284 for (i = 0; (e == 0) && (i < sdram_used); ++i) {
Peer Chen6f2cbc72012-03-13 11:12:39 +0800285 field_item const *s_sdram_field_table;
286 field_item const *item;
Anton Staafe517a4f2011-03-14 12:28:06 -0700287
Anton Staaf20379c12011-03-14 15:38:59 -0700288 printf("\n");
289
Peer Chen6f2cbc72012-03-13 11:12:39 +0800290 if (bct->boot_data_version == NVBOOT_BOOTDATA_VERSION(3, 1))
291 s_sdram_field_table = s_sdram_field_table_t30;
292 else
293 s_sdram_field_table = s_sdram_field_table_t20;
294
295 int width = max_width(s_sdram_field_table);
296
Anton Staafe517a4f2011-03-14 12:28:06 -0700297 for (item = s_sdram_field_table; item->name != NULL; ++item) {
Peer Chen6f2cbc72012-03-13 11:12:39 +0800298 e = g_bct_parse_interf ->get_sdram_param(&context,
299 i,
300 item->token,
301 &data);
Anton Staaf20379c12011-03-14 15:38:59 -0700302 printf("SDRAM[%d].%-*s = ", i, width, item->name);
Anton Staafe517a4f2011-03-14 12:28:06 -0700303
304 if (e != 0)
305 printf("<ERROR reading parameter (%d)>", e);
306 else
Anton Staaf20379c12011-03-14 15:38:59 -0700307 display_field_value(&context, item, data);
Anton Staafe517a4f2011-03-14 12:28:06 -0700308
Anton Staaf20379c12011-03-14 15:38:59 -0700309 printf(";\n");
Vincent Palatin99475842011-03-07 16:09:25 -0500310 }
311 }
312
Anton Staafc6244272011-02-24 10:17:50 -0800313 /* Clean up memory. */
314 cleanup_context(&context);
315
316 return e;
317}
Anton Staaf20379c12011-03-14 15:38:59 -0700318/*****************************************************************************/