From: Daniel Thompson <daniel.thompson@linaro.org>
To: Jason Wessel <jason.wessel@windriver.com>,
kgdb-bugreport@lists.sourceforge.net
Cc: Mark Rutland <mark.rutland@arm.com>,
kernel@stlinux.com, Frederic Weisbecker <fweisbec@gmail.com>,
Linus Walleij <linus.walleij@linaro.org>,
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, 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>,
Thomas Gleixner <tglx@linutronix.de>,
linux-arm-kernel@lists.infradead.org,
Greg Kroah-Hartman <gregkh@lin>
Subject: [RFC 8/8] arm: fiq: Hack FIQ routing backdoors into GIC and VIC
Date: Wed, 14 May 2014 16:58:45 +0100 [thread overview]
Message-ID: <1400083125-1464-9-git-send-email-daniel.thompson@linaro.org> (raw)
In-Reply-To: <1400083125-1464-1-git-send-email-daniel.thompson@linaro.org>
This is a hack to make it easy to check that the other interfaces in the
patchset make sense. It needs to be replaced by code to get the
interrupt controllers to expose FIQs.
Unless a better option presents itself I plan to double up each
interrupt source (so we get two virqs, one for regular interrupt and
one for FIQ). This is what most of the prior art around FIQ in Linux
has done in the past.
Signed-off-by: Daniel Thompson <daniel.thompson@linaro.org>
---
arch/arm/boot/dts/stih416.dtsi | 2 +-
arch/arm/boot/dts/vexpress-v2m-rs1.dtsi | 2 +-
arch/arm/kernel/fiq.c | 39 +++++++++++++++++++++++++++++++++
drivers/irqchip/irq-gic.c | 27 +++++++++++++++++++++++
4 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/arch/arm/boot/dts/stih416.dtsi b/arch/arm/boot/dts/stih416.dtsi
index 78746d2..a288898 100644
--- a/arch/arm/boot/dts/stih416.dtsi
+++ b/arch/arm/boot/dts/stih416.dtsi
@@ -99,7 +99,7 @@
compatible = "st,asc";
status = "disabled";
reg = <0xfe531000 0x2c>;
- interrupts = <0 210 0>;
+ interrupts = <0 210 0>, <0 210 0>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sbc_serial1>;
clocks = <&CLK_SYSIN>;
diff --git a/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi
index ac870fb..fab2a40 100644
--- a/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi
+++ b/arch/arm/boot/dts/vexpress-v2m-rs1.dtsi
@@ -140,7 +140,7 @@
v2m_serial0: uart@090000 {
compatible = "arm,pl011", "arm,primecell";
reg = <0x090000 0x1000>;
- interrupts = <5>;
+ interrupts = <5>, <5>;
clocks = <&v2m_oscclk2>, <&smbclk>;
clock-names = "uartclk", "apb_pclk";
};
diff --git a/arch/arm/kernel/fiq.c b/arch/arm/kernel/fiq.c
index defbe85..efce321 100644
--- a/arch/arm/kernel/fiq.c
+++ b/arch/arm/kernel/fiq.c
@@ -41,6 +41,7 @@
#include <linux/interrupt.h>
#include <linux/seq_file.h>
#include <linux/irq.h>
+#include <linux/irqchip/arm-vic.h>
#include <asm/cacheflush.h>
#include <asm/cp15.h>
@@ -130,14 +131,52 @@ void release_fiq(struct fiq_handler *f)
static int fiq_start;
+/* These hacks use backdoors into the interrupt controller to perform FIQ/IRQ
+ * routing. These hacks are nasty and completely incompatible with (working)
+ * multiarch kernels. Additionally these hacks don't count enable/disable
+ * properly...
+ *
+ * This should probably all be replaced with virtual interrupt numbers
+ * that the intc already knows to bind to FIQ.
+ */
+#ifdef CONFIG_ARCH_VERSATILE
+#define USE_VIC_HACK
+#else
+#define USE_GIC_HACK
+#endif
+
void enable_fiq(int fiq)
{
+#ifdef USE_VIC_HACK
+ vic_set_fiq(fiq, true);
+#endif
+#ifdef USE_GIC_HACK
+{
+ struct irq_data *irq_data = irq_get_irq_data(fiq);
+
+ extern void gic_set_group_irq(struct irq_data *d, int group);
+ gic_set_group_irq(irq_data, 0);
+}
+#endif
+
enable_irq(fiq + fiq_start);
}
void disable_fiq(int fiq)
{
disable_irq(fiq + fiq_start);
+
+#ifdef USE_VIC_HACK
+ vic_set_fiq(fiq, false);
+#endif
+#ifdef USE_GIC_HACK
+{
+ struct irq_data *irq_data = irq_get_irq_data(fiq);
+
+ extern void gic_set_group_irq(struct irq_data *d, int group);
+ gic_set_group_irq(irq_data, 1);
+}
+#endif
}
void eoi_fiq(int fiq)
diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
index aa8efe4..c25632b 100644
--- a/drivers/irqchip/irq-gic.c
+++ b/drivers/irqchip/irq-gic.c
@@ -173,6 +173,33 @@ static void gic_unmask_irq(struct irq_data *d)
raw_spin_unlock(&irq_controller_lock);
}
+/*static*/ void gic_set_group_irq(struct irq_data *d, int group)
+{
+ unsigned long flags;
+ unsigned int reg = gic_irq(d) / 32 * 4;
+ u32 mask = 1 << (gic_irq(d) % 32);
+ u32 val;
+
+ raw_spin_lock_irqsave(&irq_controller_lock, flags);
+ val = readl_relaxed(gic_dist_base(d) + GIC_DIST_IGROUP + reg);
+ if (group)
+ val |= mask;
+ else
+ val &= ~mask;
+ writel_relaxed(val, gic_dist_base(d) + GIC_DIST_IGROUP + reg);
+ raw_spin_unlock_irqrestore(&irq_controller_lock, flags);
+}
+
+/*static*/ int gic_get_group_irq(struct irq_data *d)
+{
+ unsigned int reg = gic_irq(d) / 32 * 4;
+ u32 mask = 1 << (gic_irq(d) % 32);
+ u32 val;
+
+ val = readl_relaxed(gic_dist_base(d) + GIC_DIST_IGROUP + reg);
+ return !!(val & mask);
+}
+
static void gic_eoi_irq(struct irq_data *d)
{
if (gic_arch_extn.irq_eoi) {
--
1.9.0
next prev parent reply other threads:[~2014-05-14 15:58 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 ` Daniel Thompson [this message]
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 ` [RFC v2 02/10] irqchip: gic: Provide support for interrupt grouping Daniel Thompson
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=1400083125-1464-9-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=fweisbec@gmail.com \
--cc=galak@codeaurora.org \
--cc=gregkh@lin \
--cc=ijc+devicetree@hellion.org.uk \
--cc=jason.wessel@windriver.com \
--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-arm-kernel@lists.infradead.org \
--cc=linux-serial@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=mark.rutland@arm.com \
--cc=nico@linaro.org \
--cc=patches@linaro.org \
--cc=pawel.moll@arm.com \
--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).