[PATCH] ramips: fix Unifi 6 Lite boot failure with v5.15 kernels

Bjørn Mork bjorn at mork.no
Thu Nov 3 10:54:47 PDT 2022


The Unifi 6 Lite U-Boot does not relocate the Device Tree Blobs
found in the FIT image.  It behaves as if fdt_high is set to
0xffffffff whether or not this variable is defined.

Kernel commit 79edff12060f ("scripts/dtc: Update to upstream
version v1.6.0-51-g183df9e9c2b9"), included in v5.12, imported
dtc commit 5e735860c478 ("libfdt: Check for 8-byte address
alignment in fdt_ro_probe_()") into the kernel

The result is that we must ensure that the "data" property of
all the "flat_dt" type images is 8 byte aligned inside the FIT

There is currently no provision in mkimage or dtc for aligning
properties with the blob.  They are naturally 4 byte aligned.
Giving us 50% probability of a soft bricking image.

Work around the missing aligment features in mkimage and dtc
by padding the kernel image and rerunning mkimage if the first
attempt failed.

Example boot log when using a misaligned FIT image:

reading kernel 0 from: 0x1d0000, size: 0x002d5000
   Using 'config at 1' configuration
   Verifying Hash Integrity ... OK
   Trying 'kernel-1' kernel subimage
     Description:  MIPS OpenWrt Linux-5.15.76
     Type:         Kernel Image
     Compression:  lzma compressed
     Data Start:   0x860000e4
     Data Size:    2956005 Bytes = 2.8 MiB
     Architecture: MIPS
     OS:           Linux
     Load Address: 0x80001000
     Entry Point:  0x80001000
     Hash algo:    crc32
     Hash value:   e1bc9460
     Hash algo:    sha1
     Hash value:   6510c4ada31aeea81f2e8e537f78cb367e1c7fab
   Verifying Hash Integrity ... crc32+ sha1+ OK
   Using 'config at 1' configuration
   Trying 'fdt-1' fdt subimage
     Description:  MIPS OpenWrt ubnt_unifi-6-lite device tree blob
     Type:         Flat Device Tree
     Compression:  uncompressed
     Data Start:   0x862d1d0c
     Data Size:    11387 Bytes = 11.1 KiB
     Architecture: MIPS
     Hash algo:    crc32
     Hash value:   16bb5a14
     Hash algo:    sha1
     Hash value:   40f26bf28e33bbe661fec716929f2003301f5e4d
   Verifying Hash Integrity ... crc32+ sha1+ OK
   Booting using the fdt blob at 0x862d1d0c
   Uncompressing Kernel Image ... OK
   Using Device Tree in place at 862d1d0c, end 862d7986
[    0.000000] Linux version 5.15.76 (bjorn at canardo) (mipsel-openwrt-linux-musl-gcc (OpenWrt GCC 11.3.0 r21167-1673b7dca384) 11.3.0, GNU ld (GNU Binutils) 2.37) #0 SMP Wed Nov 2 15:53:34 2022
[    0.000000] SoC Type: MediaTek MT7621 ver:1 eco:3
[    0.000000] printk: bootconsole [early0] enabled
[    0.000000] CPU0 revision is: 0001992f (MIPS 1004Kc)
[    0.000000] Initrd not found or empty - disabling initrd
[    0.000000] VPE topology {2,2} total 4
[    0.000000] Primary instruction cache 32kB, VIPT, 4-way, linesize 32 bytes.
[    0.000000] Primary data cache 32kB, 4-way, PIPT, no aliases, linesize 32 bytes
[    0.000000] MIPS secondary cache 256kB, 8-way, linesize 32 bytes.
[    0.000000] Zone ranges:
[    0.000000]   Normal   [mem 0x0000000000000000-0x000000000fffffff]
[    0.000000]   HighMem  empty
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x000000000fffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x000000000fffffff]
[    0.000000] OF: fdt: No valid device tree found, continuing without
[    0.000000] percpu: Embedded 11 pages/cpu s15632 r8192 d21232 u45056
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 64960
[    0.000000] Kernel command line: rootfstype=squashfs,jffs2
[    0.000000] Dentry cache hash table entries: 32768 (order: 5, 131072 bytes, linear)
[    0.000000] Inode-cache hash table entries: 16384 (order: 4, 65536 bytes, linear)
[    0.000000] Writing ErrCtl register=0004a000
[    0.000000] Readback ErrCtl register=0004a000
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] Memory: 248504K/262144K available (7250K kernel code, 660K rwdata, 1536K rodata, 1228K init, 242K bss, 13640K reserved, 0K cma-reserved, 0K highmem)
[    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=4, Nodes=1
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] 	Tracing variant of Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
[    0.000000] NR_IRQS: 256
[    0.000000] Kernel panic - not syncing: Failed to find mediatek,mt7621-sysc node
[    0.000000] Rebooting in 1 seconds..
[    0.000000] Reboot failed -- System halted

