irqchip: Move Tegra LIC to use stacked domains
Subsystems (5)
v6 cover irqchip: Move Tegra LIC to use stacked domains
This series is extracted from [4], which is trying to remove all traces of gic_arch_extn from the tree. As some maintainers are more responsive than others (understatement of the year...), I've decided to split it per sub-arch, and get it moving, at least partially.
This series addresses Tegra by moving its legacy interrupt controller support to drivers/irqchip and implementing a stacked domain on top of the standard GIC.
It is worth realizing that:
- I haven't been able to test this as much as I would have wanted to (it's only been tested on tegra2).
- This actively *breaks* existing setups. Once you boot a new kernel with an old DT, suspend/resume *will* be broken. Old kernels on a new DT won't even boot!
Based on 4.0-rc1.
* From v5: [5]
- Allow interrupt affinity to be changed
* From v4: [4]
- Extracted from the full series
- Rebased on 4.0-rc1
* From v3 [3]:
- Rebased on top of the patch working around hardcoded IRQ on OMAP4/5 [4]
- Fixed more iMX6 DTs (Stephan)
- Fixed Exynos4/5 DTs
* From v2 [2]:
- Addressed numerous comments from Thierry
- Merged bug fixes from Nishanth
- Merged bug fix from Stefan
* From v1 [1]:
- Rebased on 3.19-rc3
- Fixed a number of additional platforms
- Added crossbar conversion to stacked domains
- Merged bug fixes from Nishanth
[5]: http://lists.infradead.org/pipermail/linux-arm-kernel/2015-February/325172.html
[4]: http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/317531.html
[3]: http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/315385.html
[2]: http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/314041.html
[1]: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-November/307338.html
Marc Zyngier (6):
ARM: tegra: irq: nuke leftovers from non-DT support
irqchip: tegra: add DT-based support for legacy interrupt controller
ARM: tegra: skip gic_arch_extn setup if DT has a LIC node
ARM: tegra: update DTs to expose legacy interrupt controller
DT: tegra: add binding for the legacy interrupt controller
ARM: tegra: remove old LIC support
.../interrupt-controller/nvidia,tegra-ictlr.txt | 43 +++ arch/arm/boot/dts/tegra114.dtsi | 16 +- arch/arm/boot/dts/tegra124.dtsi | 16 +- arch/arm/boot/dts/tegra20.dtsi | 15 +- arch/arm/boot/dts/tegra30.dtsi | 16 +- arch/arm/mach-tegra/iomap.h | 15 - arch/arm/mach-tegra/irq.c | 209 +----------- arch/arm/mach-tegra/irq.h | 6 - arch/arm/mach-tegra/tegra.c | 1 - drivers/irqchip/Makefile | 1 + drivers/irqchip/irq-tegra.c | 371 +++++++++++++++++++++ 11 files changed, 482 insertions(+), 227 deletions(-) create mode 100644 Documentation/devicetree/bindings/interrupt-controller/nvidia,tegra-ictlr.txt create mode 100644 drivers/irqchip/irq-tegra.c
Signature · 1 line
2.1.4
PATCH v6 1/6 ARM: tegra: irq: nuke leftovers from non-DT support
The GIC is now always initialized from DT on tegra, and there is no point in keeping non-DT init code.
--- arch/arm/mach-tegra/irq.c | 8 -------- 1 file changed, 8 deletions(-)
arch/arm/mach-tegra/irq.c +0 -8
@@ -283,13 +283,5 @@ void __init tegra_init_irq(void) gic_arch_extn.irq_set_wake = tegra_set_wake; gic_arch_extn.flags =IRQCHIP_MASK_ON_SUSPEND ; -/* -* Check if there is a devicetree present, since the GIC will be -* initialized elsewhere under DT. -*/ -if (!of_have_populated_dt ()) -gic_init (0 ,29 , distbase, -IO_ADDRESS (TEGRA_ARM_PERIF_BASE +0x100 )); -tegra114_gic_cpu_pm_registration (); }
Signature · 1 line
2.1.4
PATCH v6 2/6 irqchip: tegra: add DT-based support for legacy interrupt controller
In reply to Marc ZyngierTegra's LIC (Legacy Interrupt Controller) has been so far only supported as a weird extension of the GIC, which is not exactly pretty.
The stacked IRQ domain framework fits this pretty well, and allows the LIC code to be turned into a standalone irqchip. In the process, make the driver DT aware, something that was sorely missing from the mach-tegra implementation.
--- drivers/irqchip/Makefile | 1 + drivers/irqchip/irq-tegra.c | 371 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 372 insertions(+) create mode 100644 drivers/irqchip/irq-tegra.c
drivers/irqchip/Makefile +1 -0
@@ -6,6 +6,7 @@ obj-$(CONFIG_ARCH_HIP04) += irq-hip04.o obj-$(CONFIG_ARCH_MMP) += irq-mmp.o obj-$(CONFIG_ARCH_MVEBU) += irq-armada-370-xp.o obj-$(CONFIG_ARCH_MXS) += irq-mxs.o +obj-$(CONFIG_ARCH_TEGRA) += irq-tegra.o obj-$(CONFIG_ARCH_S3C24XX) += irq-s3c24xx.o obj-$(CONFIG_DW_APB_ICTL) += irq-dw-apb-ictl.o obj-$(CONFIG_METAG) += irq-metag-ext.o
drivers/irqchip/irq-tegra.c new file +371 -0
371 lines not on this page · raw message
Signature · 1 line
2.1.4
PATCH v6 3/6 ARM: tegra: skip gic_arch_extn setup if DT has a LIC node
In reply to Marc ZyngierIf we detect that our DT has a LIC node, don't setup gic_arch_extn, and skip tegra_legacy_irq_syscore_init as well.
This is only a temporary measure until that code is removed for good.
--- arch/arm/mach-tegra/irq.c | 12 ++++++++++++ arch/arm/mach-tegra/tegra.c | 1 - 2 files changed, 12 insertions(+), 1 deletion(-)
arch/arm/mach-tegra/irq.c +12 -0
@@ -255,11 +255,22 @@ static void tegra114_gic_cpu_pm_registration(void)static void tegra114_gic_cpu_pm_registration (void ) { }#endif +static const struct of_device_id tegra_ictlr_match[]__initconst = { + { .compatible ="nvidia,tegra20-ictlr" }, + { .compatible ="nvidia,tegra30-ictlr" }, + { } +}; +void __init tegra_init_irq (void ) {int i;void __iomem *distbase; +if (of_find_matching_node (NULL , tegra_ictlr_match)) + goto skip_extn_setup; + +tegra_legacy_irq_syscore_init (); + distbase =IO_ADDRESS (TEGRA_ARM_INT_DIST_BASE ); num_ictlrs =readl_relaxed (distbase +GIC_DIST_CTR ) &0x1f ;
@@ -283,5 +294,6 @@ void __init tegra_init_irq(void) gic_arch_extn.irq_set_wake = tegra_set_wake; gic_arch_extn.flags =IRQCHIP_MASK_ON_SUSPEND ; +skip_extn_setup:tegra114_gic_cpu_pm_registration (); }
arch/arm/mach-tegra/tegra.c +0 -1
@@ -82,7 +82,6 @@ static void __init tegra_dt_init_irq(void) {tegra_init_irq ();irqchip_init (); -tegra_legacy_irq_syscore_init (); }static void __init tegra_dt_init (void )
Signature · 1 line
2.1.4
PATCH v6 4/6 ARM: tegra: update DTs to expose legacy interrupt controller
In reply to Marc ZyngierDescribe the legacy interrupt controller in every tegra DTSI files, and make it the parent of most interrupts.
--- arch/arm/boot/dts/tegra114.dtsi | 16 +++++++++++++++- arch/arm/boot/dts/tegra124.dtsi | 16 +++++++++++++++- arch/arm/boot/dts/tegra20.dtsi | 15 ++++++++++++++- arch/arm/boot/dts/tegra30.dtsi | 16 +++++++++++++++- 4 files changed, 59 insertions(+), 4 deletions(-)
arch/arm/boot/dts/tegra114.dtsi +15 -1
@@ -8,7 +8,7 @@ / { compatible = "nvidia,tegra114"; - interrupt-parent = <&gic>; + interrupt-parent = <&lic>; host1x at 50000000 { compatible = "nvidia,tegra114-host1x", "simple-bus";
@@ -134,6 +134,19 @@ <0x50046000 0x2000>; interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>; + interrupt-parent = <&gic>; + }; + + lic: interrupt-controller at 60004000 { + compatible = "nvidia,tegra114-ictlr", "nvidia,tegra30-ictlr"; + reg = <0x60004000 0x100>, + <0x60004100 0x50>, + <0x60004200 0x50>, + <0x60004300 0x50>, + <0x60004400 0x50>; + interrupt-controller; + #interrupt-cells = <3>; + interrupt-parent = <&gic>; }; timer at 60005000 {
@@ -766,5 +779,6 @@ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>; + interrupt-parent = <&gic>; }; };
arch/arm/boot/dts/tegra124.dtsi +15 -1
@@ -10,7 +10,7 @@ / { compatible = "nvidia,tegra124"; - interrupt-parent = <&gic>; + interrupt-parent = <&lic>; #address-cells = <2>; #size-cells = <2>;
@@ -173,6 +173,7 @@ <0x0 0x50046000 0x0 0x2000>; interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>; + interrupt-parent = <&gic>; }; gpu at 0,57000000 {
@@ -190,6 +191,18 @@ status = "disabled"; }; + lic: interrupt-controller at 60004000 { + compatible = "nvidia,tegra124-ictlr", "nvidia,tegra30-ictlr"; + reg = <0x0 0x60004000 0x0 0x100>, + <0x0 0x60004100 0x0 0x100>, + <0x0 0x60004200 0x0 0x100>, + <0x0 0x60004300 0x0 0x100>, + <0x0 0x60004400 0x0 0x100>; + interrupt-controller; + #interrupt-cells = <3>; + interrupt-parent = <&gic>; + }; + timer at 0,60005000 { compatible = "nvidia,tegra124-timer", "nvidia,tegra20-timer"; reg = <0x0 0x60005000 0x0 0x400>;
@@ -955,5 +968,6 @@ (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>, <GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>; + interrupt-parent = <&gic>; }; };
arch/arm/boot/dts/tegra20.dtsi +14 -1
@@ -7,7 +7,7 @@ / { compatible = "nvidia,tegra20"; - interrupt-parent = <&intc>; + interrupt-parent = <&lic>; host1x at 50000000 { compatible = "nvidia,tegra20-host1x", "simple-bus";
@@ -142,6 +142,7 @@ timer at 50040600 { compatible = "arm,cortex-a9-twd-timer"; + interrupt-parent = <&intc>; reg = <0x50040600 0x20>; interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_HIGH)>;
@@ -154,6 +155,7 @@ 0x50040100 0x0100>; interrupt-controller; #interrupt-cells = <3>; + interrupt-parent = <&intc>; }; cache-controller at 50043000 {
@@ -165,6 +167,17 @@ cache-level = <2>; }; + lic: interrupt-controller at 60004000 { + compatible = "nvidia,tegra20-ictlr"; + reg = <0x60004000 0x100>, + <0x60004100 0x50>, + <0x60004200 0x50>, + <0x60004300 0x50>; + interrupt-controller; + #interrupt-cells = <3>; + interrupt-parent = <&intc>; + }; + timer at 60005000 { compatible = "nvidia,tegra20-timer"; reg = <0x60005000 0x60>;
arch/arm/boot/dts/tegra30.dtsi +15 -1
@@ -8,7 +8,7 @@ / { compatible = "nvidia,tegra30"; - interrupt-parent = <&intc>; + interrupt-parent = <&lic>; pcie-controller at 00003000 { compatible = "nvidia,tegra30-pcie";
@@ -228,6 +228,7 @@ timer at 50040600 { compatible = "arm,cortex-a9-twd-timer"; reg = <0x50040600 0x20>; + interrupt-parent = <&intc>; interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_HIGH)>; clocks = <&tegra_car TEGRA30_CLK_TWD>;
@@ -239,6 +240,7 @@ 0x50040100 0x0100>; interrupt-controller; #interrupt-cells = <3>; + interrupt-parent = <&intc>; }; cache-controller at 50043000 {
@@ -250,6 +252,18 @@ cache-level = <2>; }; + lic: interrupt-controller at 60004000 { + compatible = "nvidia,tegra30-ictlr"; + reg = <0x60004000 0x100>, + <0x60004100 0x50>, + <0x60004200 0x50>, + <0x60004300 0x50>, + <0x60004400 0x50>; + interrupt-controller; + #interrupt-cells = <3>; + interrupt-parent = <&intc>; + }; + timer at 60005000 { compatible = "nvidia,tegra30-timer", "nvidia,tegra20-timer"; reg = <0x60005000 0x400>;
Signature · 1 line
2.1.4
PATCH v6 5/6 DT: tegra: add binding for the legacy interrupt controller
In reply to Marc Zyngier--- .../interrupt-controller/nvidia,tegra-ictlr.txt | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 Documentation/devicetree/bindings/interrupt-controller/nvidia,tegra-ictlr.txt
Documentation/devicetree/bindings/interrupt-controller/nvidia,tegra-ictlr.txt new file +43 -0
@@ -0,0 +1,43 @@ +NVIDIA Legacy Interrupt Controller + +All Tegra SoCs contain a legacy interrupt controller that routes +interrupts to the GIC, and also serves as a wakeup source. It is also +referred to as "ictlr", hence the name of the binding. + +The HW block exposes a number of interrupt controllers, each +implementing a set of 32 interrupts. + +Required properties: + +- compatible : should be: "nvidia,tegra<chip>-ictlr". The LIC on + subsequent SoCs remained backwards-compatible with Tegra30, so on + Tegra generations later than Tegra30 the compatible value should + include "nvidia,tegra30-ictlr". +- reg : Specifies base physical address and size of the registers. + Each controller must be described separately (Tegra20 has 4 of them, + whereas Tegra30 and later have 5" +- interrupt-controller : Identifies the node as an interrupt controller. +- #interrupt-cells : Specifies the number of cells needed to encode an + interrupt source. The value must be 3. +- interrupt-parent : a phandle to the GIC these interrupts are routed + to. + +Notes: + +- Because this HW ultimately routes interrupts to the GIC, the + interrupt specifier must be that of the GIC. +- Only SPIs can use the ictlr as an interrupt parent. SGIs and PPIs + are explicitly forbidden. + +Example: + + ictlr: interrupt-controller at 60004000 { + compatible = "nvidia,tegra20-ictlr", "nvidia,tegra-ictlr"; + reg = <0x60004000 64>, + <0x60004100 64>, + <0x60004200 64>, + <0x60004300 64>; + interrupt-controller; + #interrupt-cells = <3>; + interrupt-parent = <&intc>; + };
Signature · 1 line
2.1.4
PATCH v6 6/6 ARM: tegra: remove old LIC support
In reply to Marc ZyngierNow that all DTs have been updated, entierely drop support for the non-DT code.
This is likely to break platforms that do not update their DT, so print a warning at boot time.
--- arch/arm/mach-tegra/iomap.h | 15 ---- arch/arm/mach-tegra/irq.c | 201 +------------------------------------------- arch/arm/mach-tegra/irq.h | 6 -- 3 files changed, 2 insertions(+), 220 deletions(-)
arch/arm/mach-tegra/iomap.h +0 -15
@@ -31,21 +31,6 @@#define TEGRA_ARM_INT_DIST_BASE 0x50041000#define TEGRA_ARM_INT_DIST_SIZE SZ_4K -#define TEGRA_PRIMARY_ICTLR_BASE 0x60004000 -#define TEGRA_PRIMARY_ICTLR_SIZE SZ_64 - -#define TEGRA_SECONDARY_ICTLR_BASE 0x60004100 -#define TEGRA_SECONDARY_ICTLR_SIZE SZ_64 - -#define TEGRA_TERTIARY_ICTLR_BASE 0x60004200 -#define TEGRA_TERTIARY_ICTLR_SIZE SZ_64 - -#define TEGRA_QUATERNARY_ICTLR_BASE 0x60004300 -#define TEGRA_QUATERNARY_ICTLR_SIZE SZ_64 - -#define TEGRA_QUINARY_ICTLR_BASE 0x60004400 -#define TEGRA_QUINARY_ICTLR_SIZE SZ_64 -#define TEGRA_TMR1_BASE 0x60005000#define TEGRA_TMR1_SIZE SZ_8
arch/arm/mach-tegra/irq.c +2 -199
229 lines not on this page · raw message
arch/arm/mach-tegra/irq.h +0 -6
@@ -19,10 +19,4 @@bool tegra_pending_sgi (void ); -#ifdef CONFIG_PM_SLEEP -int tegra_legacy_irq_syscore_init (void ); -#else -static inline int tegra_legacy_irq_syscore_init (void ) {return 0 ; } -#endif -#endif
Signature · 1 line
2.1.4
v6 cover irqchip: Move Tegra LIC to use stacked domains
In reply to Marc ZyngierQuoted 58 lines · Marc Zyngier
This series is extracted from [4], which is trying to remove all traces of
gic_arch_extnfrom the tree. As some maintainers are more responsive than others (understatement of the year...), I've decided to split it per sub-arch, and get it moving, at least partially.This series addresses Tegra by moving its legacy interrupt controller support to
drivers/irqchipand implementing a stacked domain on top of the standard GIC.It is worth realizing that:
- I haven't been able to test this as much as I would have wanted to (it's only been tested on tegra2).
- This actively *breaks* existing setups. Once you boot a new kernel with an old DT, suspend/resume *will* be broken. Old kernels on a new DT won't even boot!
Based on 4.0-rc1.
* From v5: [5]
- Allow interrupt affinity to be changed* From v4: [4]
- Extracted from the full series
- Rebased on 4.0-rc1* From v3 [3]:
- Rebased on top of the patch working around hardcoded IRQ on OMAP4/5 [4]
- Fixed more iMX6 DTs (Stephan)
- Fixed Exynos4/5 DTs* From v2 [2]:
- Addressed numerous comments from Thierry
- Merged bug fixes from Nishanth
- Merged bug fix from Stefan* From v1 [1]:
- Rebased on 3.19-rc3
- Fixed a number of additional platforms
- Added crossbar conversion to stacked domains
- Merged bug fixes from Nishanth[5]: http://lists.infradead.org/pipermail/linux-arm-kernel/2015-February/325172.html
[4]: http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/317531.html
[3]: http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/315385.html
[2]: http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/314041.html
[1]: http://lists.infradead.org/pipermail/linux-arm-kernel/2014-November/307338.htmlMarc Zyngier (6):
ARM: tegra: irq: nuke leftovers from non-DT support
irqchip: tegra: add DT-based support for legacy interrupt controller
ARM: tegra: skipgic_arch_extnsetup if DT has a LIC node
ARM: tegra: update DTs to expose legacy interrupt controller
DT: tegra: add binding for the legacy interrupt controller
ARM: tegra: remove old LIC support
Quoted 14 lines
.../interrupt-controller/nvidia,tegra-ictlr.txt | 43 +++ arch/arm/boot/dts/tegra114.dtsi | 16 +- arch/arm/boot/dts/tegra124.dtsi | 16 +- arch/arm/boot/dts/tegra20.dtsi | 15 +- arch/arm/boot/dts/tegra30.dtsi | 16 +- arch/arm/mach-tegra/iomap.h | 15 - arch/arm/mach-tegra/irq.c | 209 +----------- arch/arm/mach-tegra/irq.h | 6 - arch/arm/mach-tegra/tegra.c | 1 - drivers/irqchip/Makefile | 1 + drivers/irqchip/irq-tegra.c | 371 +++++++++++++++++++++ 11 files changed, 482 insertions(+), 227 deletions(-) create mode 100644 Documentation/devicetree/bindings/interrupt-controller/nvidia,tegra-ictlr.txt create mode 100644 drivers/irqchip/irq-tegra.c
I've applied this series to irqchip/stacked-tegra to give it some time in -next.
thx,
Jason.