ARM GIC DT binding reg block mismatch? (Re: [PATCH v11 1/8] arm64: renesas: r8a7795: Add Renesas R8A7795 SoC support)
Geert Uytterhoeven
geert at linux-m68k.org
Mon Feb 15 02:35:36 PST 2016
Hi Marc,
On Mon, Feb 15, 2016 at 9:45 AM, Marc Zyngier <marc.zyngier at arm.com> wrote:
> On 15/02/16 08:16, Geert Uytterhoeven wrote:
>> On Wed, Dec 9, 2015 at 9:23 AM, Geert Uytterhoeven <geert at linux-m68k.org> wrote:
>>> On Tue, Nov 3, 2015 at 3:28 PM, Mark Rutland <mark.rutland at arm.com> wrote:
>>>> On Wed, Oct 21, 2015 at 03:34:39PM +0200, Geert Uytterhoeven wrote:
>>>>> On Thu, Oct 15, 2015 at 12:58 PM, Mark Rutland <mark.rutland at arm.com> wrote:
>>>>>>>> + gic: interrupt-controller at 0xf1010000 {
>>>>>>> + compatible = "arm,gic-400";
>>>>>>> + #interrupt-cells = <3>;
>>>>>>> + #address-cells = <0>;
>>>>>>> + interrupt-controller;
>>>>>>> + reg = <0x0 0xf1010000 0 0x1000>,
>>>>>>> + <0x0 0xf1020000 0 0x2000>;
>>>>>>> + interrupts = <GIC_PPI 9
>>>>>>> + (GIC_CPU_MASK_SIMPLE(1) | IRQ_TYPE_LEVEL_HIGH)>;
>>>>>>> + };
>>>>>>
>>>>>> No GICH and GICV?
>>>>>
>>>>> These seem to be defined in the "arm,gic-v3" DT bindings only, while this is
>>>>> an "arm,gic-400" (GICD_IIDR 0x0200043b)?
>>>>
>>>> See the "GIC virtualization extensions (VGIC)" section in
>>>> Documentation/devicetree/bindings/arm/gic.txt
>>>
>>> DDI0471B_gic400_r0p1_trm.pdf says:
>>>
>>> Address range GIC-400 functional block
>>> A. 0x0000 - 0x0FFF Reserved
>>> B. 0x1000 - 0x1FFF Distributor
>>> C. 0x2000 - 0x3FFF CPU interfaces
>>> D. 0x4000 - 0x4FFF Virtual interface control block, for the processor that
>>> is performing the access
>>> E. 0x5000 - 0x5FFF Virtual interface control block, for the processor
>>> selected by address bits [11:9]
>>> F. 0x6000 - 0x7FFF Virtual CPU interfaces
>>>
>>> The DT binding document says:
>>> 1. The first region is the GIC distributor register base and size.
>>> 2. The 2nd region is the GIC cpu interface register base and size.
>>> 3. The first additional region is the GIC virtual interface control register
>>> base and size.
>>> 4. The 2nd additional region is the GIC virtual cpu interface register base
>>> and size.
>>>
>>> Matching with the example:
>>>
>>> interrupt-controller at 2c001000 {
>>> compatible = "arm,cortex-a15-gic";
>>> #interrupt-cells = <3>;
>>> interrupt-controller;
>>> reg = <0x2c001000 0x1000>,
>>> <0x2c002000 0x1000>,
>>> <0x2c004000 0x2000>,
>>> <0x2c006000 0x2000>;
>>> interrupts = <1 9 0xf04>;
>>> };
>>>
>>> This means:
>>> - reg entry 1. covers address range B,
>>> - reg entry 2. covers address range C,
>>> - reg entry 3. covers address ranges D _and_ E,
>>> - reg entry 4. covers address range F.
>>>
>>> On R-Car Gen3, the base addresses are:
>>>
>>> Distributor : 0xF101_0000
>>> CPU interfaces : 0xF102_0000
>>> Virtual interfaces : 0xF104_0000
>>> Virtual interfaces : 0xF105_0000
>>> Virtual CPU interfaces : 0xF106_0000
>>>
>>> Note the additional multiplication factor of 16 in the offsets relative to
>>> the base address 0xf1000000 (e.g. 0x50000 instead of 0x5000).
>>>
>>> As address ranges D and E are merged in a single reg entry, how is the GIC
>>> driver supposed to know about this multiplication factor?
>
> The answer is very simple, the GIC driver doesn't give a damn about the
> second part of the GICH region, because it is absolutely unusable for
> any realistic use-case. Only the banked version of GICH is of any
> relevance (the first 512 bytes, in essence).
>
> Aligning the GIC regions on 64kB boundaries is documented in the SBSA
> specification, independently of the GIC400 documentation.
If I understand the SBSA spec correctly (BTW, arm,gic.txt doesn't use the
"GICC" terminology, unlike arm,gic-v3.txt), that means reg entry 3 should be
"<0xf104f000 0x2000>", so it covers the aliased last 4 KiB of address range D,
and the first 4 KiB of address range E. I.e.
reg = <0x0 0xf1010000 0 0x1000>,
<0x0 0xf1020000 0 0x2000>,
<0x0 0xf104f000 0 0x2000>,
<0x0 0xf1060000 0 0x2000>;
Is that correct?
Thanks again!
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert at linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
More information about the linux-arm-kernel
mailing list