All of lore.kernel.org
 help / color / mirror / Atom feed
* DesignWare ATU PCIE_ATU_TYPE_MEM usage
@ 2016-01-05 22:42 Bjorn Helgaas
  2016-01-07  7:11 ` Minghuan Lian
  0 siblings, 1 reply; 4+ messages in thread
From: Bjorn Helgaas @ 2016-01-05 22:42 UTC (permalink / raw)
  To: Jingoo Han, Pratyush Anand; +Cc: linux-pci, Jisheng Zhang, Minghuan.Lian

Hi guys,

This code in dw_pcie_host_init() looks wrong:

    if (!pp->ops->rd_other_conf)
	    dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX1,
				      PCIE_ATU_TYPE_MEM, pp->mem_base,
				      pp->mem_bus_addr, pp->mem_size);

    dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0);
    ...
    dw_pcie_rd_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, &val);

Evidently you need to program the ATU with PCIE_ATU_TYPE_MEM before
doing config accesses on the root bus?

If that's the case, what about other config accesses after these few
in dw_pcie_host_init()?  I don't see anything that changes the ATU
programming for things coming through dw_pcie_wr_conf().

I assume you need some sort of locking around this sequence:

    dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX0, type, ...
    ret = dw_pcie_cfg_read(va_cfg_base + where, size, val);
    dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX0, PCIE_ATU_TYPE_IO, ...

Are you relying on pci_lock?  If so, a comment to that effect would be
nice.

The whole ATU management looks pretty inefficient.  It's likely that
there'll be a whole sequence of operations where we don't need to
touch the ATU, but since we don't remember its current state, we
configure the whole thing from scratch each time, which is at least
eight register writes (plus a read for the new synchronization).

Bjorn

^ permalink raw reply	[flat|nested] 4+ messages in thread

* RE: DesignWare ATU PCIE_ATU_TYPE_MEM usage
  2016-01-05 22:42 DesignWare ATU PCIE_ATU_TYPE_MEM usage Bjorn Helgaas
@ 2016-01-07  7:11 ` Minghuan Lian
  2016-01-07  8:32   ` Jisheng Zhang
  2016-01-07 10:20   ` Pratyush Anand
  0 siblings, 2 replies; 4+ messages in thread
From: Minghuan Lian @ 2016-01-07  7:11 UTC (permalink / raw)
  To: Bjorn Helgaas, Jingoo Han, Pratyush Anand
  Cc: linux-pci, Jisheng Zhang, Minghuan.Lian

