All of lore.kernel.org
 help / color / mirror / Atom feed
From: Grant Likely <grant.likely@secretlab.ca>
To: Rob Herring <robherring2@gmail.com>
Cc: "Cousson, Benoit" <b-cousson@ti.com>,
	Thomas Abraham <thomas.abraham@linaro.org>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>,
	"devicetree-discuss@lists.ozlabs.org" 
	<devicetree-discuss@lists.ozlabs.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"marc.zyngier@arm.com" <marc.zyngier@arm.com>,
	"jamie@jamieiles.com" <jamie@jamieiles.com>,
	"shawn.guo@linaro.org" <shawn.guo@linaro.org>,
	Rob Herring <rob.herring@calxeda.com>
Subject: Re: [PATCH 5/5] ARM: gic: add OF based initialization
Date: Mon, 19 Sep 2011 15:14:54 -0600	[thread overview]
Message-ID: <CACxGe6v9nd5f5x-eu9hUyAqdS1+p3h6ixyutECYLdNo3ewDH0w@mail.gmail.com> (raw)
In-Reply-To: <4E774847.3020104@gmail.com>

On Mon, Sep 19, 2011 at 7:48 AM, Rob Herring <robherring2@gmail.com> wrote:
> On 09/19/2011 07:09 AM, Cousson, Benoit wrote:
>> On 9/18/2011 11:23 PM, Rob Herring wrote:
>>> I was headed down the path of implementing the 2nd option above,
>>> but had a dilemma. What would be the numbering base for PPIs in
>>> this case? Should it be 0 in the DT as proposed for SPIs or does it
>>> stay at 16?
>>
>> Both SGI and PPI are internal to the CortexA9 MP core, and referring
>> to the CortexA9 MP core TRM [1], you can see that the PPI# -> ID#
>> mapping is already documented: - Private timer, PPI(2) Each Cortex-A9
>> processor has its own private timers that can generate interrupts,
>> using ID29. - Watchdog timers, PPI(3) Each Cortex-A9 processor has
>> its own watchdog timers that can generate interrupts, using ID30.
>>
>> So in that case, it can makes sense to use the ID. But it is
>> interesting to note that the PPI is identified with a 0 based index
>> number.
>>
> It's even worse than I thought: we could use 13 (ID16 == PPI0), 29 or 2
> for the timer interrupt. The first would match 0 based SPI convention.
> The last 2 would both match the documentation. We could never use 2 as
> this will for sure be different and the GIC code will have no way to
> know how to do the translation to ID. The only sane choice is using the
> ID as you say.
>
> But you can't have it both ways. It does not make sense to use the ID
> for some interrupts and a different scheme for others.

Hmmm, it seems to me that some orthogonal issues are getting
conflated.  Specifically, the binding vs. what the GIC driver using
internally.  For my own understanding, let me see if I can summarize
and clarify the problem.

Each GIC IRQ is represented in 5 different ways:
1) the hardware documentation (PPI[0-15] or SPI[988] input pin)
2) The DT binding to represent the connection.
3) The Interrupt ID as specified by the GIC architecture reference[1]
(SGI:[0-15], PPI:[16-31], SPI:[32-1019], special:[1020-1023])
4) The internal HWIRQ representation used by the GIC driver
5) The Linux VIRQ number that #4 maps to.

[1] http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0048b/BCGBFHCH.html

