Skip to content

Commit

Permalink
ath79: switch some RedBoot based devices to OKLI loader
Browse files Browse the repository at this point in the history
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 0cc87b3 ("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: b10d604 ("kernel: add linux 5.10 support")
Fixes: 15aa53d ("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>
  • Loading branch information
tmn505 authored and chunkeey committed Jun 24, 2022
1 parent 4cca094 commit 5c142aa
Show file tree
Hide file tree
Showing 8 changed files with 120 additions and 38 deletions.
39 changes: 38 additions & 1 deletion target/linux/ath79/dts/ar7161_jjplus_ja76pf2.dts
Expand Up @@ -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";
Expand Down Expand Up @@ -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 = <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;
};
};
};
};
35 changes: 34 additions & 1 deletion target/linux/ath79/dts/ar7161_ubnt_routerstation.dtsi
Expand Up @@ -4,6 +4,7 @@

#include <dt-bindings/gpio/gpio.h>
#include <dt-bindings/input/input.h>
#include <dt-bindings/mtd/partitions/uimage.h>

/ {
aliases {
Expand Down Expand Up @@ -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 = <IH_MAGIC_OKLI>;
};

partition@ff0000 {
label = "FIS directory";
reg = <0xff0000 0x00f000>;
read-only;
};

partition@fff000 {
label = "RedBoot config";
reg = <0xfff000 0x001000>;
read-only;
};
};
};
};
Expand Down
@@ -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
;;
Expand Down
20 changes: 10 additions & 10 deletions target/linux/ath79/generic/base-files/lib/upgrade/platform.sh
Expand Up @@ -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
Expand Down
8 changes: 0 additions & 8 deletions target/linux/ath79/image/Makefile
Expand Up @@ -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 \
Expand Down
2 changes: 1 addition & 1 deletion target/linux/ath79/image/common-ubnt.mk
Expand Up @@ -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
Expand Down
24 changes: 16 additions & 8 deletions target/linux/ath79/image/generic-ubnt.mk
Expand Up @@ -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
Expand All @@ -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

Expand All @@ -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

Expand Down
25 changes: 17 additions & 8 deletions target/linux/ath79/image/generic.mk
Expand Up @@ -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

Expand Down

0 comments on commit 5c142aa

Please sign in to comment.