From: Daniel Thompson <daniel.thompson@linaro.org>
To: Jason Wessel <jason.wessel@windriver.com>
Cc: Mark Rutland <mark.rutland@arm.com>,
Nicolas Pitre <nicolas.pitre@linaro.org>,
kernel@stlinux.com, kgdb-bugreport@lists.sourceforge.net,
Linus Walleij <linus.walleij@linaro.org>,
Sricharan R <r.sricharan@ti.com>, Jiri Slaby <jslaby@suse.cz>,
Daniel Thompson <daniel.thompson@linaro.org>,
Dirk Behme <dirk.behme@de.bosch.com>,
Russell King <linux@arm.linux.org.uk>,
Nicolas Pitre <nico@linaro.org>,
Ian Campbell <ijc+devicetree@hellion.org.uk>,
Anton Vorontsov <anton.vorontsov@linaro.org>,
"David A. Long" <dave.long@linaro.org>,
linux-serial@vger.kernel.org,
Catalin Marinas <catalin.marinas@arm.com>,
kernel-team@android.com, devicetree@vger.kernel.org,
linaro-kernel@lists.linaro.org,
Jason Cooper <jason@lakedaemon.net>,
Pawel Moll <pawel.moll@arm.com>,
patches@linaro.org, Kumar Gala <galak@codeaurora.org>,
Rob Herring <robh+dt@kernel.org>,
John Stultz <john.stultz@linaro.org>
Subject: [RFC v2 02/10] irqchip: gic: Provide support for interrupt grouping
Date: Fri, 23 May 2014 14:57:50 +0100 [thread overview]
Message-ID: <1400853478-5824-3-git-send-email-daniel.thompson@linaro.org> (raw)
In-Reply-To: <1400853478-5824-1-git-send-email-daniel.thompson@linaro.org>
All GIC hardware except GICv1 without TrustZone support provides a means
to group exceptions into group 0 (which can optionally be signally using
use FIQ) and group 1. The kernel currently provides no means to exploit
this. This patch alters the initialization of the GIC to place all
interrupts into group 1, this is a foundational requirement to meaningfully
use FIQ.
Note that the hardware functionality is unavailable to the kernel when a
secure monitor is present because access to the grouping registers are
prohibited outside "secure world". This allows grouping to be used to
allow hardware peripherals to send interrupts into the secure world.
On systems without TrustZone support the kernel has the power to
route interrupt sources to FIQ, potentially allowing a driver to exploit the
NMI-like properties of FIQ.
The registers involved are RAZ/WI when unimplemented or protected by
security policy. This patch therefore applies grouping unconditionally.
Tested on a qemu GICv2 model (self-written from GICv2 spec) and
an STiH416 (ARM Cortex A9, GICv1, TZ).
Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Jason Cooper <jason@lakedaemon.net>
Cc: Nicolas Pitre <nicolas.pitre@linaro.org>
Cc: Christoffer Dall <christoffer.dall@linaro.org>
Cc: Sricharan R <r.sricharan@ti.com>
Acked-by: Dirk Behme <dirk.behme@de.bosch.com>
---
drivers/irqchip/irq-gic.c | 35 ++++++++++++++++++++++++++++++-----
include/linux/irqchip/arm-gic.h | 3 +++
2 files changed, 33 insertions(+), 5 deletions(-)
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
index 57d165e..aa8efe4 100644
--- a/drivers/irqchip/irq-gic.c
+++ b/drivers/irqchip/irq-gic.c
@@ -408,13 +408,27 @@ static void __init gic_dist_init(struct gic_chip_data *gic)
writel_relaxed(0xa0a0a0a0, base + GIC_DIST_PRI + i * 4 / 4);
/*
+ * Set all global interrupts to be group 1.
+ *
+ * If grouping is not available (not implemented or prohibited by
+ * security mode) these registers a read-as-zero/write-ignored.
+ */
+ for (i = 32; i < gic_irqs; i += 32)
+ writel_relaxed(0xffffffff, base + GIC_DIST_IGROUP + i * 4 / 32);
+
+ /*
* Disable all interrupts. Leave the PPI and SGIs alone
* as these enables are banked registers.
*/
for (i = 32; i < gic_irqs; i += 32)
writel_relaxed(0xffffffff, base + GIC_DIST_ENABLE_CLEAR + i * 4 / 32);
- writel_relaxed(1, base + GIC_DIST_CTRL);
+ /*
+ * Set EnableGrp1/EnableGrp0 (bit 1 and 0) or EnableGrp (bit 0 only,
+ * bit 1 ignored)
+ */
+ writel_relaxed(GIC_DIST_CTRL_ENABLE_GRP0_BIT |
+ GIC_DIST_CTRL_ENABLE_GRP1_BIT, base + GIC_DIST_CTRL);
}
static void gic_cpu_init(struct gic_chip_data *gic)
@@ -452,8 +466,16 @@ static void gic_cpu_init(struct gic_chip_data *gic)
for (i = 0; i < 32; i += 4)
writel_relaxed(0xa0a0a0a0, dist_base + GIC_DIST_PRI + i * 4 / 4);
+ /*
+ * Set all PPI and SGI interrupts to be group 1.
+ *
+ * If grouping is not available (not implemented or prohibited by
+ * security mode) these registers are read-as-zero/write-ignored.
+ */
+ writel_relaxed(0xffffffff, dist_base + GIC_DIST_IGROUP + 0);
+
writel_relaxed(0xf0, base + GIC_CPU_PRIMASK);
- writel_relaxed(1, base + GIC_CPU_CTRL);
+ writel_relaxed(0x1f, base + GIC_CPU_CTRL);
}
void gic_cpu_if_down(void)
@@ -537,7 +559,9 @@ static void gic_dist_restore(unsigned int gic_nr)
writel_relaxed(gic_data[gic_nr].saved_spi_enable[i],
dist_base + GIC_DIST_ENABLE_SET + i * 4);
- writel_relaxed(1, dist_base + GIC_DIST_CTRL);
+ writel_relaxed(GIC_DIST_CTRL_ENABLE_GRP0_BIT |
+ GIC_DIST_CTRL_ENABLE_GRP1_BIT,
+ dist_base + GIC_DIST_CTRL);
}
static void gic_cpu_save(unsigned int gic_nr)
@@ -594,7 +618,7 @@ static void gic_cpu_restore(unsigned int gic_nr)
writel_relaxed(0xa0a0a0a0, dist_base + GIC_DIST_PRI + i * 4);
writel_relaxed(0xf0, cpu_base + GIC_CPU_PRIMASK);
- writel_relaxed(1, cpu_base + GIC_CPU_CTRL);
+ writel_relaxed(0x1f, cpu_base + GIC_CPU_CTRL);
}
static int gic_notifier(struct notifier_block *self, unsigned long cmd, void *v)
@@ -670,7 +694,8 @@ static void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
dmb(ishst);
/* this always happens on GIC0 */
- writel_relaxed(map << 16 | irq, gic_data_dist_base(&gic_data[0]) + GIC_DIST_SOFTINT);
+ writel_relaxed(map << 16 | irq | 0x8000,
+ gic_data_dist_base(&gic_data[0]) + GIC_DIST_SOFTINT);
raw_spin_unlock_irqrestore(&irq_controller_lock, flags);
}
diff --git a/include/linux/irqchip/arm-gic.h b/include/linux/irqchip/arm-gic.h
index 7ed92d0..919502f 100644
--- a/include/linux/irqchip/arm-gic.h
+++ b/include/linux/irqchip/arm-gic.h
@@ -37,6 +37,9 @@
#define GIC_DIST_SGI_PENDING_CLEAR 0xf10
#define GIC_DIST_SGI_PENDING_SET 0xf20
+#define GIC_DIST_CTRL_ENABLE_GRP0_BIT (1 << 0)
+#define GIC_DIST_CTRL_ENABLE_GRP1_BIT (1 << 1)
+
#define GICH_HCR 0x0
#define GICH_VTR 0x4
#define GICH_VMCR 0x8
--
1.9.0
next prev parent reply other threads:[~2014-05-23 13:57 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-14 15:58 [RFC 0/8] kgdb: NMI/FIQ support for ARM Daniel Thompson
2014-05-14 15:58 ` [RFC 1/8] arm: fiq: Allow EOI to be communicated to the intc Daniel Thompson
2014-05-14 15:58 ` [RFC 2/8] irqchip: gic: Provide support for interrupt grouping Daniel Thompson
2014-05-14 15:58 ` [RFC 3/8] ARM: Move some macros from entry-armv to entry-header Daniel Thompson
2014-05-14 15:58 ` [RFC 4/8] ARM: Add KGDB/KDB FIQ debugger generic code Daniel Thompson
2014-05-14 15:58 ` [RFC 5/8] serial: amba-pl011: Pass on FIQ information to KGDB Daniel Thompson
2014-05-14 15:58 ` [RFC 6/8] serial: asc: Add support for KGDB's FIQ/NMI mode Daniel Thompson
2014-05-14 15:58 ` [RFC 7/8] ARM: VIC: Add vic_set_fiq function to select if an interrupt should generate an IRQ or FIQ Daniel Thompson
2014-05-14 15:58 ` [RFC 8/8] arm: fiq: Hack FIQ routing backdoors into GIC and VIC Daniel Thompson
2014-05-23 13:57 ` [RFC v2 00/10] kgdb: NMI/FIQ support for ARM Daniel Thompson
2014-05-23 13:57 ` [RFC v2 01/10] arm: fiq: Allow EOI to be communicated to the intc Daniel Thompson
2014-05-23 14:59 ` Srinivas Kandagatla
2014-05-23 15:00 ` Russell King - ARM Linux
2014-05-28 15:47 ` Daniel Thompson
2014-05-23 13:57 ` Daniel Thompson [this message]
2014-05-23 13:57 ` [RFC v2 03/10] irqchip: gic: Introduce shadow irqs for FIQ Daniel Thompson
2014-05-23 13:57 ` [RFC v2 04/10] ARM: vexpress: Extend UART with FIQ support Daniel Thompson
2014-05-23 15:04 ` Russell King - ARM Linux
2014-05-29 10:31 ` Daniel Thompson
2014-05-29 13:44 ` Rob Herring
2014-06-03 12:41 ` Daniel Thompson
2014-05-23 13:57 ` [RFC v2 05/10] ARM: STi: STiH41x: " Daniel Thompson
2014-05-23 13:57 ` [RFC v2 06/10] irqchip: vic: Introduce shadow irqs for FIQ Daniel Thompson
2014-05-23 13:57 ` [RFC v2 07/10] ARM: Move some macros from entry-armv to entry-header Daniel Thompson
2014-05-23 13:57 ` [RFC v2 08/10] ARM: Add KGDB/KDB FIQ debugger generic code Daniel Thompson
2014-05-23 13:57 ` [RFC v2 09/10] serial: amba-pl011: Pass on FIQ information to KGDB Daniel Thompson
2014-05-23 13:57 ` [RFC v2 10/10] serial: asc: Add support for KGDB's FIQ/NMI mode Daniel Thompson
2014-05-23 14:50 ` Srinivas Kandagatla
2014-06-05 9:53 ` [RFC v3 0/9] kgdb: NMI/FIQ support for ARM Daniel Thompson
2014-06-05 9:53 ` [RFC v3 1/9] arm: fiq: arbitrary mappings from IRQ to FIQ virqs Daniel Thompson
2014-06-05 11:51 ` Russell King - ARM Linux
2014-06-05 13:08 ` Daniel Thompson
2014-06-12 8:37 ` Linus Walleij
2014-06-12 9:54 ` Daniel Thompson
2014-06-13 14:29 ` Rob Herring
2014-06-18 11:24 ` Daniel Thompson
2014-06-05 9:53 ` [RFC v3 2/9] arm: fiq: Allow EOI to be communicated to the intc Daniel Thompson
2014-06-05 9:53 ` [RFC v3 3/9] irqchip: gic: Provide support for interrupt grouping Daniel Thompson
2014-06-05 19:50 ` Nicolas Pitre
2014-06-05 9:53 ` [RFC v3 4/9] irqchip: gic: Introduce shadow irqs for FIQ Daniel Thompson
2014-06-06 7:46 ` Peter De Schrijver
2014-06-06 9:23 ` Daniel Thompson
2014-06-05 9:53 ` [RFC v3 5/9] irqchip: vic: " Daniel Thompson
2014-06-05 9:53 ` [RFC v3 6/9] ARM: Move some macros from entry-armv to entry-header Daniel Thompson
2014-06-05 9:53 ` [RFC v3 7/9] ARM: Add KGDB/KDB FIQ debugger generic code Daniel Thompson
2014-06-05 9:53 ` [RFC v3 8/9] serial: amba-pl011: Pass on FIQ information to KGDB Daniel Thompson
2014-06-05 9:53 ` [RFC v3 9/9] serial: asc: Add support for KGDB's FIQ/NMI mode Daniel Thompson
2014-06-19 10:38 ` [PATCH v4 00/13] kgdb: NMI/FIQ support for ARM Daniel Thompson
2014-06-19 10:38 ` [PATCH v4 01/13] arm: fiq: Add callbacks to manage FIQ routings Daniel Thompson
2014-06-19 10:38 ` [PATCH v4 02/13] arm: fiq: Allow EOI to be communicated to the intc Daniel Thompson
2014-06-19 10:38 ` [PATCH v4 03/13] irqchip: gic: Provide support for interrupt grouping Daniel Thompson
2014-06-19 10:38 ` [PATCH v4 04/13] irqchip: gic: Add support for FIQ management Daniel Thompson
2014-06-19 10:38 ` [PATCH v4 05/13] irqchip: gic: Remove spin locks from eoi_irq Daniel Thompson
2014-06-19 10:38 ` [PATCH v4 06/13] irqchip: vic: Add support for FIQ management Daniel Thompson
2014-06-19 10:38 ` [PATCH v4 07/13] ARM: Move some macros from entry-armv to entry-header Daniel Thompson
2014-06-19 10:38 ` [PATCH v4 08/13] ARM: Add KGDB/KDB FIQ debugger generic code Daniel Thompson
2014-06-19 10:38 ` [PATCH v4 09/13] serial: amba-pl011: Pass FIQ information to KGDB Daniel Thompson
2014-06-20 0:36 ` Greg Kroah-Hartman
2014-06-19 10:38 ` [PATCH v4 10/13] serial: asc: Add support for KGDB's FIQ/NMI mode Daniel Thompson
2014-06-20 0:36 ` Greg Kroah-Hartman
2014-06-19 10:38 ` [PATCH v4 11/13] serial: asc: Adopt readl_/writel_relaxed() Daniel Thompson
2014-06-19 11:29 ` Srinivas Kandagatla
2014-06-19 11:46 ` Daniel Thompson
2014-06-19 11:58 ` Maxime Coquelin
2014-06-19 12:01 ` Srinivas Kandagatla
2014-06-19 13:12 ` Daniel Thompson
2014-06-19 10:38 ` [PATCH v4 12/13] serial: imx: clean up imx_poll_get_char() Daniel Thompson
2014-06-19 10:38 ` [PATCH v4 13/13] serial: imx: Add support for KGDB's FIQ/NMI mode Daniel Thompson
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=1400853478-5824-3-git-send-email-daniel.thompson@linaro.org \
--to=daniel.thompson@linaro.org \
--cc=anton.vorontsov@linaro.org \
--cc=catalin.marinas@arm.com \
--cc=dave.long@linaro.org \
--cc=devicetree@vger.kernel.org \
--cc=dirk.behme@de.bosch.com \
--cc=galak@codeaurora.org \
--cc=ijc+devicetree@hellion.org.uk \
--cc=jason.wessel@windriver.com \
--cc=jason@lakedaemon.net \
--cc=john.stultz@linaro.org \
--cc=jslaby@suse.cz \
--cc=kernel-team@android.com \
--cc=kernel@stlinux.com \
--cc=kgdb-bugreport@lists.sourceforge.net \
--cc=linaro-kernel@lists.linaro.org \
--cc=linus.walleij@linaro.org \
--cc=linux-serial@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=mark.rutland@arm.com \
--cc=nico@linaro.org \
--cc=nicolas.pitre@linaro.org \
--cc=patches@linaro.org \
--cc=pawel.moll@arm.com \
--cc=r.sricharan@ti.com \
--cc=robh+dt@kernel.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 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).