Some thoughts:
- Generally the DT binding (#2) should reflect the HW view of the
system (#1) since that is the number most likely to be represented in
hardware manuals.  The interrupt ID is an internal detail of the GIC,
and isn't really exposed in the block diagram of the hardware.
- Presumably it is preferable for the GIC to directly use the
Interrupt ID (#3) as the HWIRQ number (#4) because it is the most
efficient from an interrupt handling perspective, and indeed this is
currently what the GIC driver does.
- Translation between the DT binding (#2) and the Interrupt ID / HWIRQ
(#3/#4) is trivial, and easily managed by the GIC's irq_domain.
- Though not necessarily as trivial, the mapping between Linux VIRQ
and HWIRQ is not fixed, and when migrating to DT it should be assumed
to be assigned at runtime.  Perhaps not so important for a core IRQ
controller like the GIC (as opposed to an i2c irq expander), but
assuming an fixed offset still should be avoided.  We may still force
a SPI0->VIRQ32 on the root GIC as an optimization, but it is not
necessary and the driver still needs to support remapping for a
secondary GIC.

So, for the GIC DT binding, I'm inclined to agree with Benoit that the
binding should reflect the hardware connections, not the values used
by software for decoding IRQs.  Also, I see absolutely no need to use
separate nodes for each GIC interrupt space.  The DT interrupt
specifier number space can more than handle the features of the GIC in
a clear and concise manor.  So, here's my counter proposal for a GIC
bindings (using Rob's text as the starting point):

----

* 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 and SGIs.
Secondary GICs are cascaded into the upward interrupt controller and do not
have PPIs or SGIs.

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 3.

  The 1st cell is the interrupt type; 0 for SPI interrupts, 1 for PPI
interrupts.
  The 2nd cell contains the interrupt number for the interrupt type.
SPI interrupts are in the range [0-987].  PPI interrupts are in the
range [0-15].
  The 3rd cell is the flags, encoded as follows:
        bits[3:0] trigger type and level flags.
                    1 = low-to-high edge triggered
                    2 = high-to-low edge triggered
                    4 = active high level-sensitive
                    8 = active low level-sensitive
        bits[15:8] PPI interrupt cpu mask.  Each bit corresponds to
each of the 8 possible cpus attached to the GIC.  A bit set to '1'
indicated the interrupt is wired to that CPU.  Only valid for PPI
interrupts.

(Alternately, if there is no need for a CPU mask because PPI
interrupts will never be wired to more than one CPU, then it would be
better to encode the CPU number into the second cell with the SPI
number).

- 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.

Optional
- interrupts   : Interrupt source of the parent interrupt controller. Only
  present on secondary GICs.

Example:
       intc: interrupt-controller@fff11000 {
               compatible = "arm,cortex-a9-gic";
               #interrupt-cells = <3>;
               #address-cells = <1>;
               interrupt-controller;
               reg = <0xfff11000 0x1000>,
                     <0xfff10100 0x100>;
       };

WARNING: multiple messages have this Message-ID (diff)
From: grant.likely@secretlab.ca (Grant Likely)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 5/5] ARM: gic: add OF based initialization
Date: Mon, 19 Sep 2011 15:14:54 -0600	[thread overview]
Message-ID: <CACxGe6v9nd5f5x-eu9hUyAqdS1+p3h6ixyutECYLdNo3ewDH0w@mail.gmail.com> (raw)
In-Reply-To: <4E774847.3020104@gmail.com>

On Mon, Sep 19, 2011 at 7:48 AM, Rob Herring <robherring2@gmail.com> wrote:
> On 09/19/2011 07:09 AM, Cousson, Benoit wrote:
>> On 9/18/2011 11:23 PM, Rob Herring wrote:
>>> I was headed down the path of implementing the 2nd option above,
>>> but had a dilemma. What would be the numbering base for PPIs in
>>> this case? Should it be 0 in the DT as proposed for SPIs or does it
>>> stay at 16?
>>
>> Both SGI and PPI are internal to the CortexA9 MP core, and referring
>> to the CortexA9 MP core TRM [1], you can see that the PPI# -> ID#
>> mapping is already documented: - Private timer, PPI(2) Each Cortex-A9
>> processor has its own private timers that can generate interrupts,
>> using ID29. - Watchdog timers, PPI(3) Each Cortex-A9 processor has
>> its own watchdog timers that can generate interrupts, using ID30.
>>
>> So in that case, it can makes sense to use the ID. But it is
>> interesting to note that the PPI is identified with a 0 based index
>> number.
>>
> It's even worse than I thought: we could use 13 (ID16 == PPI0), 29 or 2
> for the timer interrupt. The first would match 0 based SPI convention.
> The last 2 would both match the documentation. We could never use 2 as
> this will for sure be different and the GIC code will have no way to
> know how to do the translation to ID. The only sane choice is using the
> ID as you say.
>
> But you can't have it both ways. It does not make sense to use the ID
> for some interrupts and a different scheme for others.

Hmmm, it seems to me that some orthogonal issues are getting
conflated.  Specifically, the binding vs. what the GIC driver using
internally.  For my own understanding, let me see if I can summarize
and clarify the problem.

Each GIC IRQ is represented in 5 different ways:
1) the hardware documentation (PPI[0-15] or SPI[988] input pin)
2) The DT binding to represent the connection.
3) The Interrupt ID as specified by the GIC architecture reference[1]
(SGI:[0-15], PPI:[16-31], SPI:[32-1019], special:[1020-1023])
4) The internal HWIRQ representation used by the GIC driver
5) The Linux VIRQ number that #4 maps to.

