
On Tue, Jun 28, 2016 at 12:30 PM, Chen-Yu Tsai wens@csie.org wrote:
On Tue, Jun 14, 2016 at 3:01 PM, macro.wave.z@gmail.com wrote:
From: Hongbo Zhang hongbo.zhang@nxp.com
For the robustness of codes, while powering on a CPU, it is better to check if the target CPU is already on or in the process of power on, if yes the power on routine shouldn't be executed further and should return with the corresponding status immediately.
Signed-off-by: Hongbo Zhang hongbo.zhang@nxp.com
arch/arm/cpu/armv7/ls102xa/psci.S | 29 +++++++++++++++++++++++++++++ arch/arm/include/asm/psci.h | 5 +++++ 2 files changed, 34 insertions(+)
diff --git a/arch/arm/cpu/armv7/ls102xa/psci.S b/arch/arm/cpu/armv7/ls102xa/psci.S index a4482e4..0188ade 100644 --- a/arch/arm/cpu/armv7/ls102xa/psci.S +++ b/arch/arm/cpu/armv7/ls102xa/psci.S @@ -66,6 +66,22 @@ psci_cpu_on: beq out_psci_cpu_on mov r1, r0
bl psci_get_cpu_stack_top
sub r0, r0, #PSCI_CPU_STATUS_OFFSET
ldr r5, [r0]
cmp r5, #PSCI_CPU_STATUS_ON
moveq r0, #ARM_PSCI_RET_ALREADY_ON
beq out_psci_cpu_on
cmp r5, #PSCI_CPU_STATUS_ON_PENDING
moveq r0, #ARM_PSCI_RET_ON_PENDING
beq out_psci_cpu_on
mov r5, #PSCI_CPU_STATUS_ON_PENDING
str r5, [r0]
dsb
bl psci_cpu_on_common @ Get DCFG base address
@@ -123,6 +139,12 @@ holdoff_release: rev r6, r6 str r6, [r4, #DCFG_CCSR_SCRATCHRW1]
mov r0, r1
bl psci_get_cpu_stack_top
sub r0, r0, #PSCI_CPU_STATUS_OFFSET
mov r5, #PSCI_CPU_STATUS_ON
str r5, [r0]
isb dsb
@@ -137,6 +159,13 @@ out_psci_cpu_on: psci_cpu_off: bl psci_cpu_off_common
bl psci_get_cpu_id
bl psci_get_cpu_stack_top
sub r0, r0, #PSCI_CPU_STATUS_OFFSET
mov r5, #PSCI_CPU_STATUS_OFF
str r5, [r0]
dsb
psci_cpu_off_common flushes and disables caches, and turns off SMP. So the code you're adding might not work as expected? ARM folks might know more.
Moving this code ahead of psci_cpu_off_common seems better? I just though such a code should be placed as later as it can.
The rest looks good, though I expect them to be pulled out into common helpers and rewritten in C. :)
Regards ChenYu
1: wfi b 1b
diff --git a/arch/arm/include/asm/psci.h b/arch/arm/include/asm/psci.h index bedcd30..89a1ba5 100644 --- a/arch/arm/include/asm/psci.h +++ b/arch/arm/include/asm/psci.h @@ -67,6 +67,11 @@ #define PSCI_PERCPU_STACK_SIZE 0x400 #define PSCI_TARGET_PC_OFFSET (PSCI_PERCPU_STACK_SIZE - 4) #define PSCI_CONTEXT_ID_OFFSET (PSCI_PERCPU_STACK_SIZE - 8) +#define PSCI_CPU_STATUS_OFFSET (PSCI_PERCPU_STACK_SIZE - 12)
+#define PSCI_CPU_STATUS_OFF 0 +#define PSCI_CPU_STATUS_ON 1 +#define PSCI_CPU_STATUS_ON_PENDING 2
#ifndef __ASSEMBLY__ int psci_update_dt(void *fdt); -- 2.1.4