mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-01 10:45:49 +00:00
ARM: zynq: use physical cpuid in zynq_slcr_cpu_stop/start
When kernel booting, it will create a cpuid map between the logical cpus and physical cpus. In a normal boot, the cpuid map is as below: Physical Logical 0 ==> 0 1 ==> 1 But in kdump, there is a condition that the crash happens at the physical cpu1, and the crash kernel will run at the physical cpu1 too, so the cpuid map in crash kernel is as below: Physical Logical 1 ==> 0 0 ==> 1 The functions zynq_slcr_cpu_stop/start is to stop/start the physical cpus, the parameter cpu should be the physical cpuid. So use cpu_logical_map to translate the logical cpuid to physical cpuid. Or else the logical cpu0(physical cpu1) will stop itself and the processor will hang. Signed-off-by: Quanyang Wang <quanyang.wang@windriver.com> Tested-by: Michal Simek <michal.simek@xilinx.com> Signed-off-by: Michal Simek <michal.simek@xilinx.com>
This commit is contained in:
parent
e42617b825
commit
6c6b3f1f26
@ -15,6 +15,7 @@
|
|||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
#include <asm/smp_plat.h>
|
||||||
#include <asm/smp_scu.h>
|
#include <asm/smp_scu.h>
|
||||||
#include <linux/irqchip/arm-gic.h>
|
#include <linux/irqchip/arm-gic.h>
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
@ -30,6 +31,7 @@ int zynq_cpun_start(u32 address, int cpu)
|
|||||||
{
|
{
|
||||||
u32 trampoline_code_size = &zynq_secondary_trampoline_end -
|
u32 trampoline_code_size = &zynq_secondary_trampoline_end -
|
||||||
&zynq_secondary_trampoline;
|
&zynq_secondary_trampoline;
|
||||||
|
u32 phy_cpuid = cpu_logical_map(cpu);
|
||||||
|
|
||||||
/* MS: Expectation that SLCR are directly map and accessible */
|
/* MS: Expectation that SLCR are directly map and accessible */
|
||||||
/* Not possible to jump to non aligned address */
|
/* Not possible to jump to non aligned address */
|
||||||
@ -39,7 +41,7 @@ int zynq_cpun_start(u32 address, int cpu)
|
|||||||
u32 trampoline_size = &zynq_secondary_trampoline_jump -
|
u32 trampoline_size = &zynq_secondary_trampoline_jump -
|
||||||
&zynq_secondary_trampoline;
|
&zynq_secondary_trampoline;
|
||||||
|
|
||||||
zynq_slcr_cpu_stop(cpu);
|
zynq_slcr_cpu_stop(phy_cpuid);
|
||||||
if (address) {
|
if (address) {
|
||||||
if (__pa(PAGE_OFFSET)) {
|
if (__pa(PAGE_OFFSET)) {
|
||||||
zero = ioremap(0, trampoline_code_size);
|
zero = ioremap(0, trampoline_code_size);
|
||||||
@ -68,7 +70,7 @@ int zynq_cpun_start(u32 address, int cpu)
|
|||||||
if (__pa(PAGE_OFFSET))
|
if (__pa(PAGE_OFFSET))
|
||||||
iounmap(zero);
|
iounmap(zero);
|
||||||
}
|
}
|
||||||
zynq_slcr_cpu_start(cpu);
|
zynq_slcr_cpu_start(phy_cpuid);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user