diff --git a/packages/tools/u-boot/package.mk b/packages/tools/u-boot/package.mk index eed24ae828..bb7a33c6b8 100644 --- a/packages/tools/u-boot/package.mk +++ b/packages/tools/u-boot/package.mk @@ -32,6 +32,7 @@ case "${PROJECT}" in PKG_VERSION="2021.01" PKG_SHA256="b407e1510a74e863b8b5cb42a24625344f0e0c2fc7582d8c866bd899367d0454" PKG_URL="http://ftp.denx.de/pub/u-boot/${PKG_NAME}-${PKG_VERSION}.tar.bz2" + PKG_PATCH_DIRS="default" ;; esac diff --git a/packages/tools/u-boot/patches/default/0001-pxe-add-support-for-FDT-overlays.patch b/packages/tools/u-boot/patches/default/0001-pxe-add-support-for-FDT-overlays.patch new file mode 100644 index 0000000000..1c2550284e --- /dev/null +++ b/packages/tools/u-boot/patches/default/0001-pxe-add-support-for-FDT-overlays.patch @@ -0,0 +1,197 @@ +From ac4728b374f39debc266fe42c513ea8f61e3d369 Mon Sep 17 00:00:00 2001 +From: Neil Armstrong +Date: Thu, 24 Dec 2020 09:03:15 +0100 +Subject: [PATCH] pxe: add support for FDT overlays +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +This adds support for specicyinf FDT overlays in an extlinux/pxelinux +configuration file. + +Without this, there is no simple way to apply overlays when the kernel +and ftd is loaded by the pxe command. + +This change adds the 'fdtoverlays' keyword for a label, supporting multiple +overlay files to be applied on top of the fdt specific in the 'fdt' or +'devicetree' keyword. + +Cc: Jernej Škrabec +Cc: Jonas Karlman +Signed-off-by: Neil Armstrong +--- + cmd/pxe_utils.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++ + cmd/pxe_utils.h | 1 + + 2 files changed, 104 insertions(+) + +diff --git a/cmd/pxe_utils.c b/cmd/pxe_utils.c +index 8716e782f6aa..25367190a700 100644 +--- a/cmd/pxe_utils.c ++++ b/cmd/pxe_utils.c +@@ -13,6 +13,8 @@ + #include + #include + #include ++#include ++#include + #include + #include + #include +@@ -284,6 +286,9 @@ static void label_destroy(struct pxe_label *label) + if (label->fdtdir) + free(label->fdtdir); + ++ if (label->fdtoverlays) ++ free(label->fdtoverlays); ++ + free(label); + } + +@@ -331,6 +336,92 @@ static int label_localboot(struct pxe_label *label) + return run_command_list(localcmd, strlen(localcmd), 0); + } + ++/* ++ * Loads fdt overlays specified in 'fdtoverlays'. ++ */ ++#ifdef CONFIG_OF_LIBFDT_OVERLAY ++static void label_boot_fdtoverlay(struct cmd_tbl *cmdtp, struct pxe_label *label) ++{ ++ char *fdtoverlay = label->fdtoverlays; ++ struct fdt_header *working_fdt; ++ char *fdtoverlay_addr_env; ++ ulong fdtoverlay_addr; ++ ulong fdt_addr; ++ int err; ++ ++ /* Get the main fdt and map it */ ++ fdt_addr = simple_strtoul(env_get("fdt_addr_r"), NULL, 16); ++ working_fdt = map_sysmem(fdt_addr, 0); ++ err = fdt_check_header(working_fdt); ++ if (err) ++ return; ++ ++ /* Get the specific overlay loading address */ ++ fdtoverlay_addr_env = env_get("fdtoverlay_addr_r"); ++ if (!fdtoverlay_addr_env) { ++ printf("Invalid fdtoverlay_addr_r for loading overlays\n"); ++ return; ++ } ++ ++ fdtoverlay_addr = simple_strtoul(fdtoverlay_addr_env, NULL, 16); ++ ++ /* Cycle over the overlay files and apply them in order */ ++ do { ++ struct fdt_header *blob; ++ char *overlayfile; ++ char *end; ++ int len; ++ ++ /* Drop leading spaces */ ++ while (*fdtoverlay == ' ') ++ ++fdtoverlay; ++ ++ /* Copy a single filename if multiple provided */ ++ end = strstr(fdtoverlay, " "); ++ if (end) { ++ len = (int)(end - fdtoverlay); ++ overlayfile = malloc(len + 1); ++ strncpy(overlayfile, fdtoverlay, len); ++ overlayfile[len] = '\0'; ++ } else ++ overlayfile = fdtoverlay; ++ ++ if (!strlen(overlayfile)) ++ goto skip_overlay; ++ ++ /* Load overlay file */ ++ err = get_relfile_envaddr(cmdtp, overlayfile, ++ "fdtoverlay_addr_r"); ++ if (err < 0) { ++ printf("Failed loading overlay %s\n", overlayfile); ++ goto skip_overlay; ++ } ++ ++ /* Resize main fdt */ ++ fdt_shrink_to_minimum(working_fdt, 8192); ++ ++ blob = map_sysmem(fdtoverlay_addr, 0); ++ err = fdt_check_header(blob); ++ if (err) { ++ printf("Invalid overlay %s, skipping\n", ++ overlayfile); ++ goto skip_overlay; ++ } ++ ++ err = fdt_overlay_apply_verbose(working_fdt, blob); ++ if (err) { ++ printf("Failed to apply overlay %s, skipping\n", ++ overlayfile); ++ goto skip_overlay; ++ } ++ ++skip_overlay: ++ if (end) ++ free(overlayfile); ++ } while ((fdtoverlay = strstr(fdtoverlay, " "))); ++} ++#endif ++ + /* + * Boot according to the contents of a pxe_label. + * +@@ -525,6 +616,11 @@ static int label_boot(struct cmd_tbl *cmdtp, struct pxe_label *label) + label->name); + goto cleanup; + } ++ ++#ifdef CONFIG_OF_LIBFDT_OVERLAY ++ if (label->fdtoverlays) ++ label_boot_fdtoverlay(cmdtp, label); ++#endif + } else { + bootm_argv[3] = NULL; + } +@@ -582,6 +678,7 @@ enum token_type { + T_INCLUDE, + T_FDT, + T_FDTDIR, ++ T_FDTOVERLAYS, + T_ONTIMEOUT, + T_IPAPPEND, + T_BACKGROUND, +@@ -616,6 +713,7 @@ static const struct token keywords[] = { + {"fdt", T_FDT}, + {"devicetreedir", T_FDTDIR}, + {"fdtdir", T_FDTDIR}, ++ {"fdtoverlays", T_FDTOVERLAYS}, + {"ontimeout", T_ONTIMEOUT,}, + {"ipappend", T_IPAPPEND,}, + {"background", T_BACKGROUND,}, +@@ -1048,6 +1146,11 @@ static int parse_label(char **c, struct pxe_menu *cfg) + err = parse_sliteral(c, &label->fdtdir); + break; + ++ case T_FDTOVERLAYS: ++ if (!label->fdtoverlays) ++ err = parse_sliteral(c, &label->fdtoverlays); ++ break; ++ + case T_LOCALBOOT: + label->localboot = 1; + err = parse_integer(c, &label->localboot_val); +diff --git a/cmd/pxe_utils.h b/cmd/pxe_utils.h +index 77d25888758f..6af952373430 100644 +--- a/cmd/pxe_utils.h ++++ b/cmd/pxe_utils.h +@@ -43,6 +43,7 @@ struct pxe_label { + char *initrd; + char *fdt; + char *fdtdir; ++ char *fdtoverlays; + int ipappend; + int attempted; + int localboot; +-- +2.29.2 + diff --git a/packages/tools/u-boot/patches/default/0002-sunxi-Add-fdtoverlay_addr_r-env-variable.patch b/packages/tools/u-boot/patches/default/0002-sunxi-Add-fdtoverlay_addr_r-env-variable.patch new file mode 100644 index 0000000000..857af13284 --- /dev/null +++ b/packages/tools/u-boot/patches/default/0002-sunxi-Add-fdtoverlay_addr_r-env-variable.patch @@ -0,0 +1,84 @@ +From 48f5c27ae2edfb36d7f6a628d3763b4c4b85c9c7 Mon Sep 17 00:00:00 2001 +From: Jernej Skrabec +Date: Wed, 30 Dec 2020 21:01:20 +0100 +Subject: [PATCH] sunxi: Add fdtoverlay_addr_r env variable + +Signed-off-by: Jernej Skrabec +--- + include/configs/sunxi-common.h | 40 +++++++++++++++++++--------------- + 1 file changed, 22 insertions(+), 18 deletions(-) + +diff --git a/include/configs/sunxi-common.h b/include/configs/sunxi-common.h +index a6a4879523a3..34917be3325f 100644 +--- a/include/configs/sunxi-common.h ++++ b/include/configs/sunxi-common.h +@@ -287,12 +287,13 @@ extern int soft_i2c_gpio_scl; + * Scripts, PXE and DTBs should go afterwards, leaving the rest for the initrd. + * Align the initrd to a 2MB page. + */ +-#define BOOTM_SIZE __stringify(0xa000000) +-#define KERNEL_ADDR_R __stringify(SDRAM_OFFSET(0080000)) +-#define FDT_ADDR_R __stringify(SDRAM_OFFSET(FA00000)) +-#define SCRIPT_ADDR_R __stringify(SDRAM_OFFSET(FC00000)) +-#define PXEFILE_ADDR_R __stringify(SDRAM_OFFSET(FD00000)) +-#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(FE00000)) ++#define BOOTM_SIZE __stringify(0xa000000) ++#define KERNEL_ADDR_R __stringify(SDRAM_OFFSET(0080000)) ++#define FDT_ADDR_R __stringify(SDRAM_OFFSET(FA00000)) ++#define FDTOVERLAY_ADDR_R __stringify(SDRAM_OFFSET(FB00000)) ++#define SCRIPT_ADDR_R __stringify(SDRAM_OFFSET(FC00000)) ++#define PXEFILE_ADDR_R __stringify(SDRAM_OFFSET(FD00000)) ++#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(FE00000)) + + #else + /* +@@ -301,24 +302,26 @@ extern int soft_i2c_gpio_scl; + * 1M script, 1M pxe and the ramdisk at the end. + */ + #ifndef CONFIG_MACH_SUN8I_V3S +-#define BOOTM_SIZE __stringify(0xa000000) +-#define KERNEL_ADDR_R __stringify(SDRAM_OFFSET(2000000)) +-#define FDT_ADDR_R __stringify(SDRAM_OFFSET(3000000)) +-#define SCRIPT_ADDR_R __stringify(SDRAM_OFFSET(3100000)) +-#define PXEFILE_ADDR_R __stringify(SDRAM_OFFSET(3200000)) +-#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(3300000)) ++#define BOOTM_SIZE __stringify(0xa000000) ++#define KERNEL_ADDR_R __stringify(SDRAM_OFFSET(2000000)) ++#define FDT_ADDR_R __stringify(SDRAM_OFFSET(3000000)) ++#define FDTOVERLAY_ADDR_R __stringify(SDRAM_OFFSET(3100000)) ++#define SCRIPT_ADDR_R __stringify(SDRAM_OFFSET(3200000)) ++#define PXEFILE_ADDR_R __stringify(SDRAM_OFFSET(3300000)) ++#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(3400000)) + #else + /* + * 64M RAM minus 2MB heap + 16MB for u-boot, stack, fb, etc. + * 16M uncompressed kernel, 8M compressed kernel, 1M fdt, + * 1M script, 1M pxe and the ramdisk at the end. + */ +-#define BOOTM_SIZE __stringify(0x2e00000) +-#define KERNEL_ADDR_R __stringify(SDRAM_OFFSET(1000000)) +-#define FDT_ADDR_R __stringify(SDRAM_OFFSET(1800000)) +-#define SCRIPT_ADDR_R __stringify(SDRAM_OFFSET(1900000)) +-#define PXEFILE_ADDR_R __stringify(SDRAM_OFFSET(1A00000)) +-#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(1B00000)) ++#define BOOTM_SIZE __stringify(0x2e00000) ++#define KERNEL_ADDR_R __stringify(SDRAM_OFFSET(1000000)) ++#define FDT_ADDR_R __stringify(SDRAM_OFFSET(1800000)) ++#define FDTOVERLAY_ADDR_R __stringify(SDRAM_OFFSET(1900000)) ++#define SCRIPT_ADDR_R __stringify(SDRAM_OFFSET(1A00000)) ++#define PXEFILE_ADDR_R __stringify(SDRAM_OFFSET(1B00000)) ++#define RAMDISK_ADDR_R __stringify(SDRAM_OFFSET(1C00000)) + #endif + #endif + +@@ -326,6 +329,7 @@ extern int soft_i2c_gpio_scl; + "bootm_size=" BOOTM_SIZE "\0" \ + "kernel_addr_r=" KERNEL_ADDR_R "\0" \ + "fdt_addr_r=" FDT_ADDR_R "\0" \ ++ "fdtoverlay_addr_r=" FDTOVERLAY_ADDR_R "\0" \ + "scriptaddr=" SCRIPT_ADDR_R "\0" \ + "pxefile_addr_r=" PXEFILE_ADDR_R "\0" \ + "ramdisk_addr_r=" RAMDISK_ADDR_R "\0" +-- +2.30.0 +