[U-Boot] [PATCH v5 6/8] ARMv7: PSCI: ls102xa: check ALREADY_ON or ON_PENDING for CPU_ON
Hongbo Zhang
macro.wave.z at gmail.com
Thu Jun 30 06:24:15 CEST 2016
On Tue, Jun 28, 2016 at 12:30 PM, Chen-Yu Tsai <wens at csie.org> wrote:
> On Tue, Jun 14, 2016 at 3:01 PM, <macro.wave.z at gmail.com> wrote:
>> From: Hongbo Zhang <hongbo.zhang at 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 at 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
>>
More information about the U-Boot
mailing list