xref: /rk3399_rockchip-uboot/cmd/cbfs.c (revision 2e192b245ed36a63bab0ef576999a95e23f60ecd)
1*2e192b24SSimon Glass /*
2*2e192b24SSimon Glass  * Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
3*2e192b24SSimon Glass  *
4*2e192b24SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
5*2e192b24SSimon Glass  */
6*2e192b24SSimon Glass 
7*2e192b24SSimon Glass /*
8*2e192b24SSimon Glass  * CBFS commands
9*2e192b24SSimon Glass  */
10*2e192b24SSimon Glass #include <common.h>
11*2e192b24SSimon Glass #include <command.h>
12*2e192b24SSimon Glass #include <cbfs.h>
13*2e192b24SSimon Glass 
14*2e192b24SSimon Glass int do_cbfs_init(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
15*2e192b24SSimon Glass {
16*2e192b24SSimon Glass 	uintptr_t end_of_rom = 0xffffffff;
17*2e192b24SSimon Glass 	char *ep;
18*2e192b24SSimon Glass 
19*2e192b24SSimon Glass 	if (argc > 2) {
20*2e192b24SSimon Glass 		printf("usage: cbfsls [end of rom]>\n");
21*2e192b24SSimon Glass 		return 0;
22*2e192b24SSimon Glass 	}
23*2e192b24SSimon Glass 	if (argc == 2) {
24*2e192b24SSimon Glass 		end_of_rom = (int)simple_strtoul(argv[1], &ep, 16);
25*2e192b24SSimon Glass 		if (*ep) {
26*2e192b24SSimon Glass 			puts("\n** Invalid end of ROM **\n");
27*2e192b24SSimon Glass 			return 1;
28*2e192b24SSimon Glass 		}
29*2e192b24SSimon Glass 	}
30*2e192b24SSimon Glass 	file_cbfs_init(end_of_rom);
31*2e192b24SSimon Glass 	if (file_cbfs_result != CBFS_SUCCESS) {
32*2e192b24SSimon Glass 		printf("%s.\n", file_cbfs_error());
33*2e192b24SSimon Glass 		return 1;
34*2e192b24SSimon Glass 	}
35*2e192b24SSimon Glass 	return 0;
36*2e192b24SSimon Glass }
37*2e192b24SSimon Glass 
38*2e192b24SSimon Glass U_BOOT_CMD(
39*2e192b24SSimon Glass 	cbfsinit,	2,	0,	do_cbfs_init,
40*2e192b24SSimon Glass 	"initialize the cbfs driver",
41*2e192b24SSimon Glass 	"[end of rom]\n"
42*2e192b24SSimon Glass 	"    - Initialize the cbfs driver. The optional 'end of rom'\n"
43*2e192b24SSimon Glass 	"      parameter specifies where the end of the ROM is that the\n"
44*2e192b24SSimon Glass 	"      CBFS is in. It defaults to 0xFFFFFFFF\n"
45*2e192b24SSimon Glass );
46*2e192b24SSimon Glass 
47*2e192b24SSimon Glass int do_cbfs_fsload(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
48*2e192b24SSimon Glass {
49*2e192b24SSimon Glass 	const struct cbfs_cachenode *file;
50*2e192b24SSimon Glass 	unsigned long offset;
51*2e192b24SSimon Glass 	unsigned long count;
52*2e192b24SSimon Glass 	long size;
53*2e192b24SSimon Glass 
54*2e192b24SSimon Glass 	if (argc < 3) {
55*2e192b24SSimon Glass 		printf("usage: cbfsload <addr> <filename> [bytes]\n");
56*2e192b24SSimon Glass 		return 1;
57*2e192b24SSimon Glass 	}
58*2e192b24SSimon Glass 
59*2e192b24SSimon Glass 	/* parse offset and count */
60*2e192b24SSimon Glass 	offset = simple_strtoul(argv[1], NULL, 16);
61*2e192b24SSimon Glass 	if (argc == 4)
62*2e192b24SSimon Glass 		count = simple_strtoul(argv[3], NULL, 16);
63*2e192b24SSimon Glass 	else
64*2e192b24SSimon Glass 		count = 0;
65*2e192b24SSimon Glass 
66*2e192b24SSimon Glass 	file = file_cbfs_find(argv[2]);
67*2e192b24SSimon Glass 	if (!file) {
68*2e192b24SSimon Glass 		if (file_cbfs_result == CBFS_FILE_NOT_FOUND)
69*2e192b24SSimon Glass 			printf("%s: %s\n", file_cbfs_error(), argv[2]);
70*2e192b24SSimon Glass 		else
71*2e192b24SSimon Glass 			printf("%s.\n", file_cbfs_error());
72*2e192b24SSimon Glass 		return 1;
73*2e192b24SSimon Glass 	}
74*2e192b24SSimon Glass 
75*2e192b24SSimon Glass 	printf("reading %s\n", file_cbfs_name(file));
76*2e192b24SSimon Glass 
77*2e192b24SSimon Glass 	size = file_cbfs_read(file, (void *)offset, count);
78*2e192b24SSimon Glass 
79*2e192b24SSimon Glass 	printf("\n%ld bytes read\n", size);
80*2e192b24SSimon Glass 
81*2e192b24SSimon Glass 	setenv_hex("filesize", size);
82*2e192b24SSimon Glass 
83*2e192b24SSimon Glass 	return 0;
84*2e192b24SSimon Glass }
85*2e192b24SSimon Glass 
86*2e192b24SSimon Glass U_BOOT_CMD(
87*2e192b24SSimon Glass 	cbfsload,	4,	0,	do_cbfs_fsload,
88*2e192b24SSimon Glass 	"load binary file from a cbfs filesystem",
89*2e192b24SSimon Glass 	"<addr> <filename> [bytes]\n"
90*2e192b24SSimon Glass 	"    - load binary file 'filename' from the cbfs to address 'addr'\n"
91*2e192b24SSimon Glass );
92*2e192b24SSimon Glass 
93*2e192b24SSimon Glass int do_cbfs_ls(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
94*2e192b24SSimon Glass {
95*2e192b24SSimon Glass 	const struct cbfs_cachenode *file = file_cbfs_get_first();
96*2e192b24SSimon Glass 	int files = 0;
97*2e192b24SSimon Glass 
98*2e192b24SSimon Glass 	if (!file) {
99*2e192b24SSimon Glass 		printf("%s.\n", file_cbfs_error());
100*2e192b24SSimon Glass 		return 1;
101*2e192b24SSimon Glass 	}
102*2e192b24SSimon Glass 
103*2e192b24SSimon Glass 	printf("     size              type  name\n");
104*2e192b24SSimon Glass 	printf("------------------------------------------\n");
105*2e192b24SSimon Glass 	while (file) {
106*2e192b24SSimon Glass 		u32 type = file_cbfs_type(file);
107*2e192b24SSimon Glass 		char *type_name = NULL;
108*2e192b24SSimon Glass 		const char *filename = file_cbfs_name(file);
109*2e192b24SSimon Glass 
110*2e192b24SSimon Glass 		printf(" %8d", file_cbfs_size(file));
111*2e192b24SSimon Glass 
112*2e192b24SSimon Glass 		switch (type) {
113*2e192b24SSimon Glass 		case CBFS_TYPE_STAGE:
114*2e192b24SSimon Glass 			type_name = "stage";
115*2e192b24SSimon Glass 			break;
116*2e192b24SSimon Glass 		case CBFS_TYPE_PAYLOAD:
117*2e192b24SSimon Glass 			type_name = "payload";
118*2e192b24SSimon Glass 			break;
119*2e192b24SSimon Glass 		case CBFS_TYPE_OPTIONROM:
120*2e192b24SSimon Glass 			type_name = "option rom";
121*2e192b24SSimon Glass 			break;
122*2e192b24SSimon Glass 		case CBFS_TYPE_BOOTSPLASH:
123*2e192b24SSimon Glass 			type_name = "boot splash";
124*2e192b24SSimon Glass 			break;
125*2e192b24SSimon Glass 		case CBFS_TYPE_RAW:
126*2e192b24SSimon Glass 			type_name = "raw";
127*2e192b24SSimon Glass 			break;
128*2e192b24SSimon Glass 		case CBFS_TYPE_VSA:
129*2e192b24SSimon Glass 			type_name = "vsa";
130*2e192b24SSimon Glass 			break;
131*2e192b24SSimon Glass 		case CBFS_TYPE_MBI:
132*2e192b24SSimon Glass 			type_name = "mbi";
133*2e192b24SSimon Glass 			break;
134*2e192b24SSimon Glass 		case CBFS_TYPE_MICROCODE:
135*2e192b24SSimon Glass 			type_name = "microcode";
136*2e192b24SSimon Glass 			break;
137*2e192b24SSimon Glass 		case CBFS_COMPONENT_CMOS_DEFAULT:
138*2e192b24SSimon Glass 			type_name = "cmos default";
139*2e192b24SSimon Glass 			break;
140*2e192b24SSimon Glass 		case CBFS_COMPONENT_CMOS_LAYOUT:
141*2e192b24SSimon Glass 			type_name = "cmos layout";
142*2e192b24SSimon Glass 			break;
143*2e192b24SSimon Glass 		case -1UL:
144*2e192b24SSimon Glass 			type_name = "null";
145*2e192b24SSimon Glass 			break;
146*2e192b24SSimon Glass 		}
147*2e192b24SSimon Glass 		if (type_name)
148*2e192b24SSimon Glass 			printf("  %16s", type_name);
149*2e192b24SSimon Glass 		else
150*2e192b24SSimon Glass 			printf("  %16d", type);
151*2e192b24SSimon Glass 
152*2e192b24SSimon Glass 		if (filename[0])
153*2e192b24SSimon Glass 			printf("  %s\n", filename);
154*2e192b24SSimon Glass 		else
155*2e192b24SSimon Glass 			printf("  %s\n", "(empty)");
156*2e192b24SSimon Glass 		file_cbfs_get_next(&file);
157*2e192b24SSimon Glass 		files++;
158*2e192b24SSimon Glass 	}
159*2e192b24SSimon Glass 
160*2e192b24SSimon Glass 	printf("\n%d file(s)\n\n", files);
161*2e192b24SSimon Glass 	return 0;
162*2e192b24SSimon Glass }
163*2e192b24SSimon Glass 
164*2e192b24SSimon Glass U_BOOT_CMD(
165*2e192b24SSimon Glass 	cbfsls,	1,	1,	do_cbfs_ls,
166*2e192b24SSimon Glass 	"list files",
167*2e192b24SSimon Glass 	"    - list the files in the cbfs\n"
168*2e192b24SSimon Glass );
169*2e192b24SSimon Glass 
170*2e192b24SSimon Glass int do_cbfs_fsinfo(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
171*2e192b24SSimon Glass {
172*2e192b24SSimon Glass 	const struct cbfs_header *header = file_cbfs_get_header();
173*2e192b24SSimon Glass 
174*2e192b24SSimon Glass 	if (!header) {
175*2e192b24SSimon Glass 		printf("%s.\n", file_cbfs_error());
176*2e192b24SSimon Glass 		return 1;
177*2e192b24SSimon Glass 	}
178*2e192b24SSimon Glass 
179*2e192b24SSimon Glass 	printf("\n");
180*2e192b24SSimon Glass 	printf("CBFS version: %#x\n", header->version);
181*2e192b24SSimon Glass 	printf("ROM size: %#x\n", header->rom_size);
182*2e192b24SSimon Glass 	printf("Boot block size: %#x\n", header->boot_block_size);
183*2e192b24SSimon Glass 	printf("CBFS size: %#x\n",
184*2e192b24SSimon Glass 		header->rom_size - header->boot_block_size - header->offset);
185*2e192b24SSimon Glass 	printf("Alignment: %d\n", header->align);
186*2e192b24SSimon Glass 	printf("Offset: %#x\n", header->offset);
187*2e192b24SSimon Glass 	printf("\n");
188*2e192b24SSimon Glass 
189*2e192b24SSimon Glass 	return 0;
190*2e192b24SSimon Glass }
191*2e192b24SSimon Glass 
192*2e192b24SSimon Glass U_BOOT_CMD(
193*2e192b24SSimon Glass 	cbfsinfo,	1,	1,	do_cbfs_fsinfo,
194*2e192b24SSimon Glass 	"print information about filesystem",
195*2e192b24SSimon Glass 	"    - print information about the cbfs filesystem\n"
196*2e192b24SSimon Glass );
197