]> git.ipfire.org Git - thirdparty/u-boot.git/commitdiff
riscv: cpu: th1520: Add a routine to bring up secondary cores
authorYao Zi <ziyao@disroot.org>
Fri, 6 Jun 2025 04:28:02 +0000 (04:28 +0000)
committerLeo Yu-Chi Liang <ycliang@andestech.com>
Thu, 3 Jul 2025 08:14:13 +0000 (16:14 +0800)
On coldboot, only HART 0 among the four HARTs of TH1520 is brought up by
hardware, and the remaining HARTs are in reset states, requiring manual
setup of reset address and deassertion to function normal. Introduce a
routine to do the work.

Signed-off-by: Yao Zi <ziyao@disroot.org>
Reviewed-by: Leo Yu-Chi Liang <ycliang@andestech.com>
arch/riscv/cpu/th1520/cpu.c
arch/riscv/include/asm/arch-th1520/cpu.h

index b83f1272c67e83603732a64d5a421ed394b91511..f60446fd772af7ff2272a26e3332864c756a907c 100644 (file)
@@ -9,8 +9,35 @@
 
 #include <asm/io.h>
 #include <cpu_func.h>
+#include <linux/bitops.h>
 
-#define TH1520_PMP_BASE                (void *)0xffdc020000
+#define TH1520_C910_RST                        (void __iomem *)(0xffef014000 + 0x004)
+#define  TH1520_C910_CORE_RST_N(n)     BIT((n) + 1)
+#define TH1520_SYSCFG_AP_BASE          (void __iomem *)(0xffef018000)
+#define TH1520_SYSCFG_CORE_START_L(n)  (TH1520_SYSCFG_AP_BASE + 0x50 + 8 * (n))
+#define TH1520_SYSCFG_CORE_START_H(n)  (TH1520_SYSCFG_AP_BASE + 0x54 + 8 * (n))
+#define TH1520_PMP_BASE                        (void *)0xffdc020000
+
+void th1520_kick_secondary_cores(void)
+{
+       int i;
+
+       /*
+        * On coldboot, only HART 0 is brought up by hardware, and resets for
+        * secondary cores are asserted. Set reset address of secondary cores
+        * to the entry of SPL, then deassert the resets to bring them up.
+        */
+       for (i = 1; i < 4; i++) {
+               writel(CONFIG_SPL_TEXT_BASE & 0xffffffff,
+                      TH1520_SYSCFG_CORE_START_L(i));
+               writel(CONFIG_SPL_TEXT_BASE >> 32,
+                      TH1520_SYSCFG_CORE_START_H(i));
+       }
+
+       setbits_le32(TH1520_C910_RST, TH1520_C910_CORE_RST_N(1) |
+                                     TH1520_C910_CORE_RST_N(2) |
+                                     TH1520_C910_CORE_RST_N(3));
+}
 
 void th1520_invalidate_pmp(void)
 {
index 837f0b8d06bb0e3dfa88f814826c0aafa03c97eb..e164e9ab97943f35ce831510fb59aa10305bdba2 100644 (file)
@@ -5,5 +5,6 @@
 
 #ifndef _ASM_TH1520_CPU_H_
 #define _ASM_TH1520_CPU_H_
+void th1520_kick_secondary_cores(void);
 void th1520_invalidate_pmp(void);
 #endif /* _ASM_TH1520_CPU_H_ */