All of lore.kernel.org
 help / color / mirror / Atom feed
From: marc.zyngier@arm.com (Marc Zyngier)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 03/16] ARM: GIC: Add global gic_handle_irq() function
Date: Mon, 26 Sep 2011 12:02:22 +0100	[thread overview]
Message-ID: <1317034955-1029-4-git-send-email-marc.zyngier@arm.com> (raw)
In-Reply-To: <1317034955-1029-1-git-send-email-marc.zyngier@arm.com>

Provide the GIC code with a low level handler that can be used
by platforms using CONFIG_MULTI_IRQ_HANDLER. Though the handler is
written in C, the compiled code doesn't feel much slower than its
assembly counterpart (at least with my gcc 4.4.1).

Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
---
 arch/arm/common/gic.c               |   23 +++++++++++++++++++++++
 arch/arm/include/asm/hardware/gic.h |    1 +
 2 files changed, 24 insertions(+), 0 deletions(-)

diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c
index a3f335c..5a22896 100644
--- a/arch/arm/common/gic.c
+++ b/arch/arm/common/gic.c
@@ -209,6 +209,29 @@ static int gic_set_wake(struct irq_data *d, unsigned int on)
 #define gic_set_wake	NULL
 #endif
 
+asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
+{
+	u32 irqstat, irqnr;
+
+	do {
+		irqstat = readl_relaxed(gic_cpu_base_addr + GIC_CPU_INTACK);
+		irqnr = irqstat & ~0x1c00;
+
+		if (likely(irqnr > 15 && irqnr < 1021)) {
+			handle_IRQ(irqnr, regs);
+			continue;
+		}
+		if (irqnr < 16) {
+			writel_relaxed(irqstat, gic_cpu_base_addr + GIC_CPU_EOI);
+#ifdef CONFIG_SMP
+			handle_IPI(irqnr, regs);
+#endif
+			continue;
+		}
+		break;
+	} while (1);
+}
+
 static void gic_handle_cascade_irq(unsigned int irq, struct irq_desc *desc)
 {
 	struct gic_chip_data *chip_data = irq_get_handler_data(irq);
diff --git a/arch/arm/include/asm/hardware/gic.h b/arch/arm/include/asm/hardware/gic.h
index 2dadd50..45e4ab4 100644
--- a/arch/arm/include/asm/hardware/gic.h
+++ b/arch/arm/include/asm/hardware/gic.h
@@ -38,6 +38,7 @@ extern struct irq_chip gic_arch_extn;
 
 void gic_init(unsigned int, unsigned int, void __iomem *, void __iomem *);
 void gic_secondary_init(unsigned int);
+void gic_handle_irq(struct pt_regs *regs);
 void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);
 void gic_raise_softirq(const struct cpumask *mask, unsigned int irq);
 
-- 
1.7.0.4

  parent reply	other threads:[~2011-09-26 11:02 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-26 11:02 [PATCH v2 00/16] Switch GIC users (and omap2plus) to CONFIG_MULTI_IRQ_HANDLER Marc Zyngier
2011-09-26 11:02 ` [PATCH v2 01/16] ARM: Make global handler and CONFIG_MULTI_IRQ_HANDLER mutually exclusive Marc Zyngier
2011-09-28  1:00   ` Tony Lindgren
2011-09-26 11:02 ` [PATCH v2 02/16] ARM: smp: Add an IPI handler callable from C code Marc Zyngier
2011-09-28  1:01   ` Tony Lindgren
2011-09-26 11:02 ` Marc Zyngier [this message]
2011-09-28  1:01   ` [PATCH v2 03/16] ARM: GIC: Add global gic_handle_irq() function Tony Lindgren
2011-09-26 11:02 ` [PATCH v2 04/16] ARM: RealView: convert to CONFIG_MULTI_IRQ_HANDLER Marc Zyngier
2011-09-26 11:02 ` [PATCH v2 05/16] ARM: VExpress: " Marc Zyngier
2011-09-26 11:02 ` [PATCH v2 06/16] ARM: msm: convert SMP platforms " Marc Zyngier
2011-09-26 11:02 ` [PATCH v2 07/16] ARM: GIC: Add global gic_handle_irq_offset() function Marc Zyngier
2011-09-28 15:50   ` Rob Herring
2011-09-29  8:53     ` Marc Zyngier
2011-09-26 11:02 ` [PATCH v2 08/16] ARM: exynos4: convert to CONFIG_MULTI_IRQ_HANDLER Marc Zyngier
2011-09-26 11:02 ` [PATCH v2 09/16] ARM: tegra2: " Marc Zyngier
2011-09-26 11:02 ` [PATCH v2 10/16] ARM: ux500: " Marc Zyngier
2011-09-27 11:47   ` Linus Walleij
2011-09-27 12:33     ` Marc Zyngier
2011-09-26 11:02 ` [PATCH v2 11/16] ARM: shmobile: convert smp platforms to gic_handle_irq() Marc Zyngier
2011-09-26 11:02 ` [PATCH v2 12/16] ARM: cns3xxx: convert to CONFIG_MULTI_IRQ_HANDLER Marc Zyngier
2011-09-26 11:02 ` [PATCH v2 13/16] ARM: zynq: " Marc Zyngier
2011-09-26 11:02 ` [PATCH v2 14/16] ARM: omap2/3: Add global omap2/3_intc_handle_irq() functions Marc Zyngier
2011-09-28  1:02   ` Tony Lindgren
2011-09-26 11:02 ` [PATCH v2 15/16] ARM: omap2plus: convert to CONFIG_MULTI_IRQ_HANDLER Marc Zyngier
2011-09-28  1:04   ` Tony Lindgren
2011-09-26 11:02 ` [PATCH v2 16/16] ARM: GIC: Make MULTI_IRQ_HANDLER mandatory Marc Zyngier
2011-09-27  3:43   ` Shawn Guo
2011-09-27  8:32     ` Marc Zyngier
2011-09-27 10:19       ` Shawn Guo
2011-09-28  1:04   ` Tony Lindgren
2011-09-26 20:20 ` [PATCH v2 00/16] Switch GIC users (and omap2plus) to CONFIG_MULTI_IRQ_HANDLER David Brown
2011-09-27  0:15   ` David Brown
2011-09-27  8:58     ` Marc Zyngier
2011-09-27 10:20 ` Shawn Guo
2011-09-27 10:22   ` Marc Zyngier
2011-09-27 23:53 ` Tony Lindgren
2011-09-28  0:53   ` Tony Lindgren

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1317034955-1029-4-git-send-email-marc.zyngier@arm.com \
    --to=marc.zyngier@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.