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 00:16:14 PST 2016
Cc Marz Zyngier
Cc Dirk Behme
Cc devicetree
Cc linux-renesas-soc
Drop linux-sh
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?
>
> Thanks!
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