diff options
Diffstat (limited to 'arch/arm/common/gic.c')
-rw-r--r-- | arch/arm/common/gic.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c index 60e6175dc11d..05cd423c5750 100644 --- a/arch/arm/common/gic.c +++ b/arch/arm/common/gic.c @@ -176,6 +176,9 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val, unsigned int shift = (d->irq % 4) * 8; unsigned int cpu = cpumask_any_and(mask_val, cpu_online_mask); u32 val, mask, bit; +#ifdef CONFIG_GIC_SET_MULTIPLE_CPUS + struct irq_desc *desc = irq_to_desc(d->irq); +#endif if (cpu >= 8 || cpu >= nr_cpu_ids) return -EINVAL; @@ -185,7 +188,15 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val, spin_lock(&irq_controller_lock); val = readl_relaxed(reg) & ~mask; - writel_relaxed(val | bit, reg); + val |= bit; +#ifdef CONFIG_GIC_SET_MULTIPLE_CPUS + if (desc && desc->affinity_hint) { + struct cpumask mask_hint; + if (cpumask_and(&mask_hint, desc->affinity_hint, mask_val)) + val |= (*cpumask_bits(&mask_hint) << shift) & mask; + } +#endif + writel_relaxed(val, reg); spin_unlock(&irq_controller_lock); return IRQ_SET_MASK_OK; |