From 5c142aad7bc018fe000789740a486c49973035b8 Mon Sep 17 00:00:00 2001 From: Tomasz Maciej Nowak Date: Tue, 7 Jun 2022 15:58:27 +0200 Subject: [PATCH] ath79: switch some RedBoot based devices to OKLI loader After the kernel has switched version to 5.10, JA76PF2 and RouterStations lost the capability to sysupgrade the OpenWrt version. The cause is the lack of porting the patches responsible for partial flash erase block writing and these boards FIS directory and RedBoot config partitions share the same erase block. Because of that the FIS directory can't be updated to accommodate kernel/rootfs partition size changes. This could be remedied by bootloader update, but it is very intrusive and could potentially lead to non-trivial recovery procedure, if something went wrong. The less difficult option is to use OpenWrt kernel loader, which will let us use static partition sizes and employ mtd splitter to dynamically adjust kernel and rootfs partition sizes. On sysupgrade from ath79 19.07 or 21.02 image, which still let to modify FIS directory, the loader will be written to kernel partition, while the kernel+rootfs to rootfs partition. The caveats are: * image format changes, no possible upgrade from ar71xx target images * downgrade to any older OpenWrt version will require TFTP recovery or usage of bootloader command line interface To downgrade to 19.07 or 21.02, or to upgrade if one is already on OpenWrt with kernel 5.10, for RouterStations use TFTP recovery procedure. For JA76PF2 use instructions from this commit message: commit 0cc87b3bacee ("ath79: image: disable sysupgrade images for routerstations and ja76pf2"), replacing kernel image with loader (loader.bin suffix) and rootfs image with firmware (firmware.bin suffix). Fixes: b10d6044599d ("kernel: add linux 5.10 support") Fixes: 15aa53d7ee65 ("ath79: switch to Kernel 5.10") Signed-off-by: Tomasz Maciej Nowak (mkubntimage was moved to generic-ubnt.mk) Signed-off-by: Christian Lamparter --- .../linux/ath79/dts/ar7161_jjplus_ja76pf2.dts | 39 ++++++++++++++++++- .../ath79/dts/ar7161_ubnt_routerstation.dtsi | 35 ++++++++++++++++- .../etc/uci-defaults/05_fix-compat-version | 5 ++- .../base-files/lib/upgrade/platform.sh | 20 +++++----- target/linux/ath79/image/Makefile | 8 ---- target/linux/ath79/image/common-ubnt.mk | 2 +- target/linux/ath79/image/generic-ubnt.mk | 24 ++++++++---- target/linux/ath79/image/generic.mk | 25 ++++++++---- 8 files changed, 120 insertions(+), 38 deletions(-) diff --git a/target/linux/ath79/dts/ar7161_jjplus_ja76pf2.dts b/target/linux/ath79/dts/ar7161_jjplus_ja76pf2.dts index 8e861bad48..b528c1b69e 100644 --- a/target/linux/ath79/dts/ar7161_jjplus_ja76pf2.dts +++ b/target/linux/ath79/dts/ar7161_jjplus_ja76pf2.dts @@ -4,6 +4,7 @@ #include #include +#include / { model = "jjPlus JA76PF2"; @@ -122,9 +123,45 @@ spi-max-frequency = <25000000>; partitions { + compatible = "fixed-partitions"; #address-cells = <1>; #size-cells = <1>; - compatible = "ecoscentric,redboot-fis-partitions"; + + partition@0 { + label = "RedBoot"; + reg = <0x000000 0x040000>; + read-only; + }; + + partition@40000 { + label = "loader"; + reg = <0x040000 0x020000>; + }; + + partition@60000 { + label = "firmware"; + reg = <0x060000 0xf80000>; + compatible = "openwrt,uimage", "denx,uimage"; + openwrt,ih-magic = ; + }; + + partition@fe0000 { + label = "FIS directory"; + reg = <0xfe0000 0x00f000>; + read-only; + }; + + partition@fef000 { + label = "RedBoot config"; + reg = <0xfef000 0x001000>; + read-only; + }; + + partition@ff0000 { + label = "Atheros Board Data"; + reg = <0xff0000 0x10000>; + read-only; + }; }; }; }; diff --git a/target/linux/ath79/dts/ar7161_ubnt_routerstation.dtsi b/target/linux/ath79/dts/ar7161_ubnt_routerstation.dtsi index 116bc9cfc2..172b0af1eb 100644 --- a/target/linux/ath79/dts/ar7161_ubnt_routerstation.dtsi +++ b/target/linux/ath79/dts/ar7161_ubnt_routerstation.dtsi @@ -4,6 +4,7 @@ #include #include +#include / { aliases { @@ -62,7 +63,39 @@ spi-max-frequency = <25000000>; partitions { - compatible = "ecoscentric,redboot-fis-partitions"; + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + partition@0 { + label = "RedBoot"; + reg = <0x000000 0x030000>; + read-only; + }; + + partition@30000 { + label = "loader"; + reg = <0x030000 0x020000>; + }; + + partition@50000 { + label = "firmware"; + reg = <0x050000 0xfa0000>; + compatible = "openwrt,uimage", "denx,uimage"; + openwrt,ih-magic = ; + }; + + partition@ff0000 { + label = "FIS directory"; + reg = <0xff0000 0x00f000>; + read-only; + }; + + partition@fff000 { + label = "RedBoot config"; + reg = <0xfff000 0x001000>; + read-only; + }; }; }; }; diff --git a/target/linux/ath79/generic/base-files/etc/uci-defaults/05_fix-compat-version b/target/linux/ath79/generic/base-files/etc/uci-defaults/05_fix-compat-version index a6b7fa3162..6646b7e5e7 100644 --- a/target/linux/ath79/generic/base-files/etc/uci-defaults/05_fix-compat-version +++ b/target/linux/ath79/generic/base-files/etc/uci-defaults/05_fix-compat-version @@ -1,8 +1,11 @@ . /lib/functions.sh case "$(board_name)" in + jjplus,ja76pf2|\ meraki,mr12|\ - meraki,mr16) + meraki,mr16|\ + ubnt,routerstation|\ + ubnt,routerstation-pro) uci set system.@system[0].compat_version="2.0" uci commit system ;; diff --git a/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh b/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh index 953d6a96d3..642a9891ff 100644 --- a/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh +++ b/target/linux/ath79/generic/base-files/lib/upgrade/platform.sh @@ -14,21 +14,21 @@ redboot_fis_do_upgrade() { local kern_part="$2" local magic=$(get_magic_word "$sysup_file") - if [ "$magic" = "4349" ]; then - local kern_length=0x$(dd if="$sysup_file" bs=2 skip=1 count=4 2>/dev/null) + if [ "$magic" = "7379" ]; then + local board_dir=$(tar tf $sysup_file | grep -m 1 '^sysupgrade-.*/$') [ -f "$UPGRADE_BACKUP" ] && append="-j $UPGRADE_BACKUP" - dd if="$sysup_file" bs=64k skip=1 2>/dev/null | \ - mtd -r $append -F$kern_part:$kern_length:0x80060000,rootfs write - $kern_part:rootfs - elif [ "$magic" = "7379" ]; then - local board_dir=$(tar tf $sysup_file | grep -m 1 '^sysupgrade-.*/$') - local kern_length=$(tar xf $sysup_file ${board_dir}kernel -O | wc -c) + if grep -q "mtd1.*loader" /proc/mtd; then + tar xf $sysup_file ${board_dir}kernel ${board_dir}root -O | \ + mtd -r $append write - loader:firmware - [ -f "$UPGRADE_BACKUP" ] && append="-j $UPGRADE_BACKUP" - tar xf $sysup_file ${board_dir}kernel ${board_dir}root -O | \ - mtd -r $append -F$kern_part:$kern_length:0x80060000,rootfs write - $kern_part:rootfs + else + local kern_length=$(tar xf $sysup_file ${board_dir}kernel -O | wc -c) + tar xf $sysup_file ${board_dir}kernel ${board_dir}root -O | \ + mtd -r $append -F$kern_part:$kern_length:0x80060000,rootfs write - $kern_part:rootfs + fi else echo "Unknown image, aborting!" return 1 diff --git a/target/linux/ath79/image/Makefile b/target/linux/ath79/image/Makefile index 2a7a0abd50..712ab941e1 100644 --- a/target/linux/ath79/image/Makefile +++ b/target/linux/ath79/image/Makefile @@ -8,14 +8,6 @@ DEVICE_VARS += LOADER_FLASH_MAX LOADER_KERNEL_MAGIC DEVICE_VARS += NETGEAR_BOARD_ID NETGEAR_HW_ID DEVICE_VARS += RAS_BOARD RAS_ROOTFS_SIZE RAS_VERSION -define Build/combined-image - sh $(TOPDIR)/scripts/combined-image.sh \ - "$(IMAGE_KERNEL)" \ - "$@" \ - "$@.new" - @mv $@.new $@ -endef - define Build/loader-common rm -rf $@.src $(MAKE) -C lzma-loader \ diff --git a/target/linux/ath79/image/common-ubnt.mk b/target/linux/ath79/image/common-ubnt.mk index 625f0b4f3f..76d6de000b 100644 --- a/target/linux/ath79/image/common-ubnt.mk +++ b/target/linux/ath79/image/common-ubnt.mk @@ -10,7 +10,7 @@ UBNT_REVISION := $(VERSION_DIST)-$(REVISION) define Build/mkubntimage -$(STAGING_DIR_HOST)/bin/mkfwimage -B $(UBNT_BOARD) \ -v $(UBNT_TYPE).$(UBNT_CHIP).v6.0.0-$(VERSION_DIST)-$(REVISION) \ - -k $(IMAGE_KERNEL) -r $@ -o $@ + -k $(if $(1),$(1),$(IMAGE_KERNEL)) -r $@ -o $@ endef define Build/mkubntimage2 diff --git a/target/linux/ath79/image/generic-ubnt.mk b/target/linux/ath79/image/generic-ubnt.mk index 5259a339df..69f7a94863 100644 --- a/target/linux/ath79/image/generic-ubnt.mk +++ b/target/linux/ath79/image/generic-ubnt.mk @@ -171,14 +171,24 @@ define Device/ubnt_routerstation_common kmod-usb2 fconfig DEVICE_VENDOR := Ubiquiti SOC := ar7161 - IMAGE_SIZE := 16128k + LOADER_TYPE := bin + LOADER_FLASH_OFFS := 0x50000 + COMPILE := loader-$(1).bin + COMPILE/loader-$(1).bin := loader-okli-compile | lzma | pad-to 128k + IMAGE_SIZE := 16000k IMAGES += factory.bin - IMAGE/factory.bin := append-rootfs | pad-rootfs | mkubntimage | \ - check-size - IMAGE/sysupgrade.bin := append-rootfs | pad-rootfs | combined-image | \ - check-size | append-metadata - KERNEL := kernel-bin | append-dtb | lzma | pad-to $$(BLOCKSIZE) + IMAGE/factory.bin := append-kernel | uImage lzma -M 0x4f4b4c49 | pad-to $$$$(BLOCKSIZE) | \ + append-rootfs | pad-rootfs | pad-to $$$$(BLOCKSIZE) | \ + mkubntimage $$$$(KDIR)/loader-$(1).bin | check-size + IMAGE/sysupgrade.bin := append-kernel | uImage lzma -M 0x4f4b4c49 | pad-to $$$$(BLOCKSIZE) | \ + append-rootfs | pad-rootfs | pad-to $$$$(BLOCKSIZE) | check-size | \ + sysupgrade-tar kernel=$$$$(KDIR)/loader-$(1).bin rootfs=$$$$@ | append-metadata + KERNEL := kernel-bin | append-dtb | lzma KERNEL_INITRAMFS := kernel-bin | append-dtb + DEVICE_COMPAT_VERSION := 2.0 + DEVICE_COMPAT_MESSAGE := Partition design has changed compared to older versions (19.07 and 21.02) \ + due to kernel drivers restrictions. Upgrade via sysupgrade mechanism is one way operation. \ + Downgrading OpenWrt version will involve usage of TFTP recovery or bootloader command line interface. endef define Device/ubnt_routerstation @@ -188,7 +198,6 @@ define Device/ubnt_routerstation UBNT_TYPE := RSx UBNT_CHIP := ar7100 DEVICE_PACKAGES += -swconfig - SUPPORTED_DEVICES += routerstation endef TARGET_DEVICES += ubnt_routerstation @@ -198,7 +207,6 @@ define Device/ubnt_routerstation-pro UBNT_BOARD := RSPRO UBNT_TYPE := RSPRO UBNT_CHIP := ar7100pro - SUPPORTED_DEVICES += routerstation-pro endef TARGET_DEVICES += ubnt_routerstation-pro diff --git a/target/linux/ath79/image/generic.mk b/target/linux/ath79/image/generic.mk index 6af90c9903..96b073b1b5 100644 --- a/target/linux/ath79/image/generic.mk +++ b/target/linux/ath79/image/generic.mk @@ -1466,15 +1466,24 @@ define Device/jjplus_ja76pf2 DEVICE_VENDOR := jjPlus DEVICE_MODEL := JA76PF2 DEVICE_PACKAGES += -kmod-ath9k -swconfig -wpad-basic-wolfssl -uboot-envtools fconfig kmod-hwmon-lm75 - IMAGES += kernel.bin rootfs.bin - IMAGE/kernel.bin := append-kernel - IMAGE/rootfs.bin := append-rootfs | pad-rootfs - IMAGE/sysupgrade.bin := append-rootfs | pad-rootfs | combined-image | \ - check-size | append-metadata - KERNEL := kernel-bin | append-dtb | lzma | pad-to $$(BLOCKSIZE) + LOADER_TYPE := bin + LOADER_FLASH_OFFS := 0x60000 + COMPILE := loader-$(1).bin + COMPILE/loader-$(1).bin := loader-okli-compile | lzma | pad-to 128k + ARTIFACTS := loader.bin + ARTIFACT/loader.bin := append-loader-okli $(1) + IMAGES += firmware.bin + IMAGE/firmware.bin := append-kernel | uImage lzma -M 0x4f4b4c49 | pad-to $$$$(BLOCKSIZE) | \ + append-rootfs | pad-rootfs | pad-to $$$$(BLOCKSIZE) | check-size + IMAGE/sysupgrade.bin := $$(IMAGE/firmware.bin) | \ + sysupgrade-tar kernel=$$$$(KDIR)/loader-$(1).bin rootfs=$$$$@ | append-metadata + KERNEL := kernel-bin | append-dtb | lzma KERNEL_INITRAMFS := kernel-bin | append-dtb - IMAGE_SIZE := 16000k - SUPPORTED_DEVICES += ja76pf2 + IMAGE_SIZE := 15872k + DEVICE_COMPAT_VERSION := 2.0 + DEVICE_COMPAT_MESSAGE := Partition design has changed compared to older versions (19.07 and 21.02) \ + due to kernel drivers restrictions. Upgrade via sysupgrade mechanism is one way operation. \ + Downgrading OpenWrt version will involve usage of bootloader command line interface. endef TARGET_DEVICES += jjplus_ja76pf2 -- 2.30.2