summary'>refs'>logtree'>commitdiff'>stats
path: '>root//'>sys-kernel/boest-v5.0.15//'>raspberrypi//0094-ARM64-Round-Robin-dispatch-IRQs-between-CPUs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'sys-kernel/boest-v5.0.15/raspberrypi/0094-ARM64-Round-Robin-dispatch-IRQs-between-CPUs.patch')
--rw-r--r--sys-kernel/boest-v5.0.15/raspberrypi/0094-ARM64-Round-Robin-dispatch-IRQs-between-CPUs.patch7676
1 files changed, 76 insertions, 0 deletions
diff --git a/sys-kernel/boest-v5.0.15/raspberrypi/0094-ARM64-Round-Robin-dispatch-IRQs-between-CPUs.patch b/sys-kernel/boest-v5.0.15/raspberrypi/0094-ARM64-Round-Robin-dispatch-IRQs-between-CPUs.patch
new file mode 100644
index 00000000..192e74a8
--- /dev/null
+++ b/sys-kernel/boest-v5.0.15/raspberrypi/0094-ARM64-Round-Robin-dispatch-IRQs-between-CPUs.patch
@@ -0,0 +1,76 @@
+From 6964f5570a6aa59c44d2da2de066a3b35cee20b6 Mon Sep 17 00:00:00 2001
+From: Michael Zoran <mzoran@crowfest.net>
+Date: Sat, 14 Jan 2017 21:43:57 -0800
+Subject: [PATCH 094/194] 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>
+---
+ drivers/irqchip/irq-bcm2835.c | 15 ++++++++++++++-
+ drivers/irqchip/irq-bcm2836.c | 21 +++++++++++++++++++++
+ 2 files changed, 35 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/irqchip/irq-bcm2835.c b/drivers/irqchip/irq-bcm2835.c
+index ff7b998579c1..93878d725f26 100644
+--- a/drivers/irqchip/irq-bcm2835.c
++++ b/drivers/irqchip/irq-bcm2835.c
+@@ -153,10 +153,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,
+diff --git a/drivers/irqchip/irq-bcm2836.c b/drivers/irqchip/irq-bcm2836.c
+index 49642bcd0b75..d8ef8f7fee5b 100644
+--- a/drivers/irqchip/irq-bcm2836.c
++++ b/drivers/irqchip/irq-bcm2836.c
+@@ -86,6 +86,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,