Hi Jan, > On Jun 21, 2016, at 14:43 , Jan Kiszka <jan.kis...@siemens.com> wrote: > > On 2016-06-21 13:35, Pantelis Antoniou wrote: >> Hi Jan, >> >>> On Jun 21, 2016, at 14:22 , Jan Kiszka <jan.kis...@siemens.com> wrote: >>> >>> On 2016-06-21 12:24, Pantelis Antoniou wrote: >>>> Hi Jan, >>>> >>>>> On Jun 21, 2016, at 13:13 , Jan Kiszka <jan.kis...@siemens.com> 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? > Jan > > -- > Siemens AG, Corporate Technology, CT RDA ITP SES-DE > Corporate Competence Center Embedded Linux