openwrt/package/boot/uboot-mediatek/patches/200-cmd-add-imsz-and-imszb.patch
Daniel Golle 50f7c5af4a uboot-mediatek: update to v2023.04
Update to next U-Boot timed release.
Remove now obsolete patch
100-01-board-mediatek-add-more-network-configurations.patch
Default IP addresses are now dealt with in Kconfig, no longer in board-
specific C header files.

Add patches to restore ANSI support in bootmenu which was broken upstream,
always use high-speed mode on serial UART for improved stability and fix
an issue with pinconf not being applied on MT7623 resulting in eMMC
being inaccessible when booting from micro SD card.

In order to keep the size of the bootloader on MT7623 below 512kB remove
some unneeded commands on both MT7623 boards.

Tested on:
 * BananaPi BPi-R2 (MT7623N)
 * BananaPi BPi-R3 (MT7986A)
 * BananaPi BPi-R64 (MT7622A)
 * Linksys E8450 (MT7622B)

Signed-off-by: Daniel Golle <daniel@makrotopia.org>
2023-04-12 22:02:27 +01:00

134 lines
3.3 KiB
Diff

--- a/cmd/bootm.c
+++ b/cmd/bootm.c
@@ -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[])
{
--- a/boot/image-fit.c
+++ b/boot/image-fit.c
@@ -2051,6 +2051,50 @@ static const char *fit_get_image_type_pr
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);
+
+ /* simple FIT with internal images */
+ if (hdrsize > 0x1000)
+ return hdrsize;
+
+ images_noffset = fdt_path_offset(fit, FIT_IMAGES_PATH);
+ if (images_noffset < 0) {
+ printf("Can't find images parent node '%s' (%s)\n",
+ FIT_IMAGES_PATH, fdt_strerror(images_noffset));
+ return 0;
+ }
+
+ 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)
+ return 0;
+
+ img_total = data_size + (data - fit);
+
+ max_size = (max_size > img_total) ? max_size : img_total;
+ }
+ }
+
+ 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,
--- a/include/image.h
+++ b/include/image.h
@@ -1046,6 +1046,7 @@ int fit_parse_subimage(const char *spec,
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);