| From 0ff6ee62ebe17adfa97c1847cc1d7aea76b49d55 Mon Sep 17 00:00:00 2001 |
| From: Will Deacon <will.deacon@arm.com> |
| Date: Tue, 23 Aug 2011 22:20:03 +0100 |
| Subject: ARM: 7061/1: gic: convert logical CPU numbers into physical numbers |
| |
| The GIC driver must convert logical CPU numbers passed in from Linux |
| into physical CPU numbers that are understood by the hardware. |
| |
| This patch uses the new cpu_logical_map macro for performing the |
| conversion inside the GIC driver. |
| |
| Signed-off-by: Will Deacon <will.deacon@arm.com> |
| Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> |
| (cherry picked from commit 267840f3397fd9f6a2bdde14de38b9d29d525d7b) |
| |
| Signed-off-by: Simon Horman <horms@verge.net.au> |
| --- |
| arch/arm/common/gic.c | 17 ++++++++++++++--- |
| 1 file changed, 14 insertions(+), 3 deletions(-) |
| |
| diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c |
| index 734db99..8b5be72 100644 |
| --- a/arch/arm/common/gic.c |
| +++ b/arch/arm/common/gic.c |
| @@ -181,7 +181,7 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val, |
| return -EINVAL; |
| |
| mask = 0xff << shift; |
| - bit = 1 << (cpu + shift); |
| + bit = 1 << (cpu_logical_map(cpu) + shift); |
| |
| spin_lock(&irq_controller_lock); |
| val = readl_relaxed(reg) & ~mask; |
| @@ -260,9 +260,15 @@ static void __init gic_dist_init(struct gic_chip_data *gic, |
| unsigned int irq_start) |
| { |
| unsigned int gic_irqs, irq_limit, i; |
| + u32 cpumask; |
| void __iomem *base = gic->dist_base; |
| - u32 cpumask = 1 << smp_processor_id(); |
| + u32 cpu = 0; |
| |
| +#ifdef CONFIG_SMP |
| + cpu = cpu_logical_map(smp_processor_id()); |
| +#endif |
| + |
| + cpumask = 1 << cpu; |
| cpumask |= cpumask << 8; |
| cpumask |= cpumask << 16; |
| |
| @@ -570,7 +576,12 @@ void __cpuinit gic_enable_ppi(unsigned int irq) |
| #ifdef CONFIG_SMP |
| void gic_raise_softirq(const struct cpumask *mask, unsigned int irq) |
| { |
| - unsigned long map = *cpus_addr(*mask); |
| + int cpu; |
| + unsigned long map = 0; |
| + |
| + /* Convert our logical CPU mask into a physical one. */ |
| + for_each_cpu(cpu, mask) |
| + map |= 1 << cpu_logical_map(cpu); |
| |
| /* |
| * Ensure that stores to Normal memory are visible to the |
| -- |
| 1.7.10.2.565.gbd578b5 |
| |