ARM: logical_cpu_map: decouple CPU mapping from SMP
Subsystems (8)
PATCH 1/2 ARM: logical_cpu_map: decouple CPU mapping from SMP
It turns out that the logical CPU mapping is useful even when !CONFIG_SMP for manipulation of devices like interrupt and power controllers when running a UP kernel on a CPU other than 0. This can happen when kexecing a UP image from an SMP kernel.
In the future, multi-cluster systems running AMP configurations will require something similar for mapping cluster IDs, so it makes sense to decouple this logic in preparation for this support.
--- arch/arm/common/gic.c | 7 ++----- arch/arm/include/asm/smp.h | 6 ------ arch/arm/include/asm/smp_plat.h | 6 ++++++ arch/arm/kernel/setup.c | 14 ++++++++++++++ arch/arm/kernel/smp.c | 14 -------------- arch/arm/mach-exynos/hotplug.c | 1 + arch/arm/mach-exynos/platsmp.c | 1 + arch/arm/mach-highbank/highbank.c | 3 +-- arch/arm/mach-imx/src.c | 5 +---- arch/arm/mach-msm/hotplug.c | 1 + arch/arm/mach-msm/platsmp.c | 1 + arch/arm/mach-realview/hotplug.c | 1 + arch/arm/mach-shmobile/smp-sh73a0.c | 1 + arch/arm/mach-ux500/hotplug.c | 1 + arch/arm/mach-ux500/platsmp.c | 1 + arch/arm/mach-vexpress/hotplug.c | 1 + arch/arm/plat-versatile/platsmp.c | 1 + 17 files changed, 34 insertions(+), 31 deletions(-)
arch/arm/common/gic.c +2 -5
@@ -41,6 +41,7 @@#include <asm/irq.h> #include <asm/exception.h> +#include <asm/smp_plat.h> #include <asm/mach/irq.h> #include <asm/hardware/gic.h>
@@ -352,11 +353,7 @@ static void __init gic_dist_init(struct gic_chip_data *gic)unsigned int gic_irqs = gic->gic_irqs;struct irq_domain *domain = &gic->domain;void __iomem *base =gic_data_dist_base (gic); -u32 cpu =0 ; - -#ifdef CONFIG_SMP - cpu =cpu_logical_map (smp_processor_id ()); -#endif +u32 cpu =cpu_logical_map (smp_processor_id ()); cpumask =1 << cpu; cpumask |= cpumask <<8 ;
arch/arm/include/asm/smp.h +0 -6
@@ -71,12 +71,6 @@ extern void platform_secondary_init(unsigned int cpu);extern void platform_smp_prepare_cpus (unsigned int );/* -* Logical CPU mapping. -*/ -extern int __cpu_logical_map[NR_CPUS ]; -#define cpu_logical_map (cpu) __cpu_logical_map[cpu] - -/* * Initial data for bringing up a secondary CPU. */ struct secondary_data {
arch/arm/include/asm/smp_plat.h +6 -0
@@ -43,4 +43,10 @@ static inline int cache_ops_need_broadcast(void) }#endif +/* +* Logical CPU mapping. +*/ +extern int __cpu_logical_map[]; +#define cpu_logical_map (cpu) __cpu_logical_map[cpu] +#endif
arch/arm/kernel/setup.c +14 -0
@@ -427,6 +427,20 @@ void cpu_init(void) : "r14"); } +int __cpu_logical_map[NR_CPUS ]; + +void __init smp_setup_processor_id (void ) +{ +int i; +u32 cpu =is_smp () ?read_cpuid_mpidr () &0xff :0 ; + +cpu_logical_map (0 ) = cpu; +for (i =1 ; i <NR_CPUS ; ++i) +cpu_logical_map (i) = i == cpu ?0 : i; + +printk (KERN_INFO "Booting Linux on physical CPU %d\n" , cpu); +} +static void __init setup_processor (void ) {struct proc_info_list *list;
arch/arm/kernel/smp.c +0 -14
@@ -233,20 +233,6 @@ void __ref cpu_die(void) }#endif /* CONFIG_HOTPLUG_CPU */ -int __cpu_logical_map[NR_CPUS ]; - -void __init smp_setup_processor_id (void ) -{ -int i; -u32 cpu =is_smp () ?read_cpuid_mpidr () &0xff :0 ; - -cpu_logical_map (0 ) = cpu; -for (i =1 ; i <NR_CPUS ; ++i) -cpu_logical_map (i) = i == cpu ?0 : i; - -printk (KERN_INFO "Booting Linux on physical CPU %d\n" , cpu); -} -/* * Called by both boot and secondaries to move global data into * per-processor storage.
arch/arm/mach-exynos/hotplug.c +1 -0
@@ -16,6 +16,7 @@#include <linux/io.h> #include <asm/cacheflush.h> +#include <asm/smp_plat.h> #include <mach/regs-pmu.h>
arch/arm/mach-exynos/platsmp.c +1 -0
@@ -23,6 +23,7 @@#include <asm/cacheflush.h> #include <asm/hardware/gic.h> +#include <asm/smp_plat.h> #include <asm/smp_scu.h> #include <asm/unified.h>
arch/arm/mach-highbank/highbank.c +1 -2
@@ -26,6 +26,7 @@#include <asm/cacheflush.h> #include <asm/unified.h> +#include <asm/smp_plat.h> #include <asm/smp_scu.h> #include <asm/hardware/arm_timer.h> #include <asm/hardware/timer-sp.h>
@@ -73,9 +74,7 @@ static void __init highbank_map_io(void)void highbank_set_cpu_jump (int cpu,void *jump_addr) { -#ifdef CONFIG_SMP cpu =cpu_logical_map (cpu); -#endif writel (BSYM (virt_to_phys (jump_addr)),HB_JUMP_TABLE_VIRT (cpu));__cpuc_flush_dcache_area (HB_JUMP_TABLE_VIRT (cpu),16 ); outer_clean_range(HB_JUMP_TABLE_PHYS(cpu),
arch/arm/mach-imx/src.c +1 -4
@@ -15,6 +15,7 @@#include <linux/of.h> #include <linux/of_address.h> #include <linux/smp.h> +#include <asm/smp_plat.h> #include <asm/unified.h> #define SRC_SCR 0x000
@@ -25,10 +26,6 @@static void __iomem *src_base; -#ifndef CONFIG_SMP -#define cpu_logical_map (cpu) 0 -#endif -void imx_enable_cpu (int cpu,bool enable) {u32 mask, val;
arch/arm/mach-msm/hotplug.c +1 -0
@@ -11,6 +11,7 @@#include <linux/smp.h> #include <asm/cacheflush.h> +#include <asm/smp_plat.h> extern volatile int pen_release;
arch/arm/mach-msm/platsmp.c +1 -0
@@ -20,6 +20,7 @@#include <asm/cacheflush.h> #include <asm/cputype.h> #include <asm/mach-types.h> +#include <asm/smp_plat.h> #include <mach/msm_iomap.h>
arch/arm/mach-realview/hotplug.c +1 -0
@@ -13,6 +13,7 @@#include <linux/smp.h> #include <asm/cacheflush.h> +#include <asm/smp_plat.h> extern volatile int pen_release;
arch/arm/mach-shmobile/smp-sh73a0.c +1 -0
@@ -23,6 +23,7 @@#include <linux/spinlock.h> #include <linux/io.h> #include <mach/common.h> +#include <asm/smp_plat.h> #include <asm/smp_scu.h> #include <asm/smp_twd.h> #include <asm/hardware/gic.h>
arch/arm/mach-ux500/hotplug.c +1 -0
@@ -13,6 +13,7 @@#include <linux/smp.h> #include <asm/cacheflush.h> +#include <asm/smp_plat.h> extern volatile int pen_release;
arch/arm/mach-ux500/platsmp.c +1 -0
@@ -19,6 +19,7 @@#include <asm/cacheflush.h> #include <asm/hardware/gic.h> +#include <asm/smp_plat.h> #include <asm/smp_scu.h> #include <mach/hardware.h> #include <mach/setup.h>
arch/arm/mach-vexpress/hotplug.c +1 -0
@@ -13,6 +13,7 @@#include <linux/smp.h> #include <asm/cacheflush.h> +#include <asm/smp_plat.h> #include <asm/system.h> extern volatile int pen_release;
arch/arm/plat-versatile/platsmp.c +1 -0
@@ -16,6 +16,7 @@#include <linux/smp.h> #include <asm/cacheflush.h> +#include <asm/smp_plat.h> #include <asm/hardware/gic.h> /*
Signature · 1 line
1.7.4.1
PATCH 2/2 ARM: SCU: use cpu_logical_map for per-CPU low power mode
scu_power_mode changes the power mode for the current CPU, which it determines from smp_processor_id(). However, this assumes that the physical CPU number is equal to Linux's logical CPU number and if this is not true, we will power off the wrong CPU.
This patch uses cpu_logical_map to translate the logical CPU number into a physical one in scu_power_mode.
--- arch/arm/kernel/smp_scu.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-)
arch/arm/kernel/smp_scu.c +2 -1
@@ -11,6 +11,7 @@#include <linux/init.h> #include <linux/io.h> +#include <asm/smp_plat.h> #include <asm/smp_scu.h> #include <asm/cacheflush.h> #include <asm/cputype.h>
@@ -74,7 +75,7 @@ void scu_enable(void __iomem *scu_base)int scu_power_mode (void __iomem *scu_base,unsigned int mode) {unsigned int val; -int cpu =smp_processor_id (); +int cpu =cpu_logical_map (smp_processor_id ());if (mode >3 || mode ==1 || cpu >3 )return -EINVAL ;
Signature · 1 line
1.7.4.1
PATCH 1/2 ARM: logical_cpu_map: decouple CPU mapping from SMP
In reply to Will DeaconQuoted 24 lines · Will Deacon
It turns out that the logical CPU mapping is useful even when !CONFIG_SMP for manipulation of devices like interrupt and power controllers when running a UP kernel on a CPU other than 0. This can happen when kexecing a UP image from an SMP kernel.
In the future, multi-cluster systems running AMP configurations will require something similar for mapping cluster IDs, so it makes sense to decouple this logic in preparation for this support.
Cc Marc Zyngier <[email protected]>Cc Yang Bai <[email protected]>Reported-by Joerg Roedel <[email protected]>Signed-off-by Will Deacon <[email protected]>--- arch/arm/common/gic.c | 7 ++----- arch/arm/include/asm/smp.h | 6 ------ arch/arm/include/asm/smp_plat.h | 6 ++++++ arch/arm/kernel/setup.c | 14 ++++++++++++++ arch/arm/kernel/smp.c | 14 -------------- arch/arm/mach-exynos/hotplug.c | 1 + arch/arm/mach-exynos/platsmp.c | 1 + arch/arm/mach-highbank/highbank.c | 3 +-- arch/arm/mach-imx/src.c | 5 +---- arch/arm/mach-msm/hotplug.c | 1 +
Quoted 8 lines
arch/arm/mach-msm/platsmp.c | 1 + arch/arm/mach-realview/hotplug.c | 1 + arch/arm/mach-shmobile/smp-sh73a0.c | 1 + arch/arm/mach-ux500/hotplug.c | 1 + arch/arm/mach-ux500/platsmp.c | 1 + arch/arm/mach-vexpress/hotplug.c | 1 + arch/arm/plat-versatile/platsmp.c | 1 + 17 files changed, 34 insertions(+), 31 deletions(-)
You may want to also add a #include <asm/smp_plat.h> to arch/arm/mach-shmobile/smp-r8a7779.c (a newcomer in Linus' tree).
Otherwise:
M.
Signature · 1 line
Jazz is not dead. It just smells funny...
PATCH 1/2 ARM: logical_cpu_map: decouple CPU mapping from SMP
Quoted 34 lines · Marc Zyngier
Quoted 24 lines · Will Deacon
It turns out that the logical CPU mapping is useful even when !CONFIG_SMP for manipulation of devices like interrupt and power controllers when running a UP kernel on a CPU other than 0. This can happen when kexecing a UP image from an SMP kernel.
In the future, multi-cluster systems running AMP configurations will require something similar for mapping cluster IDs, so it makes sense to decouple this logic in preparation for this support.
Cc Marc Zyngier <[email protected]>Cc Yang Bai <[email protected]>Reported-by Joerg Roedel <[email protected]>Signed-off-by Will Deacon <[email protected]>--- arch/arm/common/gic.c | 7 ++----- arch/arm/include/asm/smp.h | 6 ------ arch/arm/include/asm/smp_plat.h | 6 ++++++ arch/arm/kernel/setup.c | 14 ++++++++++++++ arch/arm/kernel/smp.c | 14 -------------- arch/arm/mach-exynos/hotplug.c | 1 + arch/arm/mach-exynos/platsmp.c | 1 + arch/arm/mach-highbank/highbank.c | 3 +-- arch/arm/mach-imx/src.c | 5 +---- arch/arm/mach-msm/hotplug.c | 1 +Quoted 8 lines
arch/arm/mach-msm/platsmp.c | 1 + arch/arm/mach-realview/hotplug.c | 1 + arch/arm/mach-shmobile/smp-sh73a0.c | 1 + arch/arm/mach-ux500/hotplug.c | 1 + arch/arm/mach-ux500/platsmp.c | 1 + arch/arm/mach-vexpress/hotplug.c | 1 + arch/arm/plat-versatile/platsmp.c | 1 + 17 files changed, 34 insertions(+), 31 deletions(-)
Quoted 2 lines
You may want to also add a #include <
asm/smp_plat.h> toarch/arm/mach-shmobile/smp-r8a7779.c(a newcomer in Linus' tree).
Cheers Marc, I didn't spot this guy. I'll add that for v2.
Quoted 2 lines
Otherwise:
Acked-by Marc Zyngier <[email protected]>
Thanks,
Will
PATCH 1/2 ARM: logical_cpu_map: decouple CPU mapping from SMP
Quoted 7 lines · Will Deacon
On Mon, Jan 16, 2012 at 04:10:03PM +0000, Marc Zyngier wrote:
Cheers Marc, I didn't spot this guy. I'll add that for v2.
Thanks,
Will
Signature · 9 lines
? ? """ ? ? Keep It Simple,Stupid. ? ? """ Chinese Name: ?? Nick Name: Hamo Homepage: http://hamobai.com/ GPG KEY ID: 0xA4691A33 Key fingerprint = 09D5 2D78 8E2B 0995 CF8E? 4331 33C4 3D24 A469 1A33