From ea0fb3e525c80f6b5c745896b9a203442f42db1e Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Thu, 24 Dec 2020 17:57:37 +0100 Subject: [PATCH 1/5] u-boot: Add support for PXE DT overlays --- packages/tools/u-boot/package.mk | 1 + ...001-pxe-add-support-for-FDT-overlays.patch | 197 ++++++++++++++++++ ...i-Add-fdtoverlay_addr_r-env-variable.patch | 84 ++++++++ 3 files changed, 282 insertions(+) create mode 100644 packages/tools/u-boot/patches/default/0001-pxe-add-support-for-FDT-overlays.patch create mode 100644 packages/tools/u-boot/patches/default/0002-sunxi-Add-fdtoverlay_addr_r-env-variable.patch 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 + From bc5bc703c327d75b435e1d48bfb1bdb802fa5d42 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Thu, 24 Dec 2020 17:57:53 +0100 Subject: [PATCH 2/5] linux: include symbols in dtb files This slightly increases dtb size but it's important for applying DT overlays. --- packages/linux/package.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/linux/package.mk b/packages/linux/package.mk index fd607610e0..241e6c3644 100644 --- a/packages/linux/package.mk +++ b/packages/linux/package.mk @@ -190,7 +190,7 @@ make_target() { KERNEL_TARGET="${KERNEL_TARGET/uImage/Image}" fi - kernel_make ${KERNEL_TARGET} ${KERNEL_MAKE_EXTRACMD} modules + kernel_make DTC_FLAGS=-@ ${KERNEL_TARGET} ${KERNEL_MAKE_EXTRACMD} modules if [ "${PKG_BUILD_PERF}" = "yes" ]; then ( cd tools/perf From bbd9f802402085eb7384a8e7d0b3810bc445cf38 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Thu, 24 Dec 2020 17:59:27 +0100 Subject: [PATCH 3/5] mkimage: copy overlays for u-boot images --- scripts/mkimage | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/mkimage b/scripts/mkimage index 0f720fc008..a1ae9b48f7 100755 --- a/scripts/mkimage +++ b/scripts/mkimage @@ -219,6 +219,10 @@ elif [ "${BOOTLOADER}" = "u-boot" -a -n "${UBOOT_SYSTEM}" ]; then mcopy "${RELEASE_DIR}/3rdparty/bootloader/${DTB}" :: fi + if [ -d "${RELEASE_DIR}/3rdparty/bootloader/overlays" ]; then + mcopy -s "${RELEASE_DIR}/3rdparty/bootloader/overlays" :: + fi + mkdir -p "${LE_TMP}/extlinux" cat << EOF > "${LE_TMP}/extlinux/extlinux.conf" From f6c6183a835b5cc1d434776c72874a75439e24d8 Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Thu, 24 Dec 2020 17:59:56 +0100 Subject: [PATCH 4/5] dt-overlays: Initial package --- packages/tools/dt-overlays/package.mk | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 packages/tools/dt-overlays/package.mk diff --git a/packages/tools/dt-overlays/package.mk b/packages/tools/dt-overlays/package.mk new file mode 100644 index 0000000000..a42cf15880 --- /dev/null +++ b/packages/tools/dt-overlays/package.mk @@ -0,0 +1,16 @@ +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2021-present Team LibreELEC (https://libreelec.tv) + +PKG_NAME="dt-overlays" +PKG_VERSION="e57a9b1eadd420a4e5d50c0669184828ff12abc5" +PKG_SHA256="b63ee4f54723349ce405c9bd3545b5bb0814e4d1959a6a1db0bb2517318b1cc5" +PKG_LICENSE="GPLv2+ or MIT" +PKG_SITE="https://github.com/LibreELEC/dt-overlays" +PKG_URL="https://github.com/LibreELEC/dt-overlays/archive/${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="dtc:host" +PKG_LONGDESC="The Device Tree Overlays" + +makeinstall_target() { + mkdir -p $INSTALL/usr/share/bootloader/overlays + cp -p overlays/*/*.dtbo $INSTALL/usr/share/bootloader/overlays +} From 7f522fe8ddaec682663500a14ecdadc2e22fe4ac Mon Sep 17 00:00:00 2001 From: Jernej Skrabec Date: Thu, 24 Dec 2020 18:00:39 +0100 Subject: [PATCH 5/5] Allwinner: Enable DT overlays support --- projects/Allwinner/bootloader/release | 4 +++- projects/Allwinner/bootloader/update.sh | 7 +++++++ projects/Allwinner/options | 3 +++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/projects/Allwinner/bootloader/release b/projects/Allwinner/bootloader/release index 8b0b39a9ae..3f88a612e8 100644 --- a/projects/Allwinner/bootloader/release +++ b/projects/Allwinner/bootloader/release @@ -4,9 +4,11 @@ SRCDIR="$BUILD/image/system/usr/share/bootloader" DSTDIR="$RELEASE_DIR/3rdparty/bootloader" -mkdir -p "$DSTDIR" +mkdir -p "$DSTDIR/overlays" if [ -n "$UBOOT_SYSTEM" ]; then cp -a "$SRCDIR/u-boot-sunxi-with-spl.bin" "$DSTDIR" fi cp -a "$SRCDIR"/sun*-${DEVICE,,}-*.dtb "$DSTDIR" + + cp -a "$SRCDIR"/overlays/sun*-${DEVICE,,}-*.dtbo "$DSTDIR"/overlays diff --git a/projects/Allwinner/bootloader/update.sh b/projects/Allwinner/bootloader/update.sh index 1b89f372d6..74c7adbde0 100644 --- a/projects/Allwinner/bootloader/update.sh +++ b/projects/Allwinner/bootloader/update.sh @@ -27,6 +27,13 @@ fi fi done +# update Device Tree Overlays + if [ -d $SYSTEM_ROOT/usr/share/bootloader/overlays ]; then + echo "*** updating Device Tree Overlays ..." + mkdir -p /flash/overlays + cp -p $SYSTEM_ROOT/usr/share/bootloader/overlays/* /flash/overlays + fi + # update bootloader files if [ -f $SYSTEM_ROOT/usr/share/bootloader/u-boot-sunxi-with-spl.bin ]; then echo "*** updating U-Boot on: $BOOT_DISK ..." diff --git a/projects/Allwinner/options b/projects/Allwinner/options index ecca596946..a9d53ef9a1 100644 --- a/projects/Allwinner/options +++ b/projects/Allwinner/options @@ -61,3 +61,6 @@ # debug tty path DEBUG_TTY="/dev/console" + + # additional packages to install: + ADDITIONAL_PACKAGES="dt-overlays"