[RFC v1] PCIe support for the Armada 370 and Armada XP SoCs

Jay Agarwal jagarwal at nvidia.com
Fri Dec 21 08:38:39 EST 2012


Thierry,

Are you doing below BARs programing for config space or extended config space? pcie->cfg & comments indicates config and fpci_bar = 0xfe0... & size indicates extended config.

Also make sure you add up 0x10000000(according to your below impl.) to pcie->cs/pcie->extcs in pcie_read(write)_conf api so that type1 addresses will actually be mapped to 0xfe1... fpci address.



> -----Original Message-----

> From: Thierry Reding [mailto:thierry.reding at avionic-design.de]

> Sent: Thursday, December 20, 2012 9:03 PM

> To: Stephen Warren

> Cc: Jason Gunthorpe; Jay Agarwal; Thomas Petazzoni; Andrew Lunn; Jason

> Cooper; Gregory Clement; linux-arm-kernel at lists.infradead.org

> Subject: Re: [RFC v1] PCIe support for the Armada 370 and Armada XP SoCs

>

> * PGP Signed by an unknown key

>

> On Tue, Dec 18, 2012 at 10:03:38AM -0700, Stephen Warren wrote:

> > On 12/17/2012 07:51 PM, Jason Gunthorpe wrote:

> > > [trimmed the cc list]

> > >

> > > On Mon, Dec 17, 2012 at 07:10:59PM -0700, Stephen Warren wrote:

> > >

> > >>> What I'll do next is add some caching of written values, so that

> > >>> reading them back actually yields something correct. After that

> > >>> I'll post what I have so that others can look at it or even reuse

> > >>> it.

> > >>

> > >> Some internal discussion implies this shouldn't be required; here's

> > >> what they said:

> > >

> > > Looking at the driver, it says:

> > >

> > > + * 0x80000000 - 0x80003fff - PCI controller registers

> > > + * 0x80004000 - 0x80103fff - PCI configuration space

> > > + * 0x80104000 - 0x80203fff - PCI extended configuration space

> > >

> > > And the bridge config regions are at:

> > >

> > > +#define RP0_OFFSET     0x0000

> > > +#define RP1_OFFSET     0x1000

> > >

> > > And from the first checkin, config space accesses have been split

> > > into three designations:

> > >  bridge #0 - 0x80000000 + 0

> > >  bridge #1 - 0x80000000 + 0x1000

> > >  Every other bus - 0x80104000 + [equation]

> > >

> > > And based on Thierry's results it looks like once the bridge

> > > subordinate bus numbers are setup (via their lower mappings) then

> > > the 'every other bus' mapping starts working as expected.

> > >

> > > So.. is there a register to be set that lets the bridge

> > > configuration be accessed through the [0x80004000 - 0x80103fff] region

> as bus 0?

> > > Presumably a non-PCI device number register?

> >

> > It looks like some PCI host controller registers do need to be set up

