[openwrt/openwrt] ipq40xx: kernel compressed boot: reset watchdog countdown

LEDE Commits lede-commits at lists.infradead.org
Sun Jan 17 08:32:26 EST 2021


lynxis pushed a commit to openwrt/openwrt.git, branch master:
https://git.openwrt.org/10d057f84ad13853089b312bb61ecd042ebbb712

commit 10d057f84ad13853089b312bb61ecd042ebbb712
Author: John Thomson <git at johnthomson.fastmail.com.au>
AuthorDate: Fri Oct 23 19:49:26 2020 +1000

    ipq40xx: kernel compressed boot: reset watchdog countdown
    
    If the watchdog is enabled, set the timeout to 30 seconds before
    decompress is started.
    
    Mikrotik ipq40xx devices running with RouterBoot have the SoC watchdog
    enabled and running with a timeout that does not allow time for the
    kernel to decompress and manage the watchdog.
    
    On ipq40xx RouterBoot TFTP boot the watchdog countdown is reset before:
    Jumping to kernel
    
    Signed-off-by: John Thomson <git at johnthomson.fastmail.com.au>
---
 ...ressed-set-ipq40xx-watchdog-to-allow-boot.patch | 66 ++++++++++++++++++++++
 1 file changed, 66 insertions(+)

diff --git a/target/linux/ipq40xx/patches-5.4/302-arm-compressed-set-ipq40xx-watchdog-to-allow-boot.patch b/target/linux/ipq40xx/patches-5.4/302-arm-compressed-set-ipq40xx-watchdog-to-allow-boot.patch
new file mode 100644
index 0000000000..71618a40f2
--- /dev/null
+++ b/target/linux/ipq40xx/patches-5.4/302-arm-compressed-set-ipq40xx-watchdog-to-allow-boot.patch
@@ -0,0 +1,66 @@
+From 11d6a6128a5a07c429941afc202b6e62a19771be Mon Sep 17 00:00:00 2001
+From: John Thomson <git at johnthomson.fastmail.com.au>
+Date: Fri, 23 Oct 2020 19:42:36 +1000
+Subject: [PATCH 2/2] arm: compressed: set ipq40xx watchdog to allow boot
+
+For IPQ40XX systems where the SoC watchdog is activated before linux,
+the watchdog timer may be too small for linux to finish uncompress,
+boot, and watchdog management start.
+If the watchdog is enabled, set the timeout for it to 30 seconds.
+The functionality and offsets were copied from:
+drivers/watchdog/qcom-wdt.c qcom_wdt_set_timeout & qcom_wdt_start
+The watchdog memory address was taken from:
+arch/arm/boot/dts/qcom-ipq4019.dtsi
+
+This was required on Mikrotik IPQ40XX consumer hardware using Mikrotik's
+RouterBoot bootloader.
+
+Signed-off-by: John Thomson <git at johnthomson.fastmail.com.au>
+---
+ arch/arm/boot/compressed/head.S | 35 +++++++++++++++++++++++++++++++++
+ 1 file changed, 35 insertions(+)
+
+--- a/arch/arm/boot/compressed/head.S
++++ b/arch/arm/boot/compressed/head.S
+@@ -599,6 +599,41 @@ not_relocated:	mov	r0, #0
+ 		bic	r4, r4, #1
+ 		blne	cache_on
+ 
++/* Set the Qualcom IPQ40xx watchdog timeout to 30 seconds
++ * if it is enabled, so that there is time for kernel
++ * to decompress, boot, and take over the watchdog.
++ * data and functionality from drivers/watchdog/qcom-wdt.c
++ * address from arch/arm/boot/dts/qcom-ipq4019.dtsi
++ */
++#ifdef CONFIG_ARCH_IPQ40XX
++watchdog_set:
++		/* offsets:
++		 * 0x04 reset	(=1 resets countdown)
++		 * 0x08 enable	(=0 disables)
++		 * 0x0c status	(=1 when SoC was reset by watchdog)
++		 * 0x10 bark	(=timeout warning in ticks)
++		 * 0x14 bite	(=timeout reset in ticks)
++		 * clock rate is 1<<15 hertz
++		 */
++		.equ watchdog, 0x0b017000	@Store watchdog base address
++		movw r0, #:lower16:watchdog
++		movt r0, #:upper16:watchdog
++		ldr r1, [r0, #0x08]	@Get enabled?
++		cmp r1, #1		@If not enabled, do not change
++		bne watchdog_finished
++		mov r1, #0
++		str r1, [r0, #0x08]	@Disable the watchdog
++		mov r1, #1
++		str r1, [r0, #0x04]	@Pet the watchdog
++		mov r1, #30		@30 seconds timeout
++		lsl r1, r1, #15		@converted to ticks
++		str r1, [r0, #0x10]	@Set the bark timeout
++		str r1, [r0, #0x14]	@Set the bite timeout
++		mov r1, #1
++		str r1, [r0, #0x08]	@Enable the watchdog
++watchdog_finished:
++#endif /* CONFIG_ARCH_IPQ40XX */
++
+ /*
+  * The C runtime environment should now be setup sufficiently.
+  * Set up some pointers, and start decompressing.



More information about the lede-commits mailing list