[1] http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ihi0048b/BCGBFHCH.html

Some thoughts:
- Generally the DT binding (#2) should reflect the HW view of the
system (#1) since that is the number most likely to be represented in
hardware manuals.  The interrupt ID is an internal detail of the GIC,
and isn't really exposed in the block diagram of the hardware.
- Presumably it is preferable for the GIC to directly use the
Interrupt ID (#3) as the HWIRQ number (#4) because it is the most
efficient from an interrupt handling perspective, and indeed this is
currently what the GIC driver does.
- Translation between the DT binding (#2) and the Interrupt ID / HWIRQ
(#3/#4) is trivial, and easily managed by the GIC's irq_domain.
- Though not necessarily as trivial, the mapping between Linux VIRQ
and HWIRQ is not fixed, and when migrating to DT it should be assumed
to be assigned at runtime.  Perhaps not so important for a core IRQ
controller like the GIC (as opposed to an i2c irq expander), but
assuming an fixed offset still should be avoided.  We may still force
a SPI0->VIRQ32 on the root GIC as an optimization, but it is not
necessary and the driver still needs to support remapping for a
secondary GIC.

So, for the GIC DT binding, I'm inclined to agree with Benoit that the
binding should reflect the hardware connections, not the values used
by software for decoding IRQs.  Also, I see absolutely no need to use
separate nodes for each GIC interrupt space.  The DT interrupt
specifier number space can more than handle the features of the GIC in
a clear and concise manor.  So, here's my counter proposal for a GIC
bindings (using Rob's text as the starting point):

----

* 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 and SGIs.
Secondary GICs are cascaded into the upward interrupt controller and do not
have PPIs or SGIs.

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 3.

  The 1st cell is the interrupt type; 0 for SPI interrupts, 1 for PPI
interrupts.
  The 2nd cell contains the interrupt number for the interrupt type.
SPI interrupts are in the range [0-987].  PPI interrupts are in the
range [0-15].
  The 3rd cell is the flags, encoded as follows:
        bits[3:0] trigger type and level flags.
                    1 = low-to-high edge triggered
                    2 = high-to-low edge triggered
                    4 = active high level-sensitive
                    8 = active low level-sensitive
        bits[15:8] PPI interrupt cpu mask.  Each bit corresponds to
each of the 8 possible cpus attached to the GIC.  A bit set to '1'
indicated the interrupt is wired to that CPU.  Only valid for PPI
interrupts.

(Alternately, if there is no need for a CPU mask because PPI
interrupts will never be wired to more than one CPU, then it would be
better to encode the CPU number into the second cell with the SPI
number).

- 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.

Optional
- interrupts   : Interrupt source of the parent interrupt controller. Only
  present on secondary GICs.

Example:
       intc: interrupt-controller at fff11000 {
               compatible = "arm,cortex-a9-gic";
               #interrupt-cells = <3>;
               #address-cells = <1>;
               interrupt-controller;
               reg = <0xfff11000 0x1000>,
                     <0xfff10100 0x100>;
       };

  parent reply	other threads:[~2011-09-19 21:16 UTC|newest]

Thread overview: 164+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-09-14 16:31 [PATCH 0/5] GIC OF bindings Rob Herring
2011-09-14 16:31 ` Rob Herring
2011-09-14 16:31 ` Rob Herring
2011-09-14 16:31 ` [PATCH 1/5] irq: add declaration of irq_domain_simple_ops to irqdomain.h Rob Herring
2011-09-14 16:31   ` Rob Herring
2011-09-14 16:31   ` Rob Herring
2011-09-14 16:31 ` [PATCH 2/5] irq: fix existing domain check in irq_domain_add Rob Herring
2011-09-14 16:31   ` Rob Herring
2011-09-14 16:44   ` Thomas Gleixner
2011-09-14 16:44     ` Thomas Gleixner
2011-09-14 16:44     ` Thomas Gleixner
2011-09-17 23:24     ` Grant Likely
2011-09-17 23:24       ` Grant Likely
2011-09-17 23:24       ` Grant Likely
2011-09-14 16:31 ` [PATCH 3/5] of/irq: introduce of_irq_init Rob Herring
2011-09-14 16:31   ` Rob Herring
2011-09-14 16:31   ` Rob Herring
2011-09-15 10:41   ` Arnd Bergmann
2011-09-15 10:41     ` Arnd Bergmann
2011-09-15 10:41     ` Arnd Bergmann
2011-09-17 23:53   ` Grant Likely
2011-09-17 23:53     ` Grant Likely
2011-09-17 23:53     ` Grant Likely
2011-09-18  1:37     ` Rob Herring
2011-09-18  1:37       ` Rob Herring
2011-09-18  1:37       ` Rob Herring
2011-09-18  6:02       ` Grant Likely
2011-09-18  6:02         ` Grant Likely
2011-09-18  6:02         ` Grant Likely
2011-09-14 16:31 ` [PATCH 4/5] ARM: gic: allow irq_start to be 0 Rob Herring
2011-09-14 16:31   ` Rob Herring
2011-09-18  6:24   ` Grant Likely
2011-09-18  6:24     ` Grant Likely
2011-09-18  6:24     ` Grant Likely
2011-09-18 12:03   ` Russell King - ARM Linux
2011-09-18 12:03     ` Russell King - ARM Linux
2011-09-18 12:03     ` Russell King - ARM Linux
2011-09-14 16:31 ` [PATCH 5/5] ARM: gic: add OF based initialization Rob Herring
2011-09-14 16:31   ` Rob Herring
2011-09-14 16:31   ` Rob Herring
2011-09-14 17:46   ` Marc Zyngier
2011-09-14 17:46     ` Marc Zyngier
2011-09-14 17:46     ` Marc Zyngier
2011-09-14 17:57     ` Rob Herring
2011-09-14 17:57       ` Rob Herring
2011-09-14 17:57       ` Rob Herring
2011-09-14 18:34       ` Marc Zyngier
2011-09-14 18:34         ` Marc Zyngier
2011-09-14 18:34         ` Marc Zyngier
2011-09-14 18:51         ` Rob Herring
2011-09-14 18:51           ` Rob Herring
2011-09-14 18:51           ` Rob Herring
2011-09-18  0:13           ` Grant Likely
2011-09-18  0:13             ` Grant Likely
2011-09-18  0:13             ` Grant Likely
2011-09-15  7:55   ` Thomas Abraham
2011-09-15  7:55     ` Thomas Abraham
2011-09-15 10:07     ` Cousson, Benoit
2011-09-15 10:07       ` Cousson, Benoit
2011-09-15 10:07       ` Cousson, Benoit
2011-09-15 10:29       ` Russell King - ARM Linux
2011-09-15 10:29         ` Russell King - ARM Linux
2011-09-15 10:29         ` Russell King - ARM Linux
2011-09-15 12:28         ` Cousson, Benoit
2011-09-15 12:28           ` Cousson, Benoit
2011-09-15 12:28           ` Cousson, Benoit
2011-09-15 12:51           ` Russell King - ARM Linux
2011-09-15 12:51             ` Russell King - ARM Linux
2011-09-15 12:51             ` Russell King - ARM Linux
2011-09-15 13:03             ` Cousson, Benoit
2011-09-15 13:03               ` Cousson, Benoit
2011-09-15 13:03               ` Cousson, Benoit
2011-09-15 13:11       ` Rob Herring
2011-09-15 13:11         ` Rob Herring
2011-09-15 13:11         ` Rob Herring
2011-09-15 13:52         ` Cousson, Benoit
2011-09-15 13:52           ` Cousson, Benoit
2011-09-15 13:52           ` Cousson, Benoit
2011-09-15 16:43           ` Rob Herring
2011-09-15 16:43             ` Rob Herring
2011-09-15 16:43             ` Rob Herring
2011-09-18 21:23             ` Rob Herring
2011-09-18 21:23               ` Rob Herring
2011-09-18 21:23               ` Rob Herring
2011-09-19 12:09               ` Cousson, Benoit
2011-09-19 12:09                 ` Cousson, Benoit
2011-09-19 12:09                 ` Cousson, Benoit
2011-09-19 13:48                 ` Rob Herring
2011-09-19 13:48                   ` Rob Herring
2011-09-19 13:48                   ` Rob Herring
2011-09-19 14:32                   ` Cousson, Benoit
2011-09-19 14:32                     ` Cousson, Benoit
2011-09-19 14:32                     ` Cousson, Benoit
2011-09-19 21:14                   ` Grant Likely [this message]
2011-09-19 21:14                     ` Grant Likely
2011-09-19 21:14                     ` Grant Likely
2011-09-19 21:53                     ` Rob Herring
2011-09-19 21:53                       ` Rob Herring
2011-09-19 21:53                       ` Rob Herring
2011-09-20  0:22                       ` Grant Likely
2011-09-20  0:22                         ` Grant Likely
2011-09-20  0:22                         ` Grant Likely
2011-09-20  4:18                       ` Grant Likely
2011-09-20  4:18                         ` Grant Likely
2011-09-20  4:18                         ` Grant Likely
2011-09-20 15:23                       ` Cousson, Benoit
2011-09-20 15:23                         ` Cousson, Benoit
2011-09-20 15:23                         ` Cousson, Benoit
2011-09-19 16:00                 ` Russell King - ARM Linux
2011-09-19 16:00                   ` Russell King - ARM Linux
2011-09-19 16:00                   ` Russell King - ARM Linux
2011-09-19 20:49               ` Grant Likely
2011-09-19 20:49                 ` Grant Likely
2011-09-19 20:49                 ` Grant Likely
2011-09-19  9:47             ` Cousson, Benoit
2011-09-19  9:47               ` Cousson, Benoit
2011-09-19  9:47               ` Cousson, Benoit
2011-09-19 13:33               ` Russell King - ARM Linux
2011-09-19 13:33                 ` Russell King - ARM Linux
2011-09-19 13:33                 ` Russell King - ARM Linux
2011-09-19 17:44                 ` Grant Likely
2011-09-19 17:44                   ` Grant Likely
2011-09-19 17:44                   ` Grant Likely
2011-09-16 16:09       ` Dave Martin
2011-09-16 16:09         ` Dave Martin
2011-09-16 16:09         ` Dave Martin
2011-09-18  6:21         ` Grant Likely
2011-09-18  6:21           ` Grant Likely
2011-09-18  6:21           ` Grant Likely
2011-09-19 12:07           ` Dave Martin
2011-09-19 12:07             ` Dave Martin
2011-09-19 12:07             ` Dave Martin
2011-09-19 13:08             ` Cousson, Benoit
2011-09-19 13:08               ` Cousson, Benoit
2011-09-19 13:08               ` Cousson, Benoit
2011-09-18  6:15       ` Grant Likely
2011-09-18  6:15         ` Grant Likely
2011-09-18  6:15         ` Grant Likely
2011-09-19  8:47         ` Cousson, Benoit
2011-09-19  8:47           ` Cousson, Benoit
2011-09-19  8:47           ` Cousson, Benoit
2011-09-15 12:54     ` Rob Herring
2011-09-15 12:54       ` Rob Herring
2011-09-15 12:54       ` Rob Herring
2011-09-16  9:34       ` Thomas Abraham
2011-09-16  9:34         ` Thomas Abraham
2011-09-16  9:34         ` Thomas Abraham
2011-09-18  6:10         ` Grant Likely
2011-09-18  6:10           ` Grant Likely
2011-09-18  6:10           ` Grant Likely
2011-09-19 12:59           ` Thomas Abraham
2011-09-19 12:59             ` Thomas Abraham
2011-09-19 12:59             ` Thomas Abraham
2011-09-15 10:43   ` Arnd Bergmann
2011-09-15 10:43     ` Arnd Bergmann
2011-09-15 10:43     ` Arnd Bergmann
2011-09-18  6:30   ` Grant Likely
2011-09-18  6:30     ` Grant Likely
2011-09-18  6:30     ` Grant Likely
2011-09-15  8:50 ` [PATCH 0/5] GIC OF bindings Jamie Iles
2011-09-15  8:50   ` Jamie Iles
2011-09-15 13:53 ` Shawn Guo
2011-09-15 13:53   ` Shawn Guo
2011-09-15 13:53   ` Shawn Guo

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=CACxGe6v9nd5f5x-eu9hUyAqdS1+p3h6ixyutECYLdNo3ewDH0w@mail.gmail.com \
    --to=grant.likely@secretlab.ca \
    --cc=b-cousson@ti.com \
    --cc=devicetree-discuss@lists.ozlabs.org \
    --cc=jamie@jamieiles.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=marc.zyngier@arm.com \
    --cc=rob.herring@calxeda.com \
    --cc=robherring2@gmail.com \
    --cc=shawn.guo@linaro.org \
    --cc=thomas.abraham@linaro.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.