uboot: add fit_get_totalsize support from openwrt

Signed-off-by: Tianling Shen <cnsztl@immortalwrt.org>
This commit is contained in:
Tianling Shen
2024-09-07 22:53:51 +08:00
committed by hanwckf
parent 068edc9ca9
commit 67ab0457d2
6 changed files with 206 additions and 0 deletions

View File

@@ -2066,6 +2066,47 @@ static const char *fit_get_image_type_property(int type)
return "unknown";
}
size_t fit_get_totalsize(const void *fit)
{
int ret, ndepth, noffset, images_noffset;
size_t data_size, hdrsize, img_total, max_size = 0;
const void *data;
ret = fdt_check_header(fit);
if (ret) {
debug("Wrong FIT format: not a flattened device tree (err=%d)\n",
ret);
return 0;
}
hdrsize = fdt_totalsize(fit);
/* take care of simple FIT with internal images */
max_size = hdrsize;
images_noffset = fdt_path_offset(fit, FIT_IMAGES_PATH);
if (images_noffset < 0)
goto out;
for (ndepth = 0,
noffset = fdt_next_node(fit, images_noffset, &ndepth);
(noffset >= 0) && (ndepth > 0);
noffset = fdt_next_node(fit, noffset, &ndepth)) {
if (ndepth == 1) {
ret = fit_image_get_data_and_size(fit, noffset, &data, &data_size);
if (ret)
goto out;
img_total = data_size + (data - fit);
max_size = (max_size > img_total) ? max_size : img_total;
}
}
out:
return max_size;
}
int fit_image_load(bootm_headers_t *images, ulong addr,
const char **fit_unamep, const char **fit_uname_configp,
int arch, int ph_type, int bootstage_id,

View File

@@ -257,6 +257,67 @@ U_BOOT_CMD(
/* iminfo - print header info for a requested image */
/*******************************************************************/
#if defined(CONFIG_CMD_IMI)
#if defined(CONFIG_FIT)
#define SECTOR_SHIFT 9
static int image_totalsize(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[], short int in_blocks)
{
ulong addr;
void *fit;
int bsize, tsize;
char buf[16];
if (argc >= 2)
addr = simple_strtoul(argv[1], NULL, 16);
else
addr = image_load_addr;
fit = (void *)map_sysmem(addr, 0);
tsize = fit_get_totalsize(fit);
unmap_sysmem(fit);
if (tsize == 0)
return 1;
bsize = (tsize >> SECTOR_SHIFT) + ((tsize & ((1 << SECTOR_SHIFT) - 1))?1:0);
if (!in_blocks)
snprintf(buf, sizeof(buf), "%x", tsize);
else
snprintf(buf, sizeof(buf), "%x", bsize);
if (argc >= 3)
return env_set(argv[2], buf);
else
printf("%s\n", buf);
return 0;
}
static int do_imsz(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
return image_totalsize(cmdtp, flag, argc, argv, 0);
}
static int do_imszb(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
return image_totalsize(cmdtp, flag, argc, argv, 1);
}
U_BOOT_CMD(
imsz, CONFIG_SYS_MAXARGS, 1, do_imsz,
"get image total size (in bytes)",
"addr [maxhdrlen] [varname]\n"
);
U_BOOT_CMD(
imszb, CONFIG_SYS_MAXARGS, 1, do_imszb,
"get image total size (in blocks)",
"addr [maxhdrlen] [varname]\n"
);
#endif
static int do_iminfo(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{

View File

@@ -1029,6 +1029,7 @@ int fit_parse_subimage(const char *spec, ulong addr_curr,
ulong *addr, const char **image_name);
int fit_get_subimage_count(const void *fit, int images_noffset);
size_t fit_get_totalsize(const void *fit);
void fit_print_contents(const void *fit);
void fit_image_print(const void *fit, int noffset, const char *p);

View File

@@ -2075,6 +2075,47 @@ static const char *fit_get_image_type_property(int type)
return "unknown";
}
size_t fit_get_totalsize(const void *fit)
{
int ret, ndepth, noffset, images_noffset;
size_t data_size, hdrsize, img_total, max_size = 0;
const void *data;
ret = fdt_check_header(fit);
if (ret) {
debug("Wrong FIT format: not a flattened device tree (err=%d)\n",
ret);
return 0;
}
hdrsize = fdt_totalsize(fit);
/* take care of simple FIT with internal images */
max_size = hdrsize;
images_noffset = fdt_path_offset(fit, FIT_IMAGES_PATH);
if (images_noffset < 0)
goto out;
for (ndepth = 0,
noffset = fdt_next_node(fit, images_noffset, &ndepth);
(noffset >= 0) && (ndepth > 0);
noffset = fdt_next_node(fit, noffset, &ndepth)) {
if (ndepth == 1) {
ret = fit_image_get_data_and_size(fit, noffset, &data, &data_size);
if (ret)
goto out;
img_total = data_size + (data - fit);
max_size = (max_size > img_total) ? max_size : img_total;
}
}
out:
return max_size;
}
int fit_image_load(struct bootm_headers *images, ulong addr,
const char **fit_unamep, const char **fit_uname_configp,
int arch, int ph_type, int bootstage_id,

View File

@@ -259,6 +259,67 @@ U_BOOT_CMD(
/* iminfo - print header info for a requested image */
/*******************************************************************/
#if defined(CONFIG_CMD_IMI)
#if defined(CONFIG_FIT)
#define SECTOR_SHIFT 9
static int image_totalsize(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[], short int in_blocks)
{
ulong addr;
void *fit;
int bsize, tsize;
char buf[16];
if (argc >= 2)
addr = simple_strtoul(argv[1], NULL, 16);
else
addr = image_load_addr;
fit = (void *)map_sysmem(addr, 0);
tsize = fit_get_totalsize(fit);
unmap_sysmem(fit);
if (tsize == 0)
return 1;
bsize = (tsize >> SECTOR_SHIFT) + ((tsize & ((1 << SECTOR_SHIFT) - 1))?1:0);
if (!in_blocks)
snprintf(buf, sizeof(buf), "%x", tsize);
else
snprintf(buf, sizeof(buf), "%x", bsize);
if (argc >= 3)
return env_set(argv[2], buf);
else
printf("%s\n", buf);
return 0;
}
static int do_imsz(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
return image_totalsize(cmdtp, flag, argc, argv, 0);
}
static int do_imszb(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{
return image_totalsize(cmdtp, flag, argc, argv, 1);
}
U_BOOT_CMD(
imsz, CONFIG_SYS_MAXARGS, 1, do_imsz,
"get image total size (in bytes)",
"addr [maxhdrlen] [varname]\n"
);
U_BOOT_CMD(
imszb, CONFIG_SYS_MAXARGS, 1, do_imszb,
"get image total size (in blocks)",
"addr [maxhdrlen] [varname]\n"
);
#endif
static int do_iminfo(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
{

View File

@@ -1050,6 +1050,7 @@ int fit_parse_subimage(const char *spec, ulong addr_curr,
ulong *addr, const char **image_name);
int fit_get_subimage_count(const void *fit, int images_noffset);
size_t fit_get_totalsize(const void *fit);
void fit_print_contents(const void *fit);
void fit_image_print(const void *fit, int noffset, const char *p);