> > (so far the information is related to "type 0" vs. "type 1"

> > configuration accesses, although I'm not familiar with what that means).

>

> So I've been spending some time implementing this along with some of the

> things that Stephen and I discussed on IRC. However, each time I try to

> access the type 0 configuration space through the special mapping that

> Stephen dug up I get the following "imprecise external abort" oops:

>

> [    3.482802] tegra-pcie 80003000.pcie-controller: PCI host bridge to bus

> 0000:00

> [    3.490107] pci_bus 0000:00: root bus resource [io  0x82000000-0x8200ffff]

> [    3.517456] pci_bus 0000:00: root bus resource [mem 0xb0000000-

> 0xb7ffffff]

> [    3.530644] pci_bus 0000:00: root bus resource [mem 0xb8000000-0xbfffffff

> pref]

> [    3.554191] pci_bus 0000:00: root bus resource [bus 00-ff]

> [    3.559693] Unhandled fault: imprecise external abort (0x406) at

> 0x00034384

> [    3.559702] tegra-pcie 80003000.pcie-controller: AXI response decoding

> error, signature: 00000001

> [    3.559708] tegra-pcie 80003000.pcie-controller:   FPCI address: fe00000000

> [    3.582435] Internal error: : 406 [#1] PREEMPT SMP ARM

> [    3.587560] Modules linked in:

> [    3.590616] CPU: 1    Not tainted  (3.7.0-next-20121219-00103-gb307de6-

> dirty #42)

> [    3.591125] usb 1-1.1: new high-speed USB device number 3 using tegra-

> ehci

> [    3.604944] PC is at tegra_pcie_read_conf+0x60/0xd4

> [    3.609823] LR is at ioremap_page_range+0xec/0x19c

> [    3.614605] pc : [<c0025034>]    lr : [<c01dfcec>]    psr: a0000093

> [    3.614605] sp : da645d08  ip : 90000000  fp : c06a8bf4

> [    3.626063] r10: 00000000  r9 : da645de0  r8 : dae89400

> [    3.631274] r7 : 00000000  r6 : 00000000  r5 : 00000004  r4 : 00000000

> [    3.637790] r3 : ffffffff  r2 : 00000000  r1 : e0823000  r0 : e0822000

> [    3.644309] Flags: NzCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment

> kernel

> [    3.651696] Control: 10c5387d  Table: 1a6f404a  DAC: 00000015

> [    3.657437] Process kworker/u:3 (pid: 55, stack limit = 0xda644238)

>

> I beefed up the interrupt service routine a bit to output the full FPCI address

> that the decoding error occurred and it always is the one configured for the

> type 0 configuration space mapping. I assume that the "Internal error" is due

> to the "imprecise external abort", but it would be good if somebody could

> confirm that.

>

> Basically I have modified tegra_pcie_setup_translations() to have this:

>

>              /* Bar 0: type 0 configuration space */

>              fpci_bar = 0xfe000000;

>              size = resource_size(pcie->cfg[0]);

>              axi_address = pcie->cfg[0]->start;

>              afi_writel(pcie, axi_address, AFI_AXI_BAR0_START);

>              afi_writel(pcie, size >> 12, AFI_AXI_BAR0_SZ);

>              afi_writel(pcie, fpci_bar, AFI_FPCI_BAR0);

>

>              /* Bar 1: type 1 configuration space */

>              fpci_bar = 0xfe100000;

>              size = resource_size(pcie->cfg[1]);

>              axi_address = pcie->cfg[1]->start;

>              afi_writel(pcie, axi_address, AFI_AXI_BAR1_START);

>              afi_writel(pcie, size >> 12, AFI_AXI_BAR1_SZ);

>              afi_writel(pcie, fpci_bar, AFI_FPCI_BAR1);

>

> Where pcie->cfg[0] and pcie->cfg[1] are parsed from the following device

> tree snippet:

>

>              reg = <0x80003000 0x00000800   /* PADS registers */

>                     0x80003800 0x00000200   /* AFI registers */

>                     0x90000000 0x10000000   /* type 0 configuration space */

>                     0xa0000000 0x10000000>; /* type 1 configuration space */

>

> The complete code can be found in my tegra/next branch[0]. Beware that I

> haven't cleaned up that branch in a while, so anything but looking at the end

> result is not very recommended =). The branch contains patches

> (untested) to make Harmony and TrimSlice initialize the PCIe from the

> device tree, so anyone inclined to give this a spin should be able to do so. If

> you want to try out the software emulated host bridge, you can just

> uncomment the "#define EMULATE_HOST_BRIDGE 1" at the top of

> arch/arm/mach-tegra/pcie.c.

>

> Stephen: Do you think you could dig some more, try to find out what the

> deal is with these "imprecise external aborts"? Perhaps something else

> needs to be done in order to activate the type 0 mapping? Also, while

> looking through some old downstream code from the Vibrante area I saw a

> HyperTransport document mentioned that contains these mappings. It is

> referred to as the "AFI IAS" (section 3.2.4 is mentioned specifically).

> Any chance I could take a look at it?

>

> Thierry

>

> [0]: git://gitorious.org/thierryreding/linux.git

>

> * Unknown Key

> * 0x7F3EB3A1
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20121221/75c47902/attachment-0001.html>


More information about the linux-arm-kernel mailing list