[PATCH 0/2] ARM: mvebu: fix DT def. of PCIe units for mv78230 and mv78260

Arnaud Ebalard arno at natisbad.org
Wed Nov 6 15:08:39 EST 2013


Hi Jason,

Jason Gunthorpe <jgunthorpe at obsidianresearch.com> writes:

> On Wed, Nov 06, 2013 at 07:22:33PM +0100, Thomas Petazzoni wrote:
>> Dear Arnaud Ebalard,
>> 
>> On Wed, 06 Nov 2013 19:14:42 +0100, Arnaud Ebalard wrote:
>> 
>> > > As a side note, Thomas, I noticed one more thing, this time in mv78460
>> > > .dtsi when comparing it w/ mv78230 and mv78260 ones. The first address
>> > > of "assigned-address" property varies in the former for each pcie
>> > > node:
>> > >
>> > > $ grep assigned-address armada-xp-mv78230.dtsi 
>> > >          assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
>> > >          assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
>> > >          assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
>> > >          assigned-addresses = <0x82000800 0 0x4c000 0 0x2000>;
>> > >          assigned-addresses = <0x82000800 0 0x80000 0 0x2000>;
>> > > $ grep assigned-address armada-xp-mv78260.dtsi 
>> > >          assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
>> > >          assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
>> > >          assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
>> > >          assigned-addresses = <0x82000800 0 0x4c000 0 0x2000>;
>> > >          assigned-addresses = <0x82000800 0 0x80000 0 0x2000>;
>> > >          assigned-addresses = <0x82000800 0 0x84000 0 0x2000>;
>> > >          assigned-addresses = <0x82000800 0 0x88000 0 0x2000>;
>> > >          assigned-addresses = <0x82000800 0 0x8c000 0 0x2000>;
>> > >          assigned-addresses = <0x82000800 0 0x42000 0 0x2000>;
>> > > $ grep assigned-address armada-xp-mv78460.dtsi 
>> > >          assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
>> > >          assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
>> > >          assigned-addresses = <0x82001800 0 0x48000 0 0x2000>;
>> > >          assigned-addresses = <0x82002000 0 0x4c000 0 0x2000>;
>> > >          assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
>> > >          assigned-addresses = <0x82003000 0 0x84000 0 0x2000>;
>> > >          assigned-addresses = <0x82003800 0 0x88000 0 0x2000>;
>> > >          assigned-addresses = <0x82004000 0 0x8c000 0 0x2000>;
>> > >          assigned-addresses = <0x82004800 0 0x42000 0 0x2000>;
>> > >          assigned-addresses = <0x82005000 0 0x82000 0 0x2000>;
>> > >
>> > > I took at Documentation/devicetree/bindings/pci/mvebu-pci.txt but
>> > > failed to find an answer. Can you explain where the difference comes
>> > > from?
>> > 
>> > Sorry to bother you again with the one above (it was in the cover
>> > letter) but the difference looks quite odd for someone not familiar
>> > with the syntax and the semantic.
>> 
>> I do still have this question in mind, I wanted to reply to it today
>> but just hadn't had the time to do it. I'm adding Jason Gunthorpe in Cc
>> because he knows better than me the precise meaning of
>> assigned-addresses. If it doesn't reply, I'll try to have a look
>> tomorrow. This is the kind of stuff I can't answer without
>> concentrating for a bit of time to re-understand again how it all fits
>> together :-)
>
> In this context the assigned-addresses encodes the PCI device bus
> function as well as the BAR #.
>
> This PCI stuff would be 100% more readable with some macros ..
>
> #define PCI_REG_BDF(bus,device,function) (....)
> #define PCI_MEM_BAR_BDF(bus,device,function,bar) \
>    (0x82000000 | PCI_REG_BDF(bus,device,function) + bar*XX) 0)
>
> So that:
>  reg = <PCI_REG_BDF(0,1,0) 0 0>
>  assigned-addresses = <PCI_MEM_BAR_BDF(0,1,0,0)  0x40000  0 0x2000>
>
> When done properly the assigned-address and reg should have the same
> BDF. As you've noticed there is a copy and paste mistake in some of
> the dts's:
>
> eg:
>  pcie at 2,0 {
>      assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
>      reg = <0x1000 0 0 0 0>;
>
> The assigned-addresses in that instance should be 0x82001000 to match
> the reg.
>
> It probably works because the Linux machinery doesn't check the BDF
> value?

ok.

> The purpose of assigned-address in this specific context is to tell
> the driver how to find its control registers. So the 0x44000 above is
> the base for the PEX register. The "pci at 3,0", assigned-addresses, and
> reg are encoding this statement: "Create a PCI bridge at B:D.F using
> the PEX registers at 0x44000" The B:D.F in all three places should be
> the same.

Thanks for the explanation.

> I recommend adding some macros and constants derived from the OF PCI
> spec. It will save us all headaches :)

Too bad it was not that clear in mvebu-pci.txt; I could have taken the
opportunity to fix mv782{30,60} .dtsi in two previous patches.

Cheers,

a+



More information about the linux-arm-kernel mailing list