From: Andrew Bresticker <abrestic@chromium.org>
To: Ralf Baechle <ralf@linux-mips.org>,
Rob Herring <robh+dt@kernel.org>, Pawel Moll <pawel.moll@arm.com>,
Mark Rutland <mark.rutland@arm.com>,
Ian Campbell <ijc+devicetree@hellion.org.uk>,
Kumar Gala <galak@codeaurora.org>,
Thomas Gleixner <tglx@linutronix.de>,
Jason Cooper <jason@lakedaemon.net>
Cc: Andrew Bresticker <abrestic@chromium.org>,
Jeffrey Deans <jeffrey.deans@imgtec.com>,
Markos Chandras <markos.chandras@imgtec.com>,
Paul Burton <paul.burton@imgtec.com>,
Arnd Bergmann <arnd@arndb.de>, John Crispin <blogic@openwrt.org>,
David Daney <ddaney.cavm@gmail.com>,
linux-mips@linux-mips.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: [PATCH v2 16/16] MIPS: Malta: Map GIC local interrupts
Date: Fri, 5 Sep 2014 10:30:18 -0700 [thread overview]
Message-ID: <1409938218-9026-17-git-send-email-abrestic@chromium.org> (raw)
In-Reply-To: <1409938218-9026-1-git-send-email-abrestic@chromium.org>
Now that the GIC driver properly supports local interrupts, extend
the static interrupt mapping to include the GIC timer and watchdog
and fix up the GIC interrupt setup and handling so that the local
interrupts are properly handled. Note that ipi_map is also renamed
to gic_irq_map since it is now also used to track mapping of non-IPI
interrupts to CPUs.
Signed-off-by: Andrew Bresticker <abrestic@chromium.org>
---
No changes from v1.
---
arch/mips/mti-malta/malta-int.c | 44 +++++++++++++++++++++++++++++++----------
1 file changed, 34 insertions(+), 10 deletions(-)
diff --git a/arch/mips/mti-malta/malta-int.c b/arch/mips/mti-malta/malta-int.c
index e4f43ba..16b1473 100644
--- a/arch/mips/mti-malta/malta-int.c
+++ b/arch/mips/mti-malta/malta-int.c
@@ -38,7 +38,7 @@
#include <asm/rtlx.h>
static unsigned long _msc01_biu_base;
-static unsigned int ipi_map[NR_CPUS];
+static unsigned int gic_irq_map[NR_CPUS];
static DEFINE_RAW_SPINLOCK(mips_irq_lock);
@@ -129,8 +129,8 @@ static void malta_hw0_irqdispatch(void)
static void malta_ipi_irqdispatch(void)
{
-#ifdef CONFIG_MIPS_GIC_IPI
unsigned long irq;
+#ifdef CONFIG_MIPS_GIC_IPI
DECLARE_BITMAP(pending, GIC_NUM_INTRS);
gic_get_int_mask(pending, ipi_ints);
@@ -143,8 +143,12 @@ static void malta_ipi_irqdispatch(void)
irq = find_next_bit(pending, GIC_NUM_INTRS, irq + 1);
}
#endif
- if (gic_compare_int())
- do_IRQ(MIPS_GIC_IRQ_BASE);
+ irq = gic_get_local_int();
+ while (irq < GIC_NUM_LOCAL_INTRS) {
+ do_IRQ(MIPS_GIC_LOCAL_IRQ_BASE + irq);
+
+ irq = gic_get_local_int();
+ }
}
static void corehi_irqdispatch(void)
@@ -288,7 +292,7 @@ asmlinkage void plat_irq_dispatch(void)
if (irq == MIPSCPU_INT_I8259A)
malta_hw0_irqdispatch();
- else if (gic_present && ((1 << irq) & ipi_map[smp_processor_id()]))
+ else if (gic_present && ((1 << irq) & gic_irq_map[smp_processor_id()]))
malta_ipi_irqdispatch();
else
do_IRQ(MIPS_CPU_IRQ_BASE + irq);
@@ -408,7 +412,7 @@ static int msc_nr_eicirqs __initdata = ARRAY_SIZE(msc_eicirqmap);
#define GIC_CPU_NMI GIC_MAP_TO_NMI_MSK
#define X GIC_UNUSED
-static struct gic_intr_map gic_intr_map[GIC_NUM_INTRS] = {
+static struct gic_intr_map gic_intr_map[GIC_NUM_INTRS + GIC_NUM_LOCAL_INTRS] = {
{ X, X, X, X, 0 },
{ X, X, X, X, 0 },
{ X, X, X, X, 0 },
@@ -425,7 +429,10 @@ static struct gic_intr_map gic_intr_map[GIC_NUM_INTRS] = {
{ 0, GIC_CPU_NMI, GIC_POL_POS, GIC_TRIG_LEVEL, GIC_FLAG_TRANSPARENT },
{ 0, GIC_CPU_NMI, GIC_POL_POS, GIC_TRIG_LEVEL, GIC_FLAG_TRANSPARENT },
{ X, X, X, X, 0 },
- /* The remainder of this table is initialised by fill_ipi_map */
+ /*
+ * The remainder of this table is initialised by fill_ipi_map and
+ * fill_local_irq_map
+ */
};
#undef X
@@ -438,7 +445,7 @@ static void __init fill_ipi_map1(int baseintr, int cpu, int cpupin)
gic_intr_map[intr].polarity = GIC_POL_POS;
gic_intr_map[intr].trigtype = GIC_TRIG_EDGE;
gic_intr_map[intr].flags = 0;
- ipi_map[cpu] |= (1 << (cpupin + 2));
+ gic_irq_map[cpu] |= (1 << (cpupin + 2));
bitmap_set(ipi_ints, intr, 1);
}
@@ -453,6 +460,22 @@ static void __init fill_ipi_map(void)
}
#endif
+static void __init fill_local_irq_map(void)
+{
+ int i;
+
+ for (i = 0; i < GIC_NUM_LOCAL_INTRS; i++) {
+ int intr = i + GIC_NUM_INTRS;
+
+ gic_intr_map[intr].cpunum = 0;
+ gic_intr_map[intr].pin = GIC_CPU_INT2;
+ gic_intr_map[intr].flags = 0;
+ }
+
+ for (i = 0; i < NR_CPUS; i++)
+ gic_irq_map[i] |= 1 << (GIC_CPU_INT2 + 2);
+}
+
void __init arch_init_ipiirq(int irq, struct irqaction *action)
{
setup_irq(irq, action);
@@ -533,6 +556,7 @@ void __init arch_init_irq(void)
gic_resched_int_base = gic_call_int_base - nr_cpu_ids;
fill_ipi_map();
#endif
+ fill_local_irq_map();
gic_init(GIC_BASE_ADDR, GIC_ADDRSPACE_SZ, gic_intr_map,
ARRAY_SIZE(gic_intr_map), MIPS_GIC_IRQ_BASE);
if (!mips_cm_present()) {
@@ -542,8 +566,7 @@ void __init arch_init_irq(void)
(i | (0x1 << MSC01_SC_CFG_GICENA_SHF));
pr_debug("GIC Enabled\n");
}
-#if defined(CONFIG_MIPS_GIC_IPI)
- /* set up ipi interrupts */
+ /* set up ipi and local interrupts */
if (cpu_has_vint) {
set_vi_handler(MIPSCPU_INT_IPI0, malta_ipi_irqdispatch);
set_vi_handler(MIPSCPU_INT_IPI1, malta_ipi_irqdispatch);
@@ -557,6 +580,7 @@ void __init arch_init_irq(void)
write_c0_status(0x1100dc00);
pr_info("CPU%d: status register frc %08x\n",
smp_processor_id(), read_c0_status());
+#if defined(CONFIG_MIPS_GIC_IPI)
for (i = 0; i < nr_cpu_ids; i++) {
arch_init_ipiirq(MIPS_GIC_IRQ_BASE +
GIC_RESCHED_INT(i), &irq_resched);
--
2.1.0.rc2.206.gedb03e5
prev parent reply other threads:[~2014-09-05 17:30 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-05 17:30 [PATCH v2 00/16] MIPS: GIC device-tree support Andrew Bresticker
[not found] ` <1409938218-9026-1-git-send-email-abrestic-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2014-09-05 17:30 ` [PATCH v2 01/16] MIPS: Provide a generic plat_irq_dispatch Andrew Bresticker
[not found] ` <1409938218-9026-2-git-send-email-abrestic-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2014-09-05 18:51 ` Thomas Gleixner
2014-09-05 21:02 ` Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 09/16] irqchip: mips-gic: Fix gic_set_affinity() return value Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 13/16] irqchip: mips-gic: Add generic IPI support when using DT Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 02/16] MIPS: Set vint handler when mapping CPU interrupts Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 03/16] MIPS: Export CPU IRQ domain Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 04/16] MIPS: smp-cps: Enable all hardware interrupts on secondary CPUs Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 05/16] MIPS: Move GIC to drivers/irqchip/ Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 06/16] MIPS: Move MIPS_GIC_IRQ_BASE into platform irq.h Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 07/16] irqchip: mips-gic: Implement irq_set_type callback Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 08/16] irqchip: mips-gic: Implement generic irq_ack/irq_eoi callbacks Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 10/16] of: Add vendor prefix for MIPS Technologies, Inc Andrew Bresticker
[not found] ` <1409938218-9026-11-git-send-email-abrestic-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2014-09-22 14:23 ` Rob Herring
2014-09-22 16:28 ` Andrew Bresticker
2014-09-22 19:01 ` Kumar Gala
2014-09-22 19:30 ` Andrew Bresticker
[not found] ` <CAL1qeaEd2L8NUugh27hkGMa1aqaxviupRJnBd2+aru1wq6KKGg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-09-22 19:36 ` Kumar Gala
[not found] ` <C73B2A63-4396-462B-8172-F9CA32E573F1-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2014-09-22 19:43 ` Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 11/16] of: Add binding document for MIPS GIC Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 12/16] irqchip: mips-gic: Add device-tree support Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 14/16] irqchip: mips-gic: Support local interrupts Andrew Bresticker
2014-09-05 19:05 ` Thomas Gleixner
2014-09-05 21:50 ` Andrew Bresticker
2014-09-05 17:30 ` [PATCH v2 15/16] MIPS: GIC: Use local interrupts for timer Andrew Bresticker
[not found] ` <1409938218-9026-16-git-send-email-abrestic-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2014-09-05 19:08 ` Thomas Gleixner
2014-09-05 17:30 ` Andrew Bresticker [this message]
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=1409938218-9026-17-git-send-email-abrestic@chromium.org \
--to=abrestic@chromium.org \
--cc=arnd@arndb.de \
--cc=blogic@openwrt.org \
--cc=ddaney.cavm@gmail.com \
--cc=devicetree@vger.kernel.org \
--cc=galak@codeaurora.org \
--cc=ijc+devicetree@hellion.org.uk \
--cc=jason@lakedaemon.net \
--cc=jeffrey.deans@imgtec.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@linux-mips.org \
--cc=mark.rutland@arm.com \
--cc=markos.chandras@imgtec.com \
--cc=paul.burton@imgtec.com \
--cc=pawel.moll@arm.com \
--cc=ralf@linux-mips.org \
--cc=robh+dt@kernel.org \
--cc=tglx@linutronix.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).