[PATCH 3/3] ARM: kernel: fix __cpu_logical_map default initialization
Will Deacon
will.deacon at arm.com
Fri May 17 01:50:38 EST 2013
On Thu, May 16, 2013 at 04:34:07PM +0100, Lorenzo Pieralisi wrote:
> For legacy reasons, the __cpu_logical_map array is initialized to 0.
> On old pre-DT ARM platforms, smp_setup_processor_id() generates
> __cpu_logical_map entries at boot before the number of possible CPUs is
> set-up, with values that can be considered valid MPIDRs even if they are
> not present in the system booting; this implies that the __cpu_logical_map[]
> might end up containing MPIDR values that can be considered valid at logical
> indexes corresponding to CPUs that are not marked as possible.
>
> To prevent issues with the current implementation, this patch defines an
> MPIDR_INVALID value, statically initializes the __cpu_logical_map[] array to it
> and allows DT parsing code to overwrite values in the __cpu_logical_map array
> that were erroneously set-up in smp_setup_processor_id().
What issues have you actually hit with this?
> Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi at arm.com>
> CC: Will Deacon <will.deacon at arm.com>
> ---
> arch/arm/include/asm/cputype.h | 2 ++
> arch/arm/include/asm/smp_plat.h | 2 +-
> arch/arm/kernel/devtree.c | 10 ++++++----
> arch/arm/kernel/setup.c | 2 +-
> 4 files changed, 10 insertions(+), 6 deletions(-)
>
> diff --git a/arch/arm/include/asm/cputype.h b/arch/arm/include/asm/cputype.h
> index 7652712..dba62cb 100644
> --- a/arch/arm/include/asm/cputype.h
> +++ b/arch/arm/include/asm/cputype.h
> @@ -32,6 +32,8 @@
>
> #define MPIDR_HWID_BITMASK 0xFFFFFF
>
> +#define MPIDR_INVALID (~MPIDR_HWID_BITMASK)
> +
> #define MPIDR_LEVEL_BITS 8
> #define MPIDR_LEVEL_MASK ((1 << MPIDR_LEVEL_BITS) - 1)
>
> diff --git a/arch/arm/include/asm/smp_plat.h b/arch/arm/include/asm/smp_plat.h
> index aaa61b6..e789832 100644
> --- a/arch/arm/include/asm/smp_plat.h
> +++ b/arch/arm/include/asm/smp_plat.h
> @@ -49,7 +49,7 @@ static inline int cache_ops_need_broadcast(void)
> /*
> * Logical CPU mapping.
> */
> -extern int __cpu_logical_map[];
> +extern u32 __cpu_logical_map[];
> #define cpu_logical_map(cpu) __cpu_logical_map[cpu]
> /*
> * Retrieve logical cpu index corresponding to a given MPIDR[23:0]
> diff --git a/arch/arm/kernel/devtree.c b/arch/arm/kernel/devtree.c
> index d2293c0..08f012e 100644
> --- a/arch/arm/kernel/devtree.c
> +++ b/arch/arm/kernel/devtree.c
> @@ -79,12 +79,12 @@ void __init arm_dt_init_cpu_maps(void)
> * read as 0.
> */
> static u32 tmp_map[NR_CPUS] __initdata = {
> - [0 ... NR_CPUS-1] = UINT_MAX };
> + [0 ... NR_CPUS-1] = MPIDR_INVALID };
> struct device_node *cpu, *cpus;
> u32 i, j, cpuidx = 1;
> u32 mpidr = is_smp() ? read_cpuid_mpidr() & MPIDR_HWID_BITMASK : 0;
> -
> bool bootcpu_valid = false;
> +
Random whitespace change.
Will
More information about the devicetree-discuss
mailing list