diff options
Diffstat (limited to 'drivers/irqchip/irq-gic-v3.c')
| -rw-r--r-- | drivers/irqchip/irq-gic-v3.c | 16 | 
1 files changed, 13 insertions, 3 deletions
| diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c index dbffb7ab6203..984c3ecfd22c 100644 --- a/drivers/irqchip/irq-gic-v3.c +++ b/drivers/irqchip/irq-gic-v3.c @@ -353,6 +353,8 @@ static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs  			if (static_key_true(&supports_deactivate))  				gic_write_eoir(irqnr); +			else +				isb();  			err = handle_domain_irq(gic_data.domain, irqnr, regs);  			if (err) { @@ -640,11 +642,16 @@ static void gic_smp_init(void)  static int gic_set_affinity(struct irq_data *d, const struct cpumask *mask_val,  			    bool force)  { -	unsigned int cpu = cpumask_any_and(mask_val, cpu_online_mask); +	unsigned int cpu;  	void __iomem *reg;  	int enabled;  	u64 val; +	if (force) +		cpu = cpumask_first(mask_val); +	else +		cpu = cpumask_any_and(mask_val, cpu_online_mask); +  	if (cpu >= nr_cpu_ids)  		return -EINVAL; @@ -831,8 +838,11 @@ static int gic_irq_domain_alloc(struct irq_domain *domain, unsigned int virq,  	if (ret)  		return ret; -	for (i = 0; i < nr_irqs; i++) -		gic_irq_domain_map(domain, virq + i, hwirq + i); +	for (i = 0; i < nr_irqs; i++) { +		ret = gic_irq_domain_map(domain, virq + i, hwirq + i); +		if (ret) +			return ret; +	}  	return 0;  } |