[U-Boot] [PATCH v3 08/11] ARMv7: PSCI: ls102xa: check target CPU ID before further operations
Hongbo Zhang
macro.wave.z at gmail.com
Thu May 19 09:13:47 CEST 2016
On Wed, May 18, 2016 at 5:23 PM, Chen-Yu Tsai <wens at csie.org> wrote:
> Hi,
>
> On Wed, May 18, 2016 at 5:10 PM, <macro.wave.z at gmail.com> wrote:
>> From: Hongbo Zhang <hongbo.zhang at nxp.com>
>>
>> The input parameter CPU ID needs to be validated before furher oprations such
>> as CPU_ON, this patch introduces the function to do this.
>
> Could you generalize this patch for all platforms?
>
> We already have the PSCI_NR_CPUS macro.
> We could add PSCI_NR_CLUSTERS and PSCI_NR_CPUS_PER_CLUSTER or something?
> This doesn't account for asymmetric cluster designs though...
>
Hi,
Thanks for review.
In this ducoment DDI0406C_C_arm_architecture_reference_manual, referring to:
Table B4-12 Possible implementations of the affinity levels
the MPIDR has more than one implementation formats, I cannot know
which MPIDR format other platform implements, so I cannot make this a
general function for all platforms.
And as you've mentioned, adding those macros doesn't apply for
asymmetric system such as big.LITTLE, so currently introducing such a
common validation function isn't feasible for me now.
In future if more and more platforms introduce their own validation
codes, we could try to find if we can generalize such a common
function for all platforms. But this should happen after this patch
being merged at least..
Hongbo Zhang @ NXP/Freescale
> ChenYu
>
>> Signed-off-by: Wang Dongsheng <dongsheng.wang at nxp.com>
>> Signed-off-by: Hongbo Zhang <hongbo.zhang at nxp.com>
>> ---
>> arch/arm/cpu/armv7/ls102xa/psci.S | 34 +++++++++++++++++++++++++++++++++-
>> 1 file changed, 33 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/cpu/armv7/ls102xa/psci.S b/arch/arm/cpu/armv7/ls102xa/psci.S
>> index 47bcb29..9de812f 100644
>> --- a/arch/arm/cpu/armv7/ls102xa/psci.S
>> +++ b/arch/arm/cpu/armv7/ls102xa/psci.S
>> @@ -25,6 +25,34 @@
>> #define ONE_MS (GENERIC_TIMER_CLK / 1000)
>> #define RESET_WAIT (30 * ONE_MS)
>>
>> +.globl psci_check_target_cpu_id
>> +psci_check_target_cpu_id:
>> + @ Get the real CPU number
>> + and r0, r1, #0xff
>> +
>> + @ Verify bit[31:24], bits must be zero.
>> + tst r1, #0xff000000
>> + bne out_psci_invalid_target_cpu_id
>> +
>> + @ Verify Affinity level 2: Cluster, only one cluster in LS1021xa SoC.
>> + tst r1, #0xff0000
>> + bne out_psci_invalid_target_cpu_id
>> +
>> + @ Verify Affinity level 1: Processors, should be in 0xf00 format.
>> + lsr r1, r1, #8
>> + teq r1, #0xf
>> + bne out_psci_invalid_target_cpu_id
>> +
>> + @ Verify Affinity level 0: CPU, only 0, 1 are valid values.
>> + cmp r0, #2
>> + bge out_psci_invalid_target_cpu_id
>> +
>> + bx lr
>> +
>> +out_psci_invalid_target_cpu_id:
>> + mov r0, #PSCI_RET_INVALID_PARAMS
>> + bx lr
>> +
>> @ r1 = target CPU
>> @ r2 = target PC
>> @ r3 = target Conetxt ID
>> @@ -34,7 +62,10 @@ psci_cpu_on:
>>
>> @ Clear and Get the correct CPU number
>> @ r1 = 0xf01
>> - and r1, r1, #0xff
>> + bl psci_check_target_cpu_id
>> + cmp r0, #PSCI_RET_INVALID_PARAMS
>> + beq out_psci_cpu_on
>> + mov r1, r0
>>
>> bl psci_cpu_on_common
>>
>> @@ -99,6 +130,7 @@ holdoff_release:
>> @ Return
>> mov r0, #PSCI_RET_SUCCESS
>>
>> +out_psci_cpu_on:
>> pop {lr}
>> bx lr
>>
>> --
>> 2.1.4
>>
More information about the U-Boot
mailing list