72fb4ac5169c6e184fc1c9afc7cc9f876ef6ea8e
[openwrt/staging/rmilecki.git] / package / boot / uboot-mediatek / patches / 016-fit-totalsize.patch
1 --- a/cmd/bootm.c
2 +++ b/cmd/bootm.c
3 @@ -227,6 +227,65 @@ U_BOOT_CMD(
4 /* iminfo - print header info for a requested image */
5 /*******************************************************************/
6 #if defined(CONFIG_CMD_IMI)
7 +#define SECTOR_SHIFT 9
8 +static int image_totalsize(struct cmd_tbl *cmdtp, int flag, int argc,
9 + char *const argv[], short int in_blocks)
10 +{
11 + ulong addr;
12 + void *fit;
13 + int bsize, tsize, maxhdrsize;
14 + char buf[16];
15 +
16 + if (argc >= 2)
17 + addr = simple_strtoul(argv[1], NULL, 16);
18 + else
19 + addr = image_load_addr;
20 +
21 + fit = (void *)map_sysmem(addr, 0);
22 + tsize = fit_get_totalsize(fit);
23 + unmap_sysmem(fit);
24 + if (tsize == 0)
25 + return 1;
26 +
27 + bsize = (tsize >> SECTOR_SHIFT) + ((tsize & ((1 << SECTOR_SHIFT) - 1))?1:0);
28 +
29 + if (!in_blocks)
30 + snprintf(buf, sizeof(buf), "%x", tsize);
31 + else
32 + snprintf(buf, sizeof(buf), "%x", bsize);
33 +
34 + if (argc >= 3)
35 + return env_set(argv[2], buf);
36 + else
37 + printf("%s\n", buf);
38 +
39 + return 0;
40 +}
41 +
42 +static int do_imsz(struct cmd_tbl *cmdtp, int flag, int argc,
43 + char *const argv[])
44 +{
45 + return image_totalsize(cmdtp, flag, argc, argv, 0);
46 +}
47 +
48 +static int do_imszb(struct cmd_tbl *cmdtp, int flag, int argc,
49 + char *const argv[])
50 +{
51 + return image_totalsize(cmdtp, flag, argc, argv, 1);
52 +}
53 +
54 +U_BOOT_CMD(
55 + imsz, CONFIG_SYS_MAXARGS, 1, do_imsz,
56 + "get image total size (in bytes)",
57 + "addr [maxhdrlen] [varname]\n"
58 +);
59 +
60 +U_BOOT_CMD(
61 + imszb, CONFIG_SYS_MAXARGS, 1, do_imszb,
62 + "get image total size (in blocks)",
63 + "addr [maxhdrlen] [varname]\n"
64 +);
65 +
66 static int do_iminfo(struct cmd_tbl *cmdtp, int flag, int argc,
67 char *const argv[])
68 {
69 --- a/common/image-fit.c
70 +++ b/common/image-fit.c
71 @@ -1878,6 +1878,51 @@ static const char *fit_get_image_type_pr
72 return "unknown";
73 }
74
75 +size_t fit_get_totalsize(const void *fit)
76 +{
77 + int ret, ndepth, noffset, images_noffset;
78 + size_t data_size, hdrsize, img_total, max_size = 0;
79 + const void *data;
80 +
81 + ret = fdt_check_header(fit);
82 + if (ret) {
83 + debug("Wrong FIT format: not a flattened device tree (err=%d)\n",
84 + ret);
85 + return 0;
86 + }
87 +
88 + hdrsize = fdt_totalsize(fit);
89 +
90 + /* simple FIT with internal images */
91 + if (hdrsize > 0x1000)
92 + return hdrsize;
93 +
94 + images_noffset = fdt_path_offset(fit, FIT_IMAGES_PATH);
95 + if (images_noffset < 0) {
96 + printf("Can't find images parent node '%s' (%s)\n",
97 + FIT_IMAGES_PATH, fdt_strerror(images_noffset));
98 + return 0;
99 + }
100 +
101 + for (ndepth = 0,
102 + noffset = fdt_next_node(fit, images_noffset, &ndepth);
103 + (noffset >= 0) && (ndepth > 0);
104 + noffset = fdt_next_node(fit, noffset, &ndepth)) {
105 + if (ndepth == 1) {
106 + ret = fit_image_get_data_and_size(fit, noffset, &data, &data_size);
107 + if (ret)
108 + return 0;
109 +
110 + img_total = data_size + (data - fit);
111 +
112 + max_size = (max_size > img_total) ? max_size : img_total;
113 + }
114 + }
115 +
116 + return max_size;
117 +}
118 +
119 +
120 int fit_image_load(bootm_headers_t *images, ulong addr,
121 const char **fit_unamep, const char **fit_uname_configp,
122 int arch, int image_type, int bootstage_id,
123 --- a/include/image.h
124 +++ b/include/image.h
125 @@ -1027,6 +1027,7 @@ int fit_parse_subimage(const char *spec,
126 ulong *addr, const char **image_name);
127
128 int fit_get_subimage_count(const void *fit, int images_noffset);
129 +size_t fit_get_totalsize(const void *fit);
130 void fit_print_contents(const void *fit);
131 void fit_image_print(const void *fit, int noffset, const char *p);
132