ARM64: Round-Robin dispatch IRQs between CPUs.

IRQ-CPU mapping is round robined on ARM64 to increase
concurrency and allow multiple interrupts to be serviced
at a time.  This reduces the need for FIQ.

Signed-off-by: Michael Zoran <mzoran@crowfest.net>
This commit is contained in:
Michael Zoran
2017-01-14 21:43:57 -08:00
committed by popcornmix
parent 26ade7747b
commit ddd21c18d8
2 changed files with 35 additions and 1 deletions

View File

@@ -168,10 +168,23 @@ static void armctrl_unmask_irq(struct irq_data *d)
}
}
#ifdef CONFIG_ARM64
void bcm2836_arm_irqchip_spin_gpu_irq(void);
static void armctrl_ack_irq(struct irq_data *d)
{
bcm2836_arm_irqchip_spin_gpu_irq();
}
#endif
static struct irq_chip armctrl_chip = {
.name = "ARMCTRL-level",
.irq_mask = armctrl_mask_irq,
.irq_unmask = armctrl_unmask_irq
.irq_unmask = armctrl_unmask_irq,
#ifdef CONFIG_ARM64
.irq_ack = armctrl_ack_irq
#endif
};
static int armctrl_xlate(struct irq_domain *d, struct device_node *ctrlr,

View File

@@ -145,6 +145,27 @@ static void bcm2836_arm_irqchip_unmask_gpu_irq(struct irq_data *d)
{
}
#ifdef CONFIG_ARM64
void bcm2836_arm_irqchip_spin_gpu_irq(void)
{
u32 i;
void __iomem *gpurouting = (intc.base + LOCAL_GPU_ROUTING);
u32 routing_val = readl(gpurouting);
for (i = 1; i <= 3; i++) {
u32 new_routing_val = (routing_val + i) & 3;
if (cpu_active(new_routing_val)) {
writel(new_routing_val, gpurouting);
return;
}
}
}
EXPORT_SYMBOL(bcm2836_arm_irqchip_spin_gpu_irq);
#endif
static struct irq_chip bcm2836_arm_irqchip_gpu = {
.name = "bcm2836-gpu",
.irq_mask = bcm2836_arm_irqchip_mask_gpu_irq,