ath79: switch some RedBoot based devices to OKLI loader
authorTomasz Maciej Nowak <tmn505@gmail.com>
Tue, 7 Jun 2022 13:58:27 +0000 (15:58 +0200)
committerChristian Lamparter <chunkeey@gmail.com>
Fri, 24 Jun 2022 15:09:54 +0000 (17:09 +0200)
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 <tmn505@gmail.com>
(mkubntimage was moved to generic-ubnt.mk)
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
target/linux/ath79/dts/ar7161_jjplus_ja76pf2.dts
target/linux/ath79/dts/ar7161_ubnt_routerstation.dtsi
target/linux/ath79/generic/base-files/etc/uci-defaults/05_fix-compat-version
target/linux/ath79/generic/base-files/lib/upgrade/platform.sh
target/linux/ath79/image/Makefile
target/linux/ath79/image/common-ubnt.mk
target/linux/ath79/image/generic-ubnt.mk
target/linux/ath79/image/generic.mk

index 8e861bad48ab11f380922e83efd0684e80c350b3..b528c1b69ef81c1f9091da879385ec92c64c25fa 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/input/input.h>
+#include <dt-bindings/mtd/partitions/uimage.h>
 
 / {
        model = "jjPlus JA76PF2";
                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 = <IH_MAGIC_OKLI>;
+                       };
+
+                       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;
+                       };
                };
        };
 };
index 116bc9cfc2ffa43164e1ae417925beba26bafdb6..172b0af1eb3bfe0c5561f92e1a5966cfe3ceac37 100644 (file)
@@ -4,6 +4,7 @@
 
 #include <dt-bindings/gpio/gpio.h>
 #include <dt-bindings/input/input.h>
+#include <dt-bindings/mtd/partitions/uimage.h>
 
 / {
        aliases {
                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 = <IH_MAGIC_OKLI>;
+                       };
+
+                       partition@ff0000 {
+                               label = "FIS directory";
+                               reg = <0xff0000 0x00f000>;
+                               read-only;
+                       };
+
+                       partition@fff000 {
+                               label = "RedBoot config";
+                               reg = <0xfff000 0x001000>;
+                               read-only;
+                       };
                };
        };
 };
index a6b7fa31621b99afdb071e40b0b87786cc254964..6646b7e5e7b1b050960c8cf65546d136581860e6 100644 (file)
@@ -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
                ;;
index 953d6a96d36f8a36fcec1c9921e29ac5a5288ad8..642a9891ff2984bcf30e3987d5e5d3a73bd24c66 100644 (file)
@@ -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
index 2a7a0abd50fcd291417490f5d4101a7c334ce2cd..712ab941e18a5c336a494fa80c9c5ab87dadde31 100644 (file)
@@ -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 \
index 625f0b4f3f12c8efe4858cb9e22bcb61445d9bc7..76d6de000ba6039e627d3eb62b36de421a7a447a 100644 (file)
@@ -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
index 5259a339df0b117cbf606b8b1243081b057afd10..69f7a948631609761fa7e74058dd183995a57cc2 100644 (file)
@@ -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
 
index 6af90c9903d3780afe548b7bc59994030aa10207..96b073b1b5f8e65b9becdcc557d483626e03d89d 100644 (file)
@@ -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