Hi Jan,

> On Jun 21, 2016, at 16:12 , Jan Kiszka <[email protected]> wrote:
> 
> On 2016-06-21 13:59, Jan Kiszka wrote:
>> On 2016-06-21 13:45, Pantelis Antoniou wrote:
>>> Hi Jan,
>>> 
>>>> On Jun 21, 2016, at 14:43 , Jan Kiszka <[email protected]> wrote:
>>>> 
>>>> On 2016-06-21 13:35, Pantelis Antoniou wrote:
>>>>> Hi Jan,
>>>>> 
>>>>>> On Jun 21, 2016, at 14:22 , Jan Kiszka <[email protected]> wrote:
>>>>>> 
>>>>>> On 2016-06-21 12:24, Pantelis Antoniou wrote:
>>>>>>> Hi Jan,
>>>>>>> 
>>>>>>>> On Jun 21, 2016, at 13:13 , Jan Kiszka <[email protected]> wrote:
>>>>>>>> 
>>>>>>>> Hi Pantelis,
>>>>>>>> 
>>>>>>>> coming back to this topic:
>>>>>>>> 
>>>>>>>> On 2016-06-09 08:03, Jan Kiszka wrote:
>>>>>>>>> OK, trial and error, and some interesting insights: I've played with 
>>>>>>>>> DT
>>>>>>>>> fragments and the overlay configfs patch of Pantelis [1] to have a
>>>>>>>>> convenient start. Interestingly, I wasn't able to load a fragment that
>>>>>>>>> followed the format specification for overlays ("Failed to resolve
>>>>>>>>> tree"). By chance, I got this one working:
>>>>>>>>> 
>>>>>>>>> /dts-v1/;
>>>>>>>>> / {
>>>>>>>>>       fragment {
>>>>>>>>>               target-path = "/soc@01c00000";
>>>>>>>>>               __overlay__ {
>>>>>>>>>                       #address-cells = <2>;
>>>>>>>>>                       #size-cells = <2>;
>>>>>>>>> 
>>>>>>>>>                       vpci@0x2000000 {
>>>>>>>>>                               compatible = "pci-host-cam-generic";
>>>>>>>>>                               device_type = "pci";
>>>>>>>>>                               #address-cells = <3>;
>>>>>>>>>                               #size-cells = <2>;
>>>>>>>>>                               reg = <0 0x2000000 0 0x1000000>;
>>>>>>>>>                               ranges =
>>>>>>>>>                                       <0x02000000 0x00 0x10000000 
>>>>>>>>> 0x00 0x10000000 0x00 0x30000000>;
>>>>>>>>>                       };
>>>>>>>>>               };
>>>>>>>>>       };
>>>>>>>>> };
>>>>>>>>> 
>>>>>>>>> It successfully makes a BananaPi kernel add a pci host with the
>>>>>>>>> specified config space and MMIO window.
>>>>>>>>> 
>>>>>>>>> [   81.619583] PCI host bridge /soc@01c00000/vpci@0x2000000 ranges:
>>>>>>>>> [   81.619610]   No bus range found for /soc@01c00000/vpci@0x2000000, 
>>>>>>>>> using [bus 00-ff]
>>>>>>>>> [   81.619634]   MEM 0x10000000..0x3fffffff -> 0x10000000
>>>>>>>>> [   81.620482] pci-host-generic 2000000.vpci: ECAM at [mem 
>>>>>>>>> 0x02000000-0x02ffffff] for [bus 00-ff]
>>>>>>>>> [   81.620779] pci-host-generic 2000000.vpci: PCI host bridge to bus 
>>>>>>>>> 0000:00
>>>>>>>>> [   81.620801] pci_bus 0000:00: root bus resource [bus 00-ff]
>>>>>>>>> [   81.620814] pci_bus 0000:00: root bus resource [mem 
>>>>>>>>> 0x10000000-0x3fffffff]
>>>>>>>>> [   81.620851] PCI: bus0: Fast back to back transfers enabled
>>>>>>>>> 
>>>>>>>>> So, no /plugin/ statement, no phandles resolution. This format even
>>>>>>>>> builds with the in-kernel dtc. Any explanations? Does the code make
>>>>>>>>> sense (at least it builds without warnings)?
>>>>>>>>> 
>>>>>>>>> Now I need to back this with some code in Jailhouse.
>>>>>>>> 
>>>>>>>> Meanwhile I got a virtual PCI device recognized by Linux when running
>>>>>>>> over Jailhouse. However, my hack above doesn't get me to proper
>>>>>>>> interrupt mapping yet. This is what I was trying with upstream dtc:
>>>>>>>> 
>>>>>>>> /dts-v1/;
>>>>>>>> / {
>>>>>>>>        compatible = "lemaker,bananapi", "allwinner,sun7i-a20";
>>>>>>>> 
>>>>>>>>        fragment@0 {
>>>>>>>>                target-path = "/soc@01c00000";
>>>>>>>>                __overlay__ {
>>>>>>>>                        #address-cells = <2>;
>>>>>>>>                        #size-cells = <2>;
>>>>>>>> 
>>>>>>>>                        vpci@2000000 {
>>>>>>>>                                compatible = "pci-host-ecam-generic";
>>>>>>>>                                device_type = "pci";
>>>>>>>>                                bus-range = <0 0>;
>>>>>>>>                                #address-cells = <3>;
>>>>>>>>                                #size-cells = <2>;
>>>>>>>>                                #interrupt-cells = <1>;
>>>>>>>>                                interrupt-map-mask = <0 0 0 7>;
>>>>>>>>                                interrupt-map = <0 0 0 1 &gic 0 0 0 123 
>>>>>>>> 4>,
>>>>>>>>                                                <0 0 0 2 &gic 0 0 0 124 
>>>>>>>> 4>,
>>>>>>>>                                                <0 0 0 3 &gic 0 0 0 125 
>>>>>>>> 4>,
>>>>>>>>                                                <0 0 0 4 &gic 0 0 0 126 
>>>>>>>> 4>;
>>>>>>>>                                reg = <0 0x2000000 0 0x100000>;
>>>>>>>>                                ranges =
>>>>>>>>                                        <0x02000000 0x00 0x10000000 
>>>>>>>> 0x00 0x10000000 0x00 0x30000000>;
>>>>>>>>                        };
>>>>>>>>                };
>>>>>>>>        };
>>>>>>>> 
>>>>>>>>        gic: fragment@1 {
>>>>>>>>                target-path = 
>>>>>>>> "/soc@01c00000/interrupt-controller@01c81000";
>>>>>>>>                __overlay__ {
>>>>>>>>                };
>>>>>>>>        };
>>>>>>>> };
>>>>>>>> 
>>>>>>> 
>>>>>>> ^ This is not going to work: You need the reference to the real gic not 
>>>>>>> the empty fragment
>>>>>>> here that has a target there.
>>>>>>> 
>>>>>>> You need to compile with the correct dtc, and you also need to compile 
>>>>>>> the base dts
>>>>>>> with dtc too, using the -@ flag. You can hack around it by adding 
>>>>>>> something like
>>>>>>> 
>>>>>>> __symbols__ {
>>>>>>>         gic = "/soc@01c00000/interrupt-controller@01c81000”;
>>>>>>> };
>>>>>>> 
>>>>>>> But you really need the __symbols__ node of the base dts generated by 
>>>>>>> the dtc proper cause
>>>>>>> the above is a dirty hack.
>>>>>>> 
>>>>>> 
>>>>>> OK, re-building the kernel with DTC="/your/dtc -@", thus building the
>>>>>> base dtb with symbols, fixes proper overlay format loading.
>>>>>> 
>>>>>> However, no luck yet with the interrupt topic - maybe a different issue.
>>>>>> Digging deeper…
>>>>>> 
>>>>> Remove the gic: fragment and build both the kernel and the overlay with 
>>>>> the -@ option.
>>>>> That’s what makes it not to work.
>>>> 
>>>> That's what I did, of course.
>>>> 
>>>> I've now
>>>> 
>>>> /dts-v1/;
>>>> // magic:          0xd00dfeed
>>>> // totalsize:              0x448 (1096)
>>>> // off_dt_struct:  0x38
>>>> // off_dt_strings: 0x3c0
>>>> // off_mem_rsvmap: 0x28
>>>> // version:                17
>>>> // last_comp_version:      16
>>>> // boot_cpuid_phys:        0x0
>>>> // size_dt_strings:        0x88
>>>> // size_dt_struct: 0x388
>>>> 
>>>> / {
>>>>   compatible = "lemaker,bananapi", "allwinner,sun7i-a20";
>>>>   fragment@0 {
>>>>       target = <0xffffffff>;
>>>>       __overlay__ {
>>>>           #address-cells = <0x00000002>;
>>>>           #size-cells = <0x00000002>;
>>>>           vpci@2000000 {
>>>>               compatible = "pci-host-ecam-generic";
>>>>               device_type = "pci";
>>>>               bus-range = <0x00000000 0x00000000>;
>>>>               #address-cells = <0x00000003>;
>>>>               #size-cells = <0x00000002>;
>>>>               #interrupt-cells = <0x00000001>;
>>>>               interrupt-map-mask = <0x00000000 0x00000000 0x00000000 
>>>> 0x00000007>;
>>>>               interrupt-map = <0x00000000 0x00000000 0x00000000 0x00000001 
>>>> 0xffffffff 0x00000000 0x00000000 0x00000000 0x0000007b 0x00000004 
>>>> 0x00000000 0x00000000 0x00000000 0x00000002 0xffffffff 0x00000000 
>>>> 0x00000000 0x00000000 0x0000007c 0x00000004 0x00000000 0x00000000 
>>>> 0x00000000 0x00000003 0xffffffff 0x00000000 0x00000000 0x00000000 
>>>> 0x0000007d 0x00000004 0x00000000 0x00000000 0x00000000 0x00000004 
>>>> 0xffffffff 0x00000000 0x00000000 0x00000000 0x0000007e 0x00000004>;
>>>>               reg = <0x00000000 0x02000000 0x00000000 0x00100000>;
>>>>               ranges = <0x02000000 0x00000000 0x10000000 0x00000000 
>>>> 0x10000000 0x00000000 0x30000000>;
>>>>           };
>>>>       };
>>>>   };
>>>>   __symbols__ {
>>>>   };
>>>>   __fixups__ {
>>>>       soc = "/fragment@0:target:0";
>>>>       gic = "/fragment@0/__overlay__/vpci@2000000:interrupt-map:16", 
>>>> "/fragment@0/__overlay__/vpci@2000000:interrupt-map:56", 
>>>> "/fragment@0/__overlay__/vpci@2000000:interrupt-map:96", 
>>>> "/fragment@0/__overlay__/vpci@2000000:interrupt-map:136";
>>>>   };
>>>>   __local_fixups__ {
>>>>   };
>>>> };
>>>> 
>>>> and a base dtb with a symbols section and all the required ones
>>>> included.
>>>> 
>>> 
>>> OK, this should make things work. Did you try sticking this in the base dts 
>>> and see if it works there?
>> 
>> Can't do this because Linux needs that tree to boot and Jailhouse with
>> its virtual PCI controller comes after that only.
>> 
>> I'll debug what's happing behind the curtains regarding PCI interrupt
>> mapping, maybe that will give a clue.
> 
> That happens when someone without much clue about this device tree
> thingy hacks fragments together from all over the place (wouldn't have
> happened if the related specs were more readable). The problem was with
> the width of the interrupt-map parent part. This now works:
> 

+1 on the unreadable specs. I would vote for a more verbose definition if that
would make things more readable.

> /dts-v1/;
> /plugin/;
> / {
>       compatible = "lemaker,bananapi", "allwinner,sun7i-a20";
> 
>       fragment {
>               target-path = "/soc@01c00000";
>               __overlay__ {
>                       #address-cells = <1>;
>                       #size-cells = <1>;
> 
>                       vpci@2000000 {
>                               compatible = "pci-host-ecam-generic";
>                               device_type = "pci";
>                               bus-range = <0 0>;
>                               #address-cells = <3>;
>                               #size-cells = <2>;
>                               #interrupt-cells = <1>;
>                               interrupt-map-mask = <0 0 0 7>;
>                               interrupt-map = <0 0 0 1 &gic 0 123 4>,
>                                               <0 0 0 2 &gic 0 124 4>,
>                                               <0 0 0 3 &gic 0 125 4>,
>                                               <0 0 0 4 &gic 0 126 4>;
>                               reg = <0x2000000 0x100000>;
>                               ranges =
>                                       <0x02000000 0x00 0x10000000 0x10000000 
> 0x00 0x30000000>;
>                       };
>               };
>       };
> };
> 
> I'm sure there are more hidden bugs in this fragment, anyway:
> 
> linux:~ # cat /proc/interrupts 
>           CPU0       CPU1       
> ...
> 126:          0          0     GIC-0 155 Level     ivshm-net
> 
> Yeah... Time to wire things up in the hypervisor.
> 
> Jan
> 
> -- 
> Siemens AG, Corporate Technology, CT RDA ITP SES-DE
> Corporate Competence Center Embedded Linux

Reply via email to