* [RFC PATCH 0/3] Yet another GIC OF binding series
@ 2011-08-09 20:16 Rob Herring
2011-08-25 21:49 ` [PATCH v2] ARM: gic: add OF based initialization Rob Herring
` (2 more replies)
0 siblings, 3 replies; 12+ messages in thread
From: Rob Herring @ 2011-08-09 20:16 UTC (permalink / raw)
To: grant.likely-s3s/WqlpOiPyB63q8FvJNQ
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
From: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
Grant,
Here's yet another patch series for GIC binding and init.
You keep saying we should have a common DT function scanning for interrupt
controller nodes and calling their initialization functions. But that will
not work until we have dynamic assignment of linux irq numbers. So either
everyone should just stop trying to do DT bindings for GIC/VIC until that
is in place, or we need an interim solution. This is another attempt at
the latter. I reworked gic_of_init intending for it to be the interrupt
controller specific initialization function that DT interrupt controller
scanning code would call. For now, it is just called by the platform code.
The platform initialization looks something like this:
struct of_intc_desc desc;
memset(&desc, 0, sizeof(desc));
desc.controller = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-gic");
gic_of_init(&desc);
I've addressed your previous comments and in particular initializing more
than 1 GIC is supported now.
Rob
Rob Herring (3):
dt: irq: add interrupt controller descriptor struct
ARM: gic: allow irq_start to be 0
ARM: gic: add OF based initialization
Documentation/devicetree/bindings/arm/gic.txt | 28 +++++++++++++++++++
arch/arm/common/gic.c | 36 ++++++++++++++++++++++++-
arch/arm/include/asm/hardware/gic.h | 2 +
include/linux/of_irq.h | 6 ++++
4 files changed, 71 insertions(+), 1 deletions(-)
create mode 100644 Documentation/devicetree/bindings/arm/gic.txt
--
1.7.4.1
^ permalink raw reply [flat|nested] 12+ messages in thread
* [RFC PATCH 1/3] dt: irq: add interrupt controller descriptor struct
[not found] ` <1312921020-6820-1-git-send-email-robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2011-08-09 20:16 ` Rob Herring
[not found] ` <1312921020-6820-2-git-send-email-robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-08-09 20:16 ` [RFC PATCH 2/3] ARM: gic: allow irq_start to be 0 Rob Herring
` (2 subsequent siblings)
3 siblings, 1 reply; 12+ messages in thread
From: Rob Herring @ 2011-08-09 20:16 UTC (permalink / raw)
To: grant.likely-s3s/WqlpOiPyB63q8FvJNQ
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
From: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
In preparation to scan and initialize interrupt controllers from a
device-tree, create struct to pass to interrupt controller initialization
functions.
irq_base should go away with dynamic linux irq assignment.
Signed-off-by: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
---
include/linux/of_irq.h | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
diff --git a/include/linux/of_irq.h b/include/linux/of_irq.h
index cd2e61c..de91ff9 100644
--- a/include/linux/of_irq.h
+++ b/include/linux/of_irq.h
@@ -33,6 +33,12 @@ struct of_irq {
u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */
};
+struct of_intc_desc {
+ struct device_node *controller;
+ struct device_node *parent;
+ int irq_base;
+};
+
/*
* Workarounds only applied to 32bit powermac machines
*/
--
1.7.4.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [RFC PATCH 2/3] ARM: gic: allow irq_start to be 0
[not found] ` <1312921020-6820-1-git-send-email-robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-08-09 20:16 ` [RFC PATCH 1/3] dt: irq: add interrupt controller descriptor struct Rob Herring
@ 2011-08-09 20:16 ` Rob Herring
2011-08-09 20:17 ` [RFC PATCH 3/3] ARM: gic: add OF based initialization Rob Herring
2011-09-03 13:34 ` [RFC PATCH 0/3] Yet another GIC OF binding series Thomas Abraham
3 siblings, 0 replies; 12+ messages in thread
From: Rob Herring @ 2011-08-09 20:16 UTC (permalink / raw)
To: grant.likely-s3s/WqlpOiPyB63q8FvJNQ
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
From: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
There's really no need to set irq_start per platform for the primary gic.
The SGIs and PPIs are not handled as normal irqs, so how irqs 0-31 are
setup doesn't really matter. So allow irq_start to be set to 0 to match
the linux irq numbering.
Signed-off-by: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
---
arch/arm/common/gic.c | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c
index 3227ca9..f13298e 100644
--- a/arch/arm/common/gic.c
+++ b/arch/arm/common/gic.c
@@ -353,7 +353,7 @@ void __init gic_init(unsigned int gic_nr, unsigned int irq_start,
gic = &gic_data[gic_nr];
gic->dist_base = dist_base;
gic->cpu_base = cpu_base;
- gic->irq_offset = (irq_start - 1) & ~31;
+ gic->irq_offset = irq_start ? (irq_start - 1) & ~31 : 0;
if (gic_nr == 0)
gic_cpu_base_addr = cpu_base;
--
1.7.4.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* [RFC PATCH 3/3] ARM: gic: add OF based initialization
[not found] ` <1312921020-6820-1-git-send-email-robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-08-09 20:16 ` [RFC PATCH 1/3] dt: irq: add interrupt controller descriptor struct Rob Herring
2011-08-09 20:16 ` [RFC PATCH 2/3] ARM: gic: allow irq_start to be 0 Rob Herring
@ 2011-08-09 20:17 ` Rob Herring
2011-08-10 8:08 ` Marc Zyngier
2011-09-03 13:34 ` [RFC PATCH 0/3] Yet another GIC OF binding series Thomas Abraham
3 siblings, 1 reply; 12+ messages in thread
From: Rob Herring @ 2011-08-09 20:17 UTC (permalink / raw)
To: grant.likely-s3s/WqlpOiPyB63q8FvJNQ
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
From: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
This adds gic initialization using device tree data. An example device tree
binding looks like this:
intc: interrupt-controller@fff11000 {
compatible = "arm,cortex-a9-gic";
#interrupt-cells = <1>;
interrupt-controller;
reg = <0xfff11000 0x1000>,
<0xfff10100 0x100>;
};
Signed-off-by: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
---
Documentation/devicetree/bindings/arm/gic.txt | 28 ++++++++++++++++++++
arch/arm/common/gic.c | 34 +++++++++++++++++++++++++
arch/arm/include/asm/hardware/gic.h | 2 +
3 files changed, 64 insertions(+), 0 deletions(-)
create mode 100644 Documentation/devicetree/bindings/arm/gic.txt
diff --git a/Documentation/devicetree/bindings/arm/gic.txt b/Documentation/devicetree/bindings/arm/gic.txt
new file mode 100644
index 0000000..78012e3
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/gic.txt
@@ -0,0 +1,28 @@
+* ARM Generic Interrupt Controller
+
+Some ARM cores have an interrupt controller called GIC. The ARM GIC
+representation in the device tree should be done as under:-
+
+Required properties:
+
+- compatible : should be one of:
+ "arm,cortex-a9-gic"
+ "arm,arm11mp-gic"
+- interrupt-controller : Identifies the node as an interrupt controller
+- #interrupt-cells : Specifies the number of cells needed to encode an
+ interrupt source. The type shall be a <u32> and the value shall be 1.
+- reg : Specifies base physical address(s) and size of the GIC registers. The
+ first 2 values are the GIC distributor register base and size. The 2nd 2
+ values are the GIC cpu interface register base and size.
+
+Example:
+
+intc: interrupt-controller@fff11000 {
+ compatible = "arm,cortex-a9-gic";
+ #interrupt-cells = <1>;
+ interrupt-controller;
+ reg = <0xfff11000 0x1000>,
+ <0xfff10100 0x100>;
+};
+
+
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c
index f13298e..0626bb7 100644
--- a/arch/arm/common/gic.c
+++ b/arch/arm/common/gic.c
@@ -28,6 +28,10 @@
#include <linux/smp.h>
#include <linux/cpumask.h>
#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/irqdomain.h>
#include <asm/irq.h>
#include <asm/mach/irq.h>
@@ -394,3 +398,33 @@ void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
writel_relaxed(map << 16 | irq, gic_data[0].dist_base + GIC_DIST_SOFTINT);
}
#endif
+
+#ifdef CONFIG_OF
+static int gic_cnt __initdata = 0;
+
+void __init gic_of_init(struct of_intc_desc *d)
+{
+ struct device_node *np = d->controller;
+ void __iomem *cpu_base;
+ void __iomem *dist_base;
+ int irq;
+
+ if (WARN_ON(!d || !d->controller))
+ return;
+
+ dist_base = of_iomap(np, 0);
+ WARN(!dist_base, "unable to map gic dist registers\n");
+
+ cpu_base = of_iomap(np, 1);
+ WARN(!cpu_base, "unable to map gic cpu registers\n");
+
+ gic_init(gic_cnt, d->irq_base, dist_base, cpu_base);
+ irq_domain_add_simple(d->controller, d->irq_base);
+
+ if (d->parent) {
+ irq = irq_of_parse_and_map(np, 0);
+ gic_cascade_irq(gic_cnt, irq);
+ }
+ gic_cnt++;
+}
+#endif
diff --git a/arch/arm/include/asm/hardware/gic.h b/arch/arm/include/asm/hardware/gic.h
index 435d3f8..64ef90d 100644
--- a/arch/arm/include/asm/hardware/gic.h
+++ b/arch/arm/include/asm/hardware/gic.h
@@ -37,6 +37,8 @@ extern void __iomem *gic_cpu_base_addr;
extern struct irq_chip gic_arch_extn;
void gic_init(unsigned int, unsigned int, void __iomem *, void __iomem *);
+struct of_intc_desc;
+void gic_of_init(struct of_intc_desc *d);
void gic_secondary_init(unsigned int);
void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);
void gic_raise_softirq(const struct cpumask *mask, unsigned int irq);
--
1.7.4.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [RFC PATCH 3/3] ARM: gic: add OF based initialization
2011-08-09 20:17 ` [RFC PATCH 3/3] ARM: gic: add OF based initialization Rob Herring
@ 2011-08-10 8:08 ` Marc Zyngier
[not found] ` <4E423C98.3040305-5wv7dgnIgG8@public.gmane.org>
0 siblings, 1 reply; 12+ messages in thread
From: Marc Zyngier @ 2011-08-10 8:08 UTC (permalink / raw)
To: Rob Herring
Cc: devicetree-discuss@lists.ozlabs.org, Rob Herring,
grant.likely@secretlab.ca, thomas.abraham@linaro.org,
jamie@jamieiles.com, linux-arm-kernel@lists.infradead.org
On 09/08/11 21:17, Rob Herring wrote:
> From: Rob Herring <rob.herring@calxeda.com>
>
> This adds gic initialization using device tree data. An example device tree
> binding looks like this:
>
> intc: interrupt-controller@fff11000 {
> compatible = "arm,cortex-a9-gic";
> #interrupt-cells = <1>;
> interrupt-controller;
> reg = <0xfff11000 0x1000>,
> <0xfff10100 0x100>;
> };
I'm afraid I still object to this. PPIs are an important part of the
GIC, and this binding totally ignores the per-cpu aspect.
How do you represent the connection between a CPU local timer and the
GIC? Even worse, how to represent a device connected to only *one* of
the CPUs? PPIs are difficult to represent on the Linux side. But we
shouldn't ignore them in the DT binding.
Cheers,
M.
--
Jazz is not dead. It just smells funny...
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC PATCH 1/3] dt: irq: add interrupt controller descriptor struct
[not found] ` <1312921020-6820-2-git-send-email-robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
@ 2011-08-10 13:14 ` Jamie Iles
2011-08-10 13:23 ` Rob Herring
0 siblings, 1 reply; 12+ messages in thread
From: Jamie Iles @ 2011-08-10 13:14 UTC (permalink / raw)
To: Rob Herring
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
On Tue, Aug 09, 2011 at 03:16:58PM -0500, Rob Herring wrote:
> From: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
>
> In preparation to scan and initialize interrupt controllers from a
> device-tree, create struct to pass to interrupt controller initialization
> functions.
>
> irq_base should go away with dynamic linux irq assignment.
>
> Signed-off-by: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
> ---
> include/linux/of_irq.h | 6 ++++++
> 1 files changed, 6 insertions(+), 0 deletions(-)
>
> diff --git a/include/linux/of_irq.h b/include/linux/of_irq.h
> index cd2e61c..de91ff9 100644
> --- a/include/linux/of_irq.h
> +++ b/include/linux/of_irq.h
> @@ -33,6 +33,12 @@ struct of_irq {
> u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */
> };
>
> +struct of_intc_desc {
> + struct device_node *controller;
> + struct device_node *parent;
Do we need parent here? I think that of_irq_find_parent() will do the
job.
Other than that nit the series looks nice to me.
Jamie
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC PATCH 1/3] dt: irq: add interrupt controller descriptor struct
2011-08-10 13:14 ` Jamie Iles
@ 2011-08-10 13:23 ` Rob Herring
0 siblings, 0 replies; 12+ messages in thread
From: Rob Herring @ 2011-08-10 13:23 UTC (permalink / raw)
To: Jamie Iles
Cc: grant.likely, marc.zyngier, devicetree-discuss, thomas.abraham,
linux-arm-kernel
On 08/10/2011 08:14 AM, Jamie Iles wrote:
> On Tue, Aug 09, 2011 at 03:16:58PM -0500, Rob Herring wrote:
>> From: Rob Herring <rob.herring@calxeda.com>
>>
>> In preparation to scan and initialize interrupt controllers from a
>> device-tree, create struct to pass to interrupt controller initialization
>> functions.
>>
>> irq_base should go away with dynamic linux irq assignment.
>>
>> Signed-off-by: Rob Herring <rob.herring@calxeda.com>
>> ---
>> include/linux/of_irq.h | 6 ++++++
>> 1 files changed, 6 insertions(+), 0 deletions(-)
>>
>> diff --git a/include/linux/of_irq.h b/include/linux/of_irq.h
>> index cd2e61c..de91ff9 100644
>> --- a/include/linux/of_irq.h
>> +++ b/include/linux/of_irq.h
>> @@ -33,6 +33,12 @@ struct of_irq {
>> u32 specifier[OF_MAX_IRQ_SPEC]; /* Specifier copy */
>> };
>>
>> +struct of_intc_desc {
>> + struct device_node *controller;
>> + struct device_node *parent;
>
> Do we need parent here? I think that of_irq_find_parent() will do the
> job.
>
With interrupt controller scanning code, it will avoid calling
of_irq_find_parent twice. That code will have to maintain a list of
nodes and parents anyway in order to initialize controllers with no
parent first.
Rob
> Other than that nit the series looks nice to me.
>
> Jamie
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC PATCH 3/3] ARM: gic: add OF based initialization
[not found] ` <4E423C98.3040305-5wv7dgnIgG8@public.gmane.org>
@ 2011-08-10 18:30 ` Rob Herring
0 siblings, 0 replies; 12+ messages in thread
From: Rob Herring @ 2011-08-10 18:30 UTC (permalink / raw)
To: Marc Zyngier
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org,
Rob Herring,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
On 08/10/2011 03:08 AM, Marc Zyngier wrote:
> On 09/08/11 21:17, Rob Herring wrote:
>> From: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
>>
>> This adds gic initialization using device tree data. An example device tree
>> binding looks like this:
>>
>> intc: interrupt-controller@fff11000 {
>> compatible = "arm,cortex-a9-gic";
>> #interrupt-cells = <1>;
>> interrupt-controller;
>> reg = <0xfff11000 0x1000>,
>> <0xfff10100 0x100>;
>> };
>
> I'm afraid I still object to this. PPIs are an important part of the
> GIC, and this binding totally ignores the per-cpu aspect.
BTW, we've already got 2 flavors of gic bindings in the dts files.
> How do you represent the connection between a CPU local timer and the
> GIC? Even worse, how to represent a device connected to only *one* of
> the CPUs? PPIs are difficult to represent on the Linux side. But we
> shouldn't ignore them in the DT binding.
>
Do you have an updated gic binding patchset based on your latest PPI
patch series?
This problem also extends to the TWD itself. How do we represent that?
Is it 1 node per core or 1 node total. Then is timer and watchdog in 1
node, or is it split to separate nodes?
Rob
^ permalink raw reply [flat|nested] 12+ messages in thread
* [PATCH v2] ARM: gic: add OF based initialization
2011-08-09 20:16 [RFC PATCH 0/3] Yet another GIC OF binding series Rob Herring
@ 2011-08-25 21:49 ` Rob Herring
2011-08-26 2:37 ` Rob Herring
2011-08-30 3:26 ` [RFC PATCH 0/3] Yet another GIC OF binding series Shawn Guo
[not found] ` <1312921020-6820-1-git-send-email-robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2 siblings, 1 reply; 12+ messages in thread
From: Rob Herring @ 2011-08-25 21:49 UTC (permalink / raw)
To: linux-arm-kernel, devicetree-discuss
Cc: marc.zyngier, Rob Herring, grant.likely, thomas.abraham, jamie,
shawn.guo
From: Rob Herring <rob.herring@calxeda.com>
This adds gic initialization using device tree data. The initialization
functions are intended to be called by a generic OF interrupt
controller parsing function once the right pieces are in place.
PPI binding support based on work by Marc Zyngier.
Signed-off-by: Rob Herring <rob.herring@calxeda.com>
---
Changes in v2:
- Add bindings and documentation for PPI
- change interrupt-cells to 2
- Move init of np pointer to after intc_desc ptr NULL check
Documentation/devicetree/bindings/arm/gic.txt | 62 +++++++++++++++++++++++++
arch/arm/common/gic.c | 41 ++++++++++++++++
arch/arm/include/asm/hardware/gic.h | 3 +
3 files changed, 106 insertions(+), 0 deletions(-)
create mode 100644 Documentation/devicetree/bindings/arm/gic.txt
diff --git a/Documentation/devicetree/bindings/arm/gic.txt b/Documentation/devicetree/bindings/arm/gic.txt
new file mode 100644
index 0000000..85be7c9
--- /dev/null
+++ b/Documentation/devicetree/bindings/arm/gic.txt
@@ -0,0 +1,62 @@
+* ARM Generic Interrupt Controller
+
+ARM SMP cores are often associated with a GIC, providing per processor
+interrupts (PPI), shared processor interrupts (SPI) and software
+generated interrupts (SGI).
+
+Primary GIC is attached directly to the CPU and typically has PPIs. Secondary GICs are
+cascaded into the upward interrupt controller and do not have PPIs.
+
+Main node required properties:
+
+- compatible : should be one of:
+ "arm,cortex-a9-gic"
+ "arm,arm11mp-gic"
+- interrupt-controller : Identifies the node as an interrupt controller
+- #interrupt-cells : Specifies the number of cells needed to encode an
+ interrupt source. The type shall be a <u32> and the value shall be 2.
+- reg : Specifies base physical address(s) and size of the GIC registers. The
+ first 2 values are the GIC distributor register base and size. The 2nd 2
+ values are the GIC cpu interface register base and size.
+- #size-cells : Shall be <0> as PPIs don't have size for reg property. Optional
+ for secondary GICs.
+
+Optional
+- interrupts : optional, used on secondary GICs only
+
+PPI sub-nodes required properties:
+
+- compatible : should match the main node with "-ppi" appended. one of:
+ "arm,cortex-a9-gic-ppi"
+ "arm,arm11mp-gic-ppi"
+- interrupt-controller : Identifies the node as an interrupt controller
+- #interrupt-cells : Specifies the number of cells needed to encode an
+ interrupt source. The type shall be a <u32> and the value shall be 1 as PPIs
+ don't have edge/level settings.
+- reg : Specifies cpu number the PPIs are attached to.
+
+Example:
+
+ intc: interrupt-controller@fff11000 {
+ compatible = "arm,cortex-a9-gic";
+ #interrupt-cells = <2>;
+ #size-cells = <0>;
+ #address-cells = <1>;
+ interrupt-controller;
+ reg = <0xfff11000 0x1000>,
+ <0xfff10100 0x100>;
+
+ gicppi0: gic-ppi@0 {
+ compatible = "arm,cortex-a9-gic-ppi";
+ #interrupt-cells = <1>;
+ interrupt-controller;
+ reg = <0>;
+ };
+ gicppi1: gic-ppi@1 {
+ compatible = "arm,cortex-a9-gic-ppi";
+ #interrupt-cells = <1>;
+ interrupt-controller;
+ reg = <1>;
+ };
+ };
+
diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c
index f13298e..a796299 100644
--- a/arch/arm/common/gic.c
+++ b/arch/arm/common/gic.c
@@ -28,6 +28,10 @@
#include <linux/smp.h>
#include <linux/cpumask.h>
#include <linux/io.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/of_irq.h>
+#include <linux/irqdomain.h>
#include <asm/irq.h>
#include <asm/mach/irq.h>
@@ -394,3 +398,40 @@ void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
writel_relaxed(map << 16 | irq, gic_data[0].dist_base + GIC_DIST_SOFTINT);
}
#endif
+
+#ifdef CONFIG_OF
+static int gic_cnt __initdata = 0;
+
+void __init gic_of_init(struct of_intc_desc *d)
+{
+ struct device_node *np;
+ void __iomem *cpu_base;
+ void __iomem *dist_base;
+ int irq;
+
+ if (WARN_ON(!d || !d->controller))
+ return;
+
+ np = d->controller;
+ dist_base = of_iomap(np, 0);
+ WARN(!dist_base, "unable to map gic dist registers\n");
+
+ cpu_base = of_iomap(np, 1);
+ WARN(!cpu_base, "unable to map gic cpu registers\n");
+
+ gic_init(gic_cnt, d->irq_base, dist_base, cpu_base);
+ irq_domain_add_simple(d->controller, d->irq_base);
+
+ if (d->parent) {
+ irq = irq_of_parse_and_map(np, 0);
+ gic_cascade_irq(gic_cnt, irq);
+ }
+ gic_cnt++;
+}
+
+void __init gic_of_ppi_init(struct of_intc_desc *d)
+{
+ irq_domain_add_simple(d->controller, d->irq_base);
+}
+
+#endif
diff --git a/arch/arm/include/asm/hardware/gic.h b/arch/arm/include/asm/hardware/gic.h
index 435d3f8..a6594d4 100644
--- a/arch/arm/include/asm/hardware/gic.h
+++ b/arch/arm/include/asm/hardware/gic.h
@@ -37,6 +37,9 @@ extern void __iomem *gic_cpu_base_addr;
extern struct irq_chip gic_arch_extn;
void gic_init(unsigned int, unsigned int, void __iomem *, void __iomem *);
+struct of_intc_desc;
+void gic_of_init(struct of_intc_desc *d);
+void gic_of_ppi_init(struct of_intc_desc *d);
void gic_secondary_init(unsigned int);
void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);
void gic_raise_softirq(const struct cpumask *mask, unsigned int irq);
--
1.7.4.1
^ permalink raw reply related [flat|nested] 12+ messages in thread
* Re: [PATCH v2] ARM: gic: add OF based initialization
2011-08-25 21:49 ` [PATCH v2] ARM: gic: add OF based initialization Rob Herring
@ 2011-08-26 2:37 ` Rob Herring
0 siblings, 0 replies; 12+ messages in thread
From: Rob Herring @ 2011-08-26 2:37 UTC (permalink / raw)
To: linux-arm-kernel, devicetree-discuss
Cc: marc.zyngier, Rob Herring, grant.likely, thomas.abraham, jamie,
shawn.guo
On 08/25/2011 04:49 PM, Rob Herring wrote:
> From: Rob Herring <rob.herring@calxeda.com>
>
> This adds gic initialization using device tree data. The initialization
> functions are intended to be called by a generic OF interrupt
> controller parsing function once the right pieces are in place.
>
> PPI binding support based on work by Marc Zyngier.
>
> Signed-off-by: Rob Herring <rob.herring@calxeda.com>
> ---
> Changes in v2:
> - Add bindings and documentation for PPI
> - change interrupt-cells to 2
> - Move init of np pointer to after intc_desc ptr NULL check
>
> Documentation/devicetree/bindings/arm/gic.txt | 62 +++++++++++++++++++++++++
> arch/arm/common/gic.c | 41 ++++++++++++++++
> arch/arm/include/asm/hardware/gic.h | 3 +
> 3 files changed, 106 insertions(+), 0 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/arm/gic.txt
>
> diff --git a/Documentation/devicetree/bindings/arm/gic.txt b/Documentation/devicetree/bindings/arm/gic.txt
> new file mode 100644
> index 0000000..85be7c9
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/arm/gic.txt
> @@ -0,0 +1,62 @@
> +* ARM Generic Interrupt Controller
> +
> +ARM SMP cores are often associated with a GIC, providing per processor
> +interrupts (PPI), shared processor interrupts (SPI) and software
> +generated interrupts (SGI).
> +
> +Primary GIC is attached directly to the CPU and typically has PPIs. Secondary GICs are
> +cascaded into the upward interrupt controller and do not have PPIs.
> +
> +Main node required properties:
> +
> +- compatible : should be one of:
> + "arm,cortex-a9-gic"
> + "arm,arm11mp-gic"
> +- interrupt-controller : Identifies the node as an interrupt controller
> +- #interrupt-cells : Specifies the number of cells needed to encode an
> + interrupt source. The type shall be a <u32> and the value shall be 2.
I need to add the following level sense info. I'm using the same values
as IRQF_TRIGGER_* as suggested by Grant.
The 2nd cell contains the level-sense information, encoded as follows:
1 = low-to-high edge triggered
2 = high-to-low edge triggered
4 = active high level-sensitive
8 = active low level-sensitive
> +- reg : Specifies base physical address(s) and size of the GIC registers. The
> + first 2 values are the GIC distributor register base and size. The 2nd 2
> + values are the GIC cpu interface register base and size.
> +- #size-cells : Shall be <0> as PPIs don't have size for reg property. Optional
> + for secondary GICs.
> +
> +Optional
> +- interrupts : optional, used on secondary GICs only
> +
> +PPI sub-nodes required properties:
> +
> +- compatible : should match the main node with "-ppi" appended. one of:
> + "arm,cortex-a9-gic-ppi"
> + "arm,arm11mp-gic-ppi"
> +- interrupt-controller : Identifies the node as an interrupt controller
> +- #interrupt-cells : Specifies the number of cells needed to encode an
> + interrupt source. The type shall be a <u32> and the value shall be 1 as PPIs
> + don't have edge/level settings.
> +- reg : Specifies cpu number the PPIs are attached to.
> +
> +Example:
> +
> + intc: interrupt-controller@fff11000 {
> + compatible = "arm,cortex-a9-gic";
> + #interrupt-cells = <2>;
> + #size-cells = <0>;
> + #address-cells = <1>;
> + interrupt-controller;
> + reg = <0xfff11000 0x1000>,
> + <0xfff10100 0x100>;
> +
> + gicppi0: gic-ppi@0 {
> + compatible = "arm,cortex-a9-gic-ppi";
> + #interrupt-cells = <1>;
> + interrupt-controller;
> + reg = <0>;
> + };
> + gicppi1: gic-ppi@1 {
> + compatible = "arm,cortex-a9-gic-ppi";
> + #interrupt-cells = <1>;
> + interrupt-controller;
> + reg = <1>;
> + };
> + };
> +
> diff --git a/arch/arm/common/gic.c b/arch/arm/common/gic.c
> index f13298e..a796299 100644
> --- a/arch/arm/common/gic.c
> +++ b/arch/arm/common/gic.c
> @@ -28,6 +28,10 @@
> #include <linux/smp.h>
> #include <linux/cpumask.h>
> #include <linux/io.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +#include <linux/of_irq.h>
> +#include <linux/irqdomain.h>
>
> #include <asm/irq.h>
> #include <asm/mach/irq.h>
> @@ -394,3 +398,40 @@ void gic_raise_softirq(const struct cpumask *mask, unsigned int irq)
> writel_relaxed(map << 16 | irq, gic_data[0].dist_base + GIC_DIST_SOFTINT);
> }
> #endif
> +
> +#ifdef CONFIG_OF
> +static int gic_cnt __initdata = 0;
> +
> +void __init gic_of_init(struct of_intc_desc *d)
> +{
> + struct device_node *np;
> + void __iomem *cpu_base;
> + void __iomem *dist_base;
> + int irq;
> +
> + if (WARN_ON(!d || !d->controller))
> + return;
> +
> + np = d->controller;
> + dist_base = of_iomap(np, 0);
> + WARN(!dist_base, "unable to map gic dist registers\n");
> +
> + cpu_base = of_iomap(np, 1);
> + WARN(!cpu_base, "unable to map gic cpu registers\n");
> +
> + gic_init(gic_cnt, d->irq_base, dist_base, cpu_base);
> + irq_domain_add_simple(d->controller, d->irq_base);
> +
> + if (d->parent) {
> + irq = irq_of_parse_and_map(np, 0);
> + gic_cascade_irq(gic_cnt, irq);
> + }
> + gic_cnt++;
> +}
> +
> +void __init gic_of_ppi_init(struct of_intc_desc *d)
> +{
> + irq_domain_add_simple(d->controller, d->irq_base);
> +}
> +
> +#endif
> diff --git a/arch/arm/include/asm/hardware/gic.h b/arch/arm/include/asm/hardware/gic.h
> index 435d3f8..a6594d4 100644
> --- a/arch/arm/include/asm/hardware/gic.h
> +++ b/arch/arm/include/asm/hardware/gic.h
> @@ -37,6 +37,9 @@ extern void __iomem *gic_cpu_base_addr;
> extern struct irq_chip gic_arch_extn;
>
> void gic_init(unsigned int, unsigned int, void __iomem *, void __iomem *);
> +struct of_intc_desc;
> +void gic_of_init(struct of_intc_desc *d);
> +void gic_of_ppi_init(struct of_intc_desc *d);
> void gic_secondary_init(unsigned int);
> void gic_cascade_irq(unsigned int gic_nr, unsigned int irq);
> void gic_raise_softirq(const struct cpumask *mask, unsigned int irq);
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC PATCH 0/3] Yet another GIC OF binding series
2011-08-09 20:16 [RFC PATCH 0/3] Yet another GIC OF binding series Rob Herring
2011-08-25 21:49 ` [PATCH v2] ARM: gic: add OF based initialization Rob Herring
@ 2011-08-30 3:26 ` Shawn Guo
[not found] ` <1312921020-6820-1-git-send-email-robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2 siblings, 0 replies; 12+ messages in thread
From: Shawn Guo @ 2011-08-30 3:26 UTC (permalink / raw)
To: Rob Herring
Cc: marc.zyngier, devicetree-discuss, Rob Herring, grant.likely,
thomas.abraham, jamie, linux-arm-kernel
On Tue, Aug 09, 2011 at 03:16:57PM -0500, Rob Herring wrote:
> From: Rob Herring <rob.herring@calxeda.com>
>
> Grant,
>
> Here's yet another patch series for GIC binding and init.
>
> You keep saying we should have a common DT function scanning for interrupt
> controller nodes and calling their initialization functions. But that will
> not work until we have dynamic assignment of linux irq numbers. So either
> everyone should just stop trying to do DT bindings for GIC/VIC until that
> is in place, or we need an interim solution.
Yes, we need a way out. I based my i.MX6Q series on this patch set.
With the v2 of "ARM: gic: add OF based initialization" in,
Acked-by: Shawn Guo <shawn.guo@linaro.org>
Tested-by: Shawn Guo <shawn.guo@linaro.org>
Regards,
Shawn
> This is another attempt at
> the latter. I reworked gic_of_init intending for it to be the interrupt
> controller specific initialization function that DT interrupt controller
> scanning code would call. For now, it is just called by the platform code.
> The platform initialization looks something like this:
>
> struct of_intc_desc desc;
> memset(&desc, 0, sizeof(desc));
> desc.controller = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-gic");
> gic_of_init(&desc);
>
> I've addressed your previous comments and in particular initializing more
> than 1 GIC is supported now.
>
> Rob
>
> Rob Herring (3):
> dt: irq: add interrupt controller descriptor struct
> ARM: gic: allow irq_start to be 0
> ARM: gic: add OF based initialization
>
> Documentation/devicetree/bindings/arm/gic.txt | 28 +++++++++++++++++++
> arch/arm/common/gic.c | 36 ++++++++++++++++++++++++-
> arch/arm/include/asm/hardware/gic.h | 2 +
> include/linux/of_irq.h | 6 ++++
> 4 files changed, 71 insertions(+), 1 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/arm/gic.txt
>
> --
> 1.7.4.1
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel@lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: [RFC PATCH 0/3] Yet another GIC OF binding series
[not found] ` <1312921020-6820-1-git-send-email-robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
` (2 preceding siblings ...)
2011-08-09 20:17 ` [RFC PATCH 3/3] ARM: gic: add OF based initialization Rob Herring
@ 2011-09-03 13:34 ` Thomas Abraham
3 siblings, 0 replies; 12+ messages in thread
From: Thomas Abraham @ 2011-09-03 13:34 UTC (permalink / raw)
To: Rob Herring
Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ, Rob Herring,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r
On 10 August 2011 01:46, Rob Herring <robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
> From: Rob Herring <rob.herring-bsGFqQB8/DxBDgjK7y7TUQ@public.gmane.org>
>
> Grant,
>
> Here's yet another patch series for GIC binding and init.
>
> You keep saying we should have a common DT function scanning for interrupt
> controller nodes and calling their initialization functions. But that will
> not work until we have dynamic assignment of linux irq numbers. So either
> everyone should just stop trying to do DT bindings for GIC/VIC until that
> is in place, or we need an interim solution. This is another attempt at
> the latter. I reworked gic_of_init intending for it to be the interrupt
> controller specific initialization function that DT interrupt controller
> scanning code would call. For now, it is just called by the platform code.
> The platform initialization looks something like this:
>
> struct of_intc_desc desc;
> memset(&desc, 0, sizeof(desc));
> desc.controller = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-gic");
> gic_of_init(&desc);
>
> I've addressed your previous comments and in particular initializing more
> than 1 GIC is supported now.
Works fine for Exynos4.
Tested-by: Thomas Abraham <thomas.abraham-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
>
> Rob
>
> Rob Herring (3):
> dt: irq: add interrupt controller descriptor struct
> ARM: gic: allow irq_start to be 0
> ARM: gic: add OF based initialization
>
> Documentation/devicetree/bindings/arm/gic.txt | 28 +++++++++++++++++++
> arch/arm/common/gic.c | 36 ++++++++++++++++++++++++-
> arch/arm/include/asm/hardware/gic.h | 2 +
> include/linux/of_irq.h | 6 ++++
> 4 files changed, 71 insertions(+), 1 deletions(-)
> create mode 100644 Documentation/devicetree/bindings/arm/gic.txt
>
> --
> 1.7.4.1
>
>
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2011-09-03 13:34 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-08-09 20:16 [RFC PATCH 0/3] Yet another GIC OF binding series Rob Herring
2011-08-25 21:49 ` [PATCH v2] ARM: gic: add OF based initialization Rob Herring
2011-08-26 2:37 ` Rob Herring
2011-08-30 3:26 ` [RFC PATCH 0/3] Yet another GIC OF binding series Shawn Guo
[not found] ` <1312921020-6820-1-git-send-email-robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-08-09 20:16 ` [RFC PATCH 1/3] dt: irq: add interrupt controller descriptor struct Rob Herring
[not found] ` <1312921020-6820-2-git-send-email-robherring2-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2011-08-10 13:14 ` Jamie Iles
2011-08-10 13:23 ` Rob Herring
2011-08-09 20:16 ` [RFC PATCH 2/3] ARM: gic: allow irq_start to be 0 Rob Herring
2011-08-09 20:17 ` [RFC PATCH 3/3] ARM: gic: add OF based initialization Rob Herring
2011-08-10 8:08 ` Marc Zyngier
[not found] ` <4E423C98.3040305-5wv7dgnIgG8@public.gmane.org>
2011-08-10 18:30 ` Rob Herring
2011-09-03 13:34 ` [RFC PATCH 0/3] Yet another GIC OF binding series Thomas Abraham
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).