[U-Boot] [PATCH v5 6/8] ARMv7: PSCI: ls102xa: check ALREADY_ON or ON_PENDING for CPU_ON

Chen-Yu Tsai wens at csie.org
Thu Jun 30 16:47:35 CEST 2016


On Thu, Jun 30, 2016 at 12:24 PM, Hongbo Zhang <macro.wave.z at gmail.com> wrote:
> 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.

I agree it should be as late as possible. I'm just not sure about
the cache and AMP/SMP settings. Best to have someone more familiar
with this comment on it.

ChenYu

>> 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