From mboxrd@z Thu Jan 1 00:00:00 1970 From: Juri Lelli Subject: [PATCH v2] cpuidle/cpuidle-big_little: fix reading cpu id part number Date: Thu, 14 Aug 2014 09:27:45 +0100 Message-ID: <1408004865-27525-1-git-send-email-juri.lelli@arm.com> Content-Type: text/plain; charset=WINDOWS-1252 Content-Transfer-Encoding: quoted-printable Return-path: Sender: linux-kernel-owner@vger.kernel.org To: linux@arm.linux.org.uk Cc: Juri Lelli , Lorenzo Pieralisi , Daniel Lezcano , "Rafael J. Wysocki" , Will Deacon , Chao Xie , Stephen Warren , Sebastian Hesselbarth , Rob Herring , Jonathan Austin , Chao Xie Linux , Juri Lelli , linux-pm@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org List-Id: linux-pm@vger.kernel.org Commit af040ffc9ba1 ("ARM: make it easier to check the CPU part number correctly") changed ARM_CPU_PART_X masks, and the way they are returned and checked against. Usage of read_cpuid_part_number() is now deprecated, and calling places updated accordingly. This actually broke cpuidle-big_little initialization, as bl_idle_driver_init() performs a check using an hardcode= d mask on cpu_id. Create an interface to perform the check (that is now even easier to read). Define also a proper mask (ARM_CPU_PART_MASK) that makes this kind of check= s cleaner and helps preventing bugs in the future. Update usage accordingly. Signed-off-by: Juri Lelli Signed-off-by: Lorenzo Pieralisi Cc: Russell King Cc: Daniel Lezcano Cc: "Rafael J. Wysocki" Cc: Will Deacon Cc: Chao Xie Cc: Stephen Warren Cc: Sebastian Hesselbarth Cc: Rob Herring Cc: Jonathan Austin Cc: Chao Xie Linux Cc: Juri Lelli Cc: linux-pm@vger.kernel.org Cc: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org --- arch/arm/include/asm/cputype.h | 3 ++- arch/arm/include/asm/smp_plat.h | 15 +++++++++++++++ drivers/cpuidle/cpuidle-big_little.c | 13 +++---------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/arch/arm/include/asm/cputype.h b/arch/arm/include/asm/cputype.= h index 963a251..819777d 100644 --- a/arch/arm/include/asm/cputype.h +++ b/arch/arm/include/asm/cputype.h @@ -74,6 +74,7 @@ #define ARM_CPU_PART_CORTEX_A12=09=090x4100c0d0 #define ARM_CPU_PART_CORTEX_A17=09=090x4100c0e0 #define ARM_CPU_PART_CORTEX_A15=09=090x4100c0f0 +#define ARM_CPU_PART_MASK=09=090xff00fff0 =20 #define ARM_CPU_XSCALE_ARCH_MASK=090xe000 #define ARM_CPU_XSCALE_ARCH_V1=09=090x2000 @@ -179,7 +180,7 @@ static inline unsigned int __attribute_const__ read_cpu= id_implementor(void) */ static inline unsigned int __attribute_const__ read_cpuid_part(void) { -=09return read_cpuid_id() & 0xff00fff0; +=09return read_cpuid_id() & ARM_CPU_PART_MASK; } =20 static inline unsigned int __attribute_const__ __deprecated read_cpuid_par= t_number(void) diff --git a/arch/arm/include/asm/smp_plat.h b/arch/arm/include/asm/smp_pla= t.h index a252c0b..0ad7d49 100644 --- a/arch/arm/include/asm/smp_plat.h +++ b/arch/arm/include/asm/smp_plat.h @@ -8,6 +8,7 @@ #include #include =20 +#include #include =20 /* @@ -25,6 +26,20 @@ static inline bool is_smp(void) #endif } =20 +/** + * smp_cpuid_part() - return part id for a given cpu + * @cpu:=09logical cpu id. + * + * Return: part id of logical cpu passed as argument. + */ +static inline unsigned int smp_cpuid_part(int cpu) +{ +=09struct cpuinfo_arm *cpu_info =3D &per_cpu(cpu_data, cpu); + +=09return is_smp() ? cpu_info->cpuid & ARM_CPU_PART_MASK : +=09=09=09 read_cpuid_part(); +} + /* all SMP configurations have the extended CPUID registers */ #ifndef CONFIG_MMU #define tlb_ops_need_broadcast()=090 diff --git a/drivers/cpuidle/cpuidle-big_little.c b/drivers/cpuidle/cpuidle= -big_little.c index 344d79fa..ef94c3b 100644 --- a/drivers/cpuidle/cpuidle-big_little.c +++ b/drivers/cpuidle/cpuidle-big_little.c @@ -138,25 +138,18 @@ static int bl_enter_powerdown(struct cpuidle_device *= dev, =09return idx; } =20 -static int __init bl_idle_driver_init(struct cpuidle_driver *drv, int cpu_= id) +static int __init bl_idle_driver_init(struct cpuidle_driver *drv, int part= _id) { -=09struct cpuinfo_arm *cpu_info; =09struct cpumask *cpumask; -=09unsigned long cpuid; =09int cpu; =20 =09cpumask =3D kzalloc(cpumask_size(), GFP_KERNEL); =09if (!cpumask) =09=09return -ENOMEM; =20 -=09for_each_possible_cpu(cpu) { -=09=09cpu_info =3D &per_cpu(cpu_data, cpu); -=09=09cpuid =3D is_smp() ? cpu_info->cpuid : read_cpuid_id(); - -=09=09/* read cpu id part number */ -=09=09if ((cpuid & 0xFFF0) =3D=3D cpu_id) +=09for_each_possible_cpu(cpu) +=09=09if (smp_cpuid_part(cpu) =3D=3D part_id) =09=09=09cpumask_set_cpu(cpu, cpumask); -=09} =20 =09drv->cpumask =3D cpumask; =20 --=20 2.0.4