Signed-off-by: Bjørn Mork <bjorn at mork.no>
---
The code below will probably look stupid to anyone with a clue. but I
hope it serves as an illustration of what we need to do.  I'd appreciate
it if anyone can teach me
 - how to do alignment inside a FIT using mkimage, or
 - how to find the position of the embedded fdt blobs in the FIT, or
 - how to check whether a value is aligned

In any case,  believe fixing this ASAP is critical. As it is now, any
image with a 5.15 kernel is just as likely to brick the device as is to
boot.


 target/linux/ramips/image/mt7621.mk | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/target/linux/ramips/image/mt7621.mk b/target/linux/ramips/image/mt7621.mk
index 3ef4cf4efb8f..e3b11abd14ce 100644
--- a/target/linux/ramips/image/mt7621.mk
+++ b/target/linux/ramips/image/mt7621.mk
@@ -132,6 +132,23 @@ define Build/zyxel-nwa-fit
 	@mv $@.new $@
 endef
 
+define Build/fit-dtalign
+	$(TOPDIR)/scripts/mkits.sh \
+		-D $(DEVICE_NAME) -o $@.its -k $@ \
+		-C $(word 1,$(1)) \
+		-d $(word 2,$(1)) \
+		-a $(KERNEL_LOADADDR) -e $(if $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \
+		-c $(if $(DEVICE_DTS_CONFIG),$(DEVICE_DTS_CONFIG),"config-1") \
+		-A $(LINUX_KARCH) -v $(LINUX_VERSION)
+	PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) mkimage -f $@.its $@.new
+	( pos=$$(grep -aob $$(echo -ne  "\xd0\x0d\xfe\xed") $@.new | cut -f1 -d: | tail -1); \
+	  if [ "$$pos" -ne "$$((8*($$pos/8)))" ]; then \
+			dd if=/dev/zero bs=4 count=1 >> $@; \
+			PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) mkimage -f $@.its $@.new; \
+	  fi )
+	@mv $@.new $@
+endef
+
 define Device/dsa-migration
   DEVICE_COMPAT_VERSION := 1.1
   DEVICE_COMPAT_MESSAGE := Config cannot be migrated from swconfig to DSA
@@ -1960,7 +1977,7 @@ define Device/ubnt_unifi-6-lite
   DEVICE_MODEL := UniFi 6 Lite
   DEVICE_DTS_CONFIG := config at 1
   DEVICE_PACKAGES += kmod-mt7603 kmod-mt7915e
-  KERNEL := kernel-bin | lzma | fit lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb
+  KERNEL := kernel-bin | lzma | fit-dtalign lzma $$(KDIR)/image-$$(firstword $$(DEVICE_DTS)).dtb
   IMAGE_SIZE := 15424k
 endef
 TARGET_DEVICES += ubnt_unifi-6-lite
-- 
2.30.2




More information about the openwrt-devel mailing list