[U-Boot] [PATCH] arm: ls1028a: define the integrated PCI bus (ECAM)
Bin Meng
bmeng.cn at gmail.com
Mon Jun 10 02:30:30 UTC 2019
Hi Alex,
On Fri, Jun 7, 2019 at 10:41 PM Alex Marginean <alexm.osslist at gmail.com> wrote:
>
> On 6/5/2019 4:09 AM, Bin Meng wrote:
> > Hi Alex,
> >
> > On Tue, Jun 4, 2019 at 9:59 PM Alex Marginean <alexm.osslist at gmail.com> wrote:
> >>
> >> Hi Bin,
> >>
> >> On 6/2/2019 5:22 PM, Bin Meng wrote:
> >>> Hi Alex,
> >>>
> >>> On Fri, May 31, 2019 at 12:27 AM Alex Marginean <alexm.osslist at gmail.com> wrote:
> >>>>
> >>>> LS1028A includes an integrated PCI bus with 8M of ECAM space plus register
> >>>> space for the integrated devices. This integrated PCI bus is driven using
> >>>> the generic ECAM driver.
> >>>>
> >>>> Signed-off-by: Alex Marginean <alexm.osslist at gmail.com>
> >>>> ---
> >>>> arch/arm/dts/fsl-ls1028a.dtsi | 10 ++++++++++
> >>>> arch/arm/include/asm/arch-fsl-layerscape/cpu.h | 2 ++
> >>>> arch/arm/include/asm/arch-fsl-layerscape/immap_lsch3.h | 2 ++
> >>>> configs/ls1028aqds_tfa_defconfig | 1 +
> >>>> configs/ls1028ardb_tfa_defconfig | 1 +
> >>>> 5 files changed, 16 insertions(+)
> >>>>
> >>>> diff --git a/arch/arm/dts/fsl-ls1028a.dtsi b/arch/arm/dts/fsl-ls1028a.dtsi
> >>>> index e6a443aa77..263c29af23 100644
> >>>> --- a/arch/arm/dts/fsl-ls1028a.dtsi
> >>>> +++ b/arch/arm/dts/fsl-ls1028a.dtsi
> >>>> @@ -108,6 +108,16 @@
> >>>> 0x82000000 0x0 0x40000000 0x88 0x40000000 0x0 0x40000000>; /* non-prefetchable memory */
> >>>> };
> >>>>
> >>>> + pcie at 1f0000000 {
> >>>> + compatible = "pci-host-ecam-generic";
> >>>> + reg = <0x01 0xf0000000 0x0 0x100000>;
> >>>> + #address-cells = <3>;
> >>>> + #size-cells = <2>;
> >>>> + device_type = "pci";
> >>>> + bus-range = <0x0 0x0>;
> >>>
> >>> I think this should be <0x0 0x7> since you mentioned in the commit
> >>> message that only an 8M ECAM space is allocated.
> >>
> >> I think I was looking at the wrong spec, it seems the platform actually
> >> has 256MB of address space reserved for ECAM. It's not all implemented
> >> of course, in fact all the devices we care about in u-boot are on bus 0.
> >> Anyway, I can just remove bus-range, the default is 0-255 and that does
> >> match the HW.
> >>
> >>>
> >>>> + ranges= <0x82000000 0x0 0x00000000 0x1 0xf8000000 0x0 0x160000>;
> >>>> + };
> >>>> +
> >>>> i2c0: i2c at 2000000 {
> >>>> compatible = "fsl,vf610-i2c";
> >>>> #address-cells = <1>;
> >>>> diff --git a/arch/arm/include/asm/arch-fsl-layerscape/cpu.h b/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
> >>>> index bdeb62576c..7759acdb8f 100644
> >>>> --- a/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
> >>>> +++ b/arch/arm/include/asm/arch-fsl-layerscape/cpu.h
> >>>> @@ -42,7 +42,9 @@
> >>>> #else
> >>>> #define CONFIG_SYS_PCIE1_PHYS_SIZE 0x800000000
> >>>> #define CONFIG_SYS_PCIE2_PHYS_SIZE 0x800000000
> >>>> +#ifndef CONFIG_SYS_PCIE3_PHYS_SIZE
> >>>> #define CONFIG_SYS_PCIE3_PHYS_SIZE 0x800000000
> >>>> +#endif
> >>>> #define CONFIG_SYS_PCIE4_PHYS_SIZE 0x800000000
> >>>> #define SYS_PCIE5_PHYS_SIZE 0x800000000
> >>>> #define SYS_PCIE6_PHYS_SIZE 0x800000000
> >>>> diff --git a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch3.h b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch3.h
> >>>> index 24c1b0e482..273157230f 100644
> >>>> --- a/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch3.h
> >>>> +++ b/arch/arm/include/asm/arch-fsl-layerscape/immap_lsch3.h
> >>>> @@ -186,6 +186,8 @@
> >>>> #elif CONFIG_ARCH_LS1028A
> >>>> #define CONFIG_SYS_PCIE1_PHYS_ADDR 0x8000000000ULL
> >>>> #define CONFIG_SYS_PCIE2_PHYS_ADDR 0x8800000000ULL
> >>>> +#define CONFIG_SYS_PCIE3_PHYS_ADDR 0x01f0000000ULL
> >>>> +#define CONFIG_SYS_PCIE3_PHYS_SIZE 0x0010000000ULL
> >>>
> >>> DT says the size is 0x100000. This does not match.
> >>
> >> I'll extend reg to 256MB along with removing bus-range.
> >>
> >>> These macros really look to me this platform is still using lots of
> >>> non-DM approaches when it comes to driver support. These hard coded
> >>> values should really be dropped and retrieved from DT instead via
> >>> proper DM drivers.
> >>
> >> ECAM is driven by the ecam generic host driver and it doesn't care about
> >> these macros.
> >> These are used int arch/arm/cpu/armv8/fsl-layerscape/cpu.c to set up
> >> the MMU at boot though, accessing ECAM doesn't work without them.
> >
> > Yes, but what I was trying to say that with driver model things like
> > register base and size should be retrieved from DT. Can we consider
> > doing an ARMv8 DM MMU driver that reads DT and set up the page table
> > for everything?
>
> I've dug a bit more into the address ranges used here, there is indeed a
> 256MB space but that's not just for ECAM. In fact 2nd half contains
> device registers for the devices presented as PCI through ECAM.
> Given than only bus 0 is populated I kept bus-range = <0x0 0x0>.
>
> On the other hand both ECAM and device registers have to be mapped in
> MMU, so I didn't change the 256MB size macro.
>
> I agree the existing solution for mapping in MMU isn't great, since it
> duplicates information between dts and code. I'm not sure what would
> be a good alternative.
>
> Mapping based on dts could work, but the code would have to deal with
> various corner cases. Some nodes don't use reg for addresses, for
> integrated PCI with EA mapping ECAM alone is not sufficient, we also
> need the BAR equivalents mapped, those kind of things. That means more
> knowledge added one way or another to the arm MMU code, I'm not sure
> that would end up being so much cleaner than what is there now.
Yep, I believe this is not an NXP specific problem. It applies to
other ARM platforms, so I was hoping Tom or Simon could give some
generic solution.
Regards,
Bin
More information about the U-Boot
mailing list