SGkgQmpvcm4sDQoNCldlIG5lZWQgYXQgbGVhc3QgZm91ciBraW5kcyBvZiBQQ0llIHRyYW5zYWN0
aW9uczogQ0ZHMCwgQ0ZHMSwgSU8sIE1FTS4NClRoZSBiZXN0IHNvbHV0aW9uIGlzIHRvIGFzc2ln
biA0IGlBVFUgdG8gc3VwcG9ydCB0aGVtIHNlcGFyYXRlbHkgZm9yIGV4YW1wbGU6IEFUVTAtIENG
RzAsIEFUVTEtQ0ZHMSwgQVRVMi1JTyBBVFUzLU1FTS4NClNvLCBmb3IgSU8gYW5kIE1FTSwgd2Ug
ZG9uJ3QgbmVlZCB0byB1cGRhdGUgaUFUVSBhbmQgZm9yIENGRywgd2Ugb25seSBuZWVkIHRvIHVw
ZGF0ZSBhIHJlZ2lzdGVyIHRvIHVwZGF0ZSBCVVMgZGV2aWNlIGFuZCBmdW5jdGlvbiBudW1iZXIu
DQpNb3Jlb3ZlciwgdGhpcyBjYW4gYXZvaWQgYW55IGNvbmZsaWN0Lg0KDQpCdXQgVGhlcmUgYXJl
IHNvbWUgU09DcyB0aGF0IG9ubHkgcHJvdmlkZXMgdHdvIGlBVFVzLg0KU28gdGhlIGxhdGVzdCBk
cml2ZXIgcHJvdmlkZXMgYSBzb2x1dGlvbjogQVRVMCBpcyBzaGFyZWQgYnkgQ0ZHMCBDRkcxIGFu
ZCBJTywgQVRVMSBpcyBkZWRpY2F0ZWQgdG8gTUVNLg0KVGhlIGRyaXZlciBzaG91bGQgZmlyc3Qg
c2V0IEFUVTAgYXMgSU8gYW5kIEFUVTEgYXMgTUVNLiBXaGVuIGFjY2Vzc2luZyBDRkcwIG9yIENG
RzEsIEFUVTAgd2lsbCBiZSBjaGFuZ2VkIHRvIENGRzAvQ0ZHMSwgdGhlbiBiYWNrIHRvIElPIHNl
dHRpbmcuDQpDRkcwIENGRzEgY2FuIHNlcXVlbmNlZCBieSBwY2lfbG9jay4gQnV0IENGRyBJTyBh
bmQgTUVNKG1heSBiZSBnZW5lcmF0ZWQgYnkgUENJZSBkZXZpY2UncyBETUEpIGFyZSBjb21wbGV0
ZWx5IGluZGVwZW5kZW50Lg0KDQpCZWNhdXNlIG1vc3QgUENJZSBkZXZpY2UgZG8gbm90IG5lZWQg
SU8gdHJhbnNhY3Rpb24gYW5kIGluIGdlbmVyYWwgQ0ZHMCBDRkcxIGFuZCBJTyB0cmFuc2FjdGlv
biBpcyBnZW5lcmF0ZWQgYnkgUENJZSBkZXZpY2UgZHJpdmVyIGFuZCByYXJlbHkgb2NjdXJyZWQg
c2ltdWx0YW5lb3VzbHkuDQpTbyB0aGUgY3VycmVudCBzb2x1dGlvbiBjYW4gbWluaW1pemUgY29u
ZmxpY3QuDQpJbiBmYWN0LCBmb3IgdGhlIGN1cnJlbnQgcGNpZS1kZXNpZ253YXJlIGRyaXZlciwg
dGhlcmUgaXMgbm8gd2F5IHRvIGF2b2lkIElPIGFuZCBDRkcgY29uZmxpY3QuDQoNCg0KVGhhbmtz
LA0KTWluZ2h1YW4NCg0KDQo+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+IEZyb206IEJq
b3JuIEhlbGdhYXMgW21haWx0bzpoZWxnYWFzQGtlcm5lbC5vcmddDQo+IFNlbnQ6IFdlZG5lc2Rh
eSwgSmFudWFyeSAwNiwgMjAxNiA2OjQyIEFNDQo+IFRvOiBKaW5nb28gSGFuIDxqaW5nb29oYW4x
QGdtYWlsLmNvbT47IFByYXR5dXNoIEFuYW5kDQo+IDxwcmF0eXVzaC5hbmFuZEBnbWFpbC5jb20+
DQo+IENjOiBsaW51eC1wY2lAdmdlci5rZXJuZWwub3JnOyBKaXNoZW5nIFpoYW5nIDxqc3poYW5n
QG1hcnZlbGwuY29tPjsNCj4gTWluZ2h1YW4uTGlhbkBmcmVlc2NhbGUuY29tDQo+IFN1YmplY3Q6
IERlc2lnbldhcmUgQVRVIFBDSUVfQVRVX1RZUEVfTUVNIHVzYWdlDQo+IA0KPiBIaSBndXlzLA0K
PiANCj4gVGhpcyBjb2RlIGluIGR3X3BjaWVfaG9zdF9pbml0KCkgbG9va3Mgd3Jvbmc6DQo+IA0K
PiAgICAgaWYgKCFwcC0+b3BzLT5yZF9vdGhlcl9jb25mKQ0KPiAJICAgIGR3X3BjaWVfcHJvZ19v
dXRib3VuZF9hdHUocHAsIFBDSUVfQVRVX1JFR0lPTl9JTkRFWDEsDQo+IAkJCQkgICAgICBQQ0lF
X0FUVV9UWVBFX01FTSwgcHAtPm1lbV9iYXNlLA0KPiAJCQkJICAgICAgcHAtPm1lbV9idXNfYWRk
ciwgcHAtPm1lbV9zaXplKTsNCj4gDQo+ICAgICBkd19wY2llX3dyX293bl9jb25mKHBwLCBQQ0lf
QkFTRV9BRERSRVNTXzAsIDQsIDApOw0KPiAgICAgLi4uDQo+ICAgICBkd19wY2llX3JkX293bl9j
b25mKHBwLCBQQ0lFX0xJTktfV0lEVEhfU1BFRURfQ09OVFJPTCwgNCwgJnZhbCk7DQo+IA0KPiBF
dmlkZW50bHkgeW91IG5lZWQgdG8gcHJvZ3JhbSB0aGUgQVRVIHdpdGggUENJRV9BVFVfVFlQRV9N
RU0gYmVmb3JlDQo+IGRvaW5nIGNvbmZpZyBhY2Nlc3NlcyBvbiB0aGUgcm9vdCBidXM/DQo+IA0K
PiBJZiB0aGF0J3MgdGhlIGNhc2UsIHdoYXQgYWJvdXQgb3RoZXIgY29uZmlnIGFjY2Vzc2VzIGFm
dGVyIHRoZXNlIGZldyBpbg0KPiBkd19wY2llX2hvc3RfaW5pdCgpPyAgSSBkb24ndCBzZWUgYW55
dGhpbmcgdGhhdCBjaGFuZ2VzIHRoZSBBVFUgcHJvZ3JhbW1pbmcNCj4gZm9yIHRoaW5ncyBjb21p
bmcgdGhyb3VnaCBkd19wY2llX3dyX2NvbmYoKS4NCj4gDQo+IEkgYXNzdW1lIHlvdSBuZWVkIHNv
bWUgc29ydCBvZiBsb2NraW5nIGFyb3VuZCB0aGlzIHNlcXVlbmNlOg0KPiANCj4gICAgIGR3X3Bj
aWVfcHJvZ19vdXRib3VuZF9hdHUocHAsIFBDSUVfQVRVX1JFR0lPTl9JTkRFWDAsIHR5cGUsIC4u
Lg0KPiAgICAgcmV0ID0gZHdfcGNpZV9jZmdfcmVhZCh2YV9jZmdfYmFzZSArIHdoZXJlLCBzaXpl
LCB2YWwpOw0KPiAgICAgZHdfcGNpZV9wcm9nX291dGJvdW5kX2F0dShwcCwgUENJRV9BVFVfUkVH
SU9OX0lOREVYMCwNCj4gUENJRV9BVFVfVFlQRV9JTywgLi4uDQo+IA0KPiBBcmUgeW91IHJlbHlp
bmcgb24gcGNpX2xvY2s/ICBJZiBzbywgYSBjb21tZW50IHRvIHRoYXQgZWZmZWN0IHdvdWxkIGJl
IG5pY2UuDQo+IA0KPiBUaGUgd2hvbGUgQVRVIG1hbmFnZW1lbnQgbG9va3MgcHJldHR5IGluZWZm
aWNpZW50LiAgSXQncyBsaWtlbHkgdGhhdCB0aGVyZSdsbCBiZQ0KPiBhIHdob2xlIHNlcXVlbmNl
IG9mIG9wZXJhdGlvbnMgd2hlcmUgd2UgZG9uJ3QgbmVlZCB0byB0b3VjaCB0aGUgQVRVLCBidXQN
Cj4gc2luY2Ugd2UgZG9uJ3QgcmVtZW1iZXIgaXRzIGN1cnJlbnQgc3RhdGUsIHdlIGNvbmZpZ3Vy
ZSB0aGUgd2hvbGUgdGhpbmcgZnJvbQ0KPiBzY3JhdGNoIGVhY2ggdGltZSwgd2hpY2ggaXMgYXQg
bGVhc3QgZWlnaHQgcmVnaXN0ZXIgd3JpdGVzIChwbHVzIGEgcmVhZCBmb3IgdGhlDQo+IG5ldyBz
eW5jaHJvbml6YXRpb24pLg0KPiANCj4gQmpvcm4NCg==

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: DesignWare ATU PCIE_ATU_TYPE_MEM usage
  2016-01-07  7:11 ` Minghuan Lian
@ 2016-01-07  8:32   ` Jisheng Zhang
  2016-01-07 10:20   ` Pratyush Anand
  1 sibling, 0 replies; 4+ messages in thread
From: Jisheng Zhang @ 2016-01-07  8:32 UTC (permalink / raw)
  To: Minghuan Lian, Bjorn Helgaas, Jingoo Han, Pratyush Anand
  Cc: linux-pci, Minghuan.Lian

Dear Minghuan, Bjorn,

On Thu, 7 Jan 2016 07:11:59 +0000 Minghuan Lian wrote:

> Hi Bjorn,
> 
> We need at least four kinds of PCIe transactions: CFG0, CFG1, IO, MEM.
> The best solution is to assign 4 iATU to support them separately for example: ATU0- CFG0, ATU1-CFG1, ATU2-IO ATU3-MEM.

IMHO, 3 ATUs is enough, cfg0 and cfg1 can be sequenced by pci_lock as you
pointed out ;)

> So, for IO and MEM, we don't need to update iATU and for CFG, we only need to update a register to update BUS device and function number.
> Moreover, this can avoid any conflict.
> 
> But There are some SOCs that only provides two iATUs.
> So the latest driver provides a solution: ATU0 is shared by CFG0 CFG1 and IO, ATU1 is dedicated to MEM.
> The driver should first set ATU0 as IO and ATU1 as MEM. When accessing CFG0 or CFG1, ATU0 will be changed to CFG0/CFG1, then back to IO setting.
> CFG0 CFG1 can sequenced by pci_lock. But CFG IO and MEM(may be generated by PCIe device's DMA) are completely independent.
> 
> Because most PCIe device do not need IO transaction and in general CFG0 CFG1 and IO transaction is generated by PCIe device driver and rarely occurred simultaneously.
> So the current solution can minimize conflict.
> In fact, for the current pcie-designware driver, there is no way to avoid IO and CFG conflict.

The key is how to sequence IO and CFG, this may need pci subsystem to provide
the support.

> 
> 
> Thanks,
> Minghuan
> 
> 
> > -----Original Message-----
> > From: Bjorn Helgaas [mailto:helgaas@kernel.org]
> > Sent: Wednesday, January 06, 2016 6:42 AM
> > To: Jingoo Han <jingoohan1@gmail.com>; Pratyush Anand
> > <pratyush.anand@gmail.com>
> > Cc: linux-pci@vger.kernel.org; Jisheng Zhang <jszhang@marvell.com>;
> > Minghuan.Lian@freescale.com
> > Subject: DesignWare ATU PCIE_ATU_TYPE_MEM usage
> > 
> > Hi guys,
> > 
> > This code in dw_pcie_host_init() looks wrong:
> > 
> >     if (!pp->ops->rd_other_conf)
> > 	    dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX1,
> > 				      PCIE_ATU_TYPE_MEM, pp->mem_base,
> > 				      pp->mem_bus_addr, pp->mem_size);
> > 
> >     dw_pcie_wr_own_conf(pp, PCI_BASE_ADDRESS_0, 4, 0);
> >     ...
> >     dw_pcie_rd_own_conf(pp, PCIE_LINK_WIDTH_SPEED_CONTROL, 4, &val);
> > 
> > Evidently you need to program the ATU with PCIE_ATU_TYPE_MEM before
> > doing config accesses on the root bus?
> > 
> > If that's the case, what about other config accesses after these few in
> > dw_pcie_host_init()?  I don't see anything that changes the ATU programming
> > for things coming through dw_pcie_wr_conf().
> > 
> > I assume you need some sort of locking around this sequence:
> > 
> >     dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX0, type, ...
> >     ret = dw_pcie_cfg_read(va_cfg_base + where, size, val);
> >     dw_pcie_prog_outbound_atu(pp, PCIE_ATU_REGION_INDEX0,
> > PCIE_ATU_TYPE_IO, ...
> > 
> > Are you relying on pci_lock?  If so, a comment to that effect would be nice.
> > 
> > The whole ATU management looks pretty inefficient.  It's likely that there'll be
> > a whole sequence of operations where we don't need to touch the ATU, but
> > since we don't remember its current state, we configure the whole thing from
> > scratch each time, which is at least eight register writes (plus a read for the
> > new synchronization).
> > 
> > Bjorn  


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: DesignWare ATU PCIE_ATU_TYPE_MEM usage
  2016-01-07  7:11 ` Minghuan Lian
  2016-01-07  8:32   ` Jisheng Zhang
@ 2016-01-07 10:20   ` Pratyush Anand
  1 sibling, 0 replies; 4+ messages in thread
