xref: /OK3568_Linux_fs/u-boot/cmd/dtimg.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * (C) Copyright 2018 Linaro Ltd.
3*4882a593Smuzhiyun  * Sam Protsenko <semen.protsenko@linaro.org>
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * SPDX-License-Identifier:	GPL-2.0+
6*4882a593Smuzhiyun  */
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun #include <image-android-dt.h>
9*4882a593Smuzhiyun #include <common.h>
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun enum cmd_dtimg_info {
12*4882a593Smuzhiyun 	CMD_DTIMG_START = 0,
13*4882a593Smuzhiyun 	CMD_DTIMG_SIZE,
14*4882a593Smuzhiyun };
15*4882a593Smuzhiyun 
do_dtimg_dump(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])16*4882a593Smuzhiyun static int do_dtimg_dump(cmd_tbl_t *cmdtp, int flag, int argc,
17*4882a593Smuzhiyun 			 char * const argv[])
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun 	char *endp;
20*4882a593Smuzhiyun 	ulong hdr_addr;
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun 	if (argc != 2)
23*4882a593Smuzhiyun 		return CMD_RET_USAGE;
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun 	hdr_addr = simple_strtoul(argv[1], &endp, 16);
26*4882a593Smuzhiyun 	if (*endp != '\0') {
27*4882a593Smuzhiyun 		printf("Error: Wrong image address\n");
28*4882a593Smuzhiyun 		return CMD_RET_FAILURE;
29*4882a593Smuzhiyun 	}
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun 	if (!android_dt_check_header(hdr_addr)) {
32*4882a593Smuzhiyun 		printf("Error: DT image header is incorrect\n");
33*4882a593Smuzhiyun 		return CMD_RET_FAILURE;
34*4882a593Smuzhiyun 	}
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun 	android_dt_print_contents(hdr_addr);
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	return CMD_RET_SUCCESS;
39*4882a593Smuzhiyun }
40*4882a593Smuzhiyun 
dtimg_get_fdt(int argc,char * const argv[],enum cmd_dtimg_info cmd)41*4882a593Smuzhiyun static int dtimg_get_fdt(int argc, char * const argv[], enum cmd_dtimg_info cmd)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun 	ulong hdr_addr;
44*4882a593Smuzhiyun 	u32 index;
45*4882a593Smuzhiyun 	char *endp;
46*4882a593Smuzhiyun 	ulong fdt_addr;
47*4882a593Smuzhiyun 	u32 fdt_size;
48*4882a593Smuzhiyun 	char buf[65];
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	if (argc != 4)
51*4882a593Smuzhiyun 		return CMD_RET_USAGE;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 	hdr_addr = simple_strtoul(argv[1], &endp, 16);
54*4882a593Smuzhiyun 	if (*endp != '\0') {
55*4882a593Smuzhiyun 		printf("Error: Wrong image address\n");
56*4882a593Smuzhiyun 		return CMD_RET_FAILURE;
57*4882a593Smuzhiyun 	}
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	if (!android_dt_check_header(hdr_addr)) {
60*4882a593Smuzhiyun 		printf("Error: DT image header is incorrect\n");
61*4882a593Smuzhiyun 		return CMD_RET_FAILURE;
62*4882a593Smuzhiyun 	}
63*4882a593Smuzhiyun 
64*4882a593Smuzhiyun 	index = simple_strtoul(argv[2], &endp, 0);
65*4882a593Smuzhiyun 	if (*endp != '\0') {
66*4882a593Smuzhiyun 		printf("Error: Wrong index\n");
67*4882a593Smuzhiyun 		return CMD_RET_FAILURE;
68*4882a593Smuzhiyun 	}
69*4882a593Smuzhiyun 
70*4882a593Smuzhiyun 	if (!android_dt_get_fdt_by_index(hdr_addr, index, &fdt_addr, &fdt_size))
71*4882a593Smuzhiyun 		return CMD_RET_FAILURE;
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	switch (cmd) {
74*4882a593Smuzhiyun 	case CMD_DTIMG_START:
75*4882a593Smuzhiyun 		snprintf(buf, sizeof(buf), "%lx", fdt_addr);
76*4882a593Smuzhiyun 		break;
77*4882a593Smuzhiyun 	case CMD_DTIMG_SIZE:
78*4882a593Smuzhiyun 		snprintf(buf, sizeof(buf), "%x", fdt_size);
79*4882a593Smuzhiyun 		break;
80*4882a593Smuzhiyun 	default:
81*4882a593Smuzhiyun 		printf("Error: Unknown cmd_dtimg_info value: %d\n", cmd);
82*4882a593Smuzhiyun 		return CMD_RET_FAILURE;
83*4882a593Smuzhiyun 	}
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 	env_set(argv[3], buf);
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun 	return CMD_RET_SUCCESS;
88*4882a593Smuzhiyun }
89*4882a593Smuzhiyun 
do_dtimg_start(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])90*4882a593Smuzhiyun static int do_dtimg_start(cmd_tbl_t *cmdtp, int flag, int argc,
91*4882a593Smuzhiyun 			  char * const argv[])
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun 	return dtimg_get_fdt(argc, argv, CMD_DTIMG_START);
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun 
do_dtimg_size(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])96*4882a593Smuzhiyun static int do_dtimg_size(cmd_tbl_t *cmdtp, int flag, int argc,
97*4882a593Smuzhiyun 			 char * const argv[])
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun 	return dtimg_get_fdt(argc, argv, CMD_DTIMG_SIZE);
100*4882a593Smuzhiyun }
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun static cmd_tbl_t cmd_dtimg_sub[] = {
103*4882a593Smuzhiyun 	U_BOOT_CMD_MKENT(dump, 2, 0, do_dtimg_dump, "", ""),
104*4882a593Smuzhiyun 	U_BOOT_CMD_MKENT(start, 4, 0, do_dtimg_start, "", ""),
105*4882a593Smuzhiyun 	U_BOOT_CMD_MKENT(size, 4, 0, do_dtimg_size, "", ""),
106*4882a593Smuzhiyun };
107*4882a593Smuzhiyun 
do_dtimg(cmd_tbl_t * cmdtp,int flag,int argc,char * const argv[])108*4882a593Smuzhiyun static int do_dtimg(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
109*4882a593Smuzhiyun {
110*4882a593Smuzhiyun 	cmd_tbl_t *cp;
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	cp = find_cmd_tbl(argv[1], cmd_dtimg_sub, ARRAY_SIZE(cmd_dtimg_sub));
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	/* Strip off leading 'dtimg' command argument */
115*4882a593Smuzhiyun 	argc--;
116*4882a593Smuzhiyun 	argv++;
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	if (!cp || argc > cp->maxargs)
119*4882a593Smuzhiyun 		return CMD_RET_USAGE;
120*4882a593Smuzhiyun 	if (flag == CMD_FLAG_REPEAT && !cp->repeatable)
121*4882a593Smuzhiyun 		return CMD_RET_SUCCESS;
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	return cp->cmd(cmdtp, flag, argc, argv);
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun U_BOOT_CMD(
127*4882a593Smuzhiyun 	dtimg, CONFIG_SYS_MAXARGS, 0, do_dtimg,
128*4882a593Smuzhiyun 	"manipulate dtb/dtbo Android image",
129*4882a593Smuzhiyun 	"dump <addr>\n"
130*4882a593Smuzhiyun 	"    - parse specified image and print its structure info\n"
131*4882a593Smuzhiyun 	"      <addr>: image address in RAM, in hex\n"
132*4882a593Smuzhiyun 	"dtimg start <addr> <index> <varname>\n"
133*4882a593Smuzhiyun 	"    - get address (hex) of FDT in the image, by index\n"
134*4882a593Smuzhiyun 	"      <addr>: image address in RAM, in hex\n"
135*4882a593Smuzhiyun 	"      <index>: index of desired FDT in the image\n"
136*4882a593Smuzhiyun 	"      <varname>: name of variable where to store address of FDT\n"
137*4882a593Smuzhiyun 	"dtimg size <addr> <index> <varname>\n"
138*4882a593Smuzhiyun 	"    - get size (hex, bytes) of FDT in the image, by index\n"
139*4882a593Smuzhiyun 	"      <addr>: image address in RAM, in hex\n"
140*4882a593Smuzhiyun 	"      <index>: index of desired FDT in the image\n"
141*4882a593Smuzhiyun 	"      <varname>: name of variable where to store size of FDT"
142*4882a593Smuzhiyun );
143