| From 778c82a20055e4da5f0e31092d6f5d6facc98126 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 3 Jul 2025 17:04:53 +0300 |
| Subject: ARM: rockchip: fix kernel hang during smp initialization |
| |
| From: Alexander Kochetkov <al.kochet@gmail.com> |
| |
| [ Upstream commit 7cdb433bb44cdc87dc5260cdf15bf03cc1cd1814 ] |
| |
| In order to bring up secondary CPUs main CPU write trampoline |
| code to SRAM. The trampoline code is written while secondary |
| CPUs are powered on (at least that true for RK3188 CPU). |
| Sometimes that leads to kernel hang. Probably because secondary |
| CPU execute trampoline code while kernel doesn't expect. |
| |
| The patch moves SRAM initialization step to the point where all |
| secondary CPUs are powered down. |
| |
| That fixes rarely hangs on RK3188: |
| [ 0.091568] CPU0: thread -1, cpu 0, socket 0, mpidr 80000000 |
| [ 0.091996] rockchip_smp_prepare_cpus: ncores 4 |
| |
| Signed-off-by: Alexander Kochetkov <al.kochet@gmail.com> |
| Link: https://lore.kernel.org/r/20250703140453.1273027-1-al.kochet@gmail.com |
| Signed-off-by: Heiko Stuebner <heiko@sntech.de> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| arch/arm/mach-rockchip/platsmp.c | 15 +++++++++------ |
| 1 file changed, 9 insertions(+), 6 deletions(-) |
| |
| diff --git a/arch/arm/mach-rockchip/platsmp.c b/arch/arm/mach-rockchip/platsmp.c |
| index 36915a073c23..f432d22bfed8 100644 |
| --- a/arch/arm/mach-rockchip/platsmp.c |
| +++ b/arch/arm/mach-rockchip/platsmp.c |
| @@ -279,11 +279,6 @@ static void __init rockchip_smp_prepare_cpus(unsigned int max_cpus) |
| } |
| |
| if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) { |
| - if (rockchip_smp_prepare_sram(node)) { |
| - of_node_put(node); |
| - return; |
| - } |
| - |
| /* enable the SCU power domain */ |
| pmu_set_power_domain(PMU_PWRDN_SCU, true); |
| |
| @@ -316,11 +311,19 @@ static void __init rockchip_smp_prepare_cpus(unsigned int max_cpus) |
| asm ("mrc p15, 1, %0, c9, c0, 2\n" : "=r" (l2ctlr)); |
| ncores = ((l2ctlr >> 24) & 0x3) + 1; |
| } |
| - of_node_put(node); |
| |
| /* Make sure that all cores except the first are really off */ |
| for (i = 1; i < ncores; i++) |
| pmu_set_power_domain(0 + i, false); |
| + |
| + if (read_cpuid_part() == ARM_CPU_PART_CORTEX_A9) { |
| + if (rockchip_smp_prepare_sram(node)) { |
| + of_node_put(node); |
| + return; |
| + } |
| + } |
| + |
| + of_node_put(node); |
| } |
| |
| static void __init rk3036_smp_prepare_cpus(unsigned int max_cpus) |
| -- |
| 2.39.5 |
| |