From: Pratyush Anand @ 2016-01-07 10:20 UTC (permalink / raw)
  To: Minghuan Lian, Bjorn Helgaas, Jisheng Zhang
  Cc: Jingoo Han, linux-pci, Minghuan.Lian

Hi,

On Thu, Jan 7, 2016 at 12:41 PM, Minghuan Lian <minghuan.lian@nxp.com> wrote:
> Hi Bjorn,
>
> We need at least four kinds of PCIe transactions: CFG0, CFG1, IO, MEM.
> The best solution is to assign 4 iATU to support them separately for example: ATU0- CFG0, ATU1-CFG1, ATU2-IO ATU3-MEM.
> So, for IO and MEM, we don't need to update iATU and for CFG, we only need to update a register to update BUS device and function number.
> Moreover, this can avoid any conflict.
>
> But There are some SOCs that only provides two iATUs.

Yes, as far as I know there are two SOCs Marvell Berlin and SPEAr1340
which have only two iATUs.

> So the latest driver provides a solution: ATU0 is shared by CFG0 CFG1 and IO, ATU1 is dedicated to MEM.
> The driver should first set ATU0 as IO and ATU1 as MEM. When accessing CFG0 or CFG1, ATU0 will be changed to CFG0/CFG1, then back to IO setting.
> CFG0 CFG1 can sequenced by pci_lock. But CFG IO and MEM(may be generated by PCIe device's DMA) are completely independent.
>
> Because most PCIe device do not need IO transaction and in general CFG0 CFG1 and IO transaction is generated by PCIe device driver and rarely occurred simultaneously.
> So the current solution can minimize conflict.
> In fact, for the current pcie-designware driver, there is no way to avoid IO and CFG conflict.

Right, and frankly I do not see any way to rule out even by changing
something in pci core layer.

So, IMHO since there are only few SOCs with 2 ATUs, lets implement one
time ATU programming for 4 ATUs in pcie-designware.c and SOCs having
less than 4 ATUs should implement their own rd/wr_other_conf(). With
this approach we can minimized its ill effect.

~Pratyush

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2016-01-07 10:20 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-01-05 22:42 DesignWare ATU PCIE_ATU_TYPE_MEM usage Bjorn Helgaas
2016-01-07  7:11 ` Minghuan Lian
2016-01-07  8:32   ` Jisheng Zhang
2016-01-07 10:20   ` Pratyush Anand

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.