Message ID | 1436518099-98633-1-git-send-email-gabriele.paoloni@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Delegated to: | Bjorn Helgaas |
Headers | show |
On Fri, Jul 10, 2015 at 3:48 AM, Gabriele Paoloni <gabriele.paoloni@huawei.com> wrote: > From: gabriele paoloni <gabriele.paoloni@huawei.com> > > This patch is needed port PCIe designware to new DT parsing API > As discussed in > http://lists.infradead.org/pipermail/linux-arm-kernel/2015-January/317743.html > in designware we have a problem as the PCI addresses in the PCIe controller > address space are required in order to perform correct HW operation. > > In order to solve this problem commit > f4c55c5a3f7f68c06cc559ed7af8b2d017cbb0a7 "PCI: designware: Please abbreviate hashs to 12 characters. > Program ATU with untranslated address" added code to read the PCIe > controller start address directly from the DT ranges. > > In the new DT parsing API of_pci_get_host_bridge_resources() hides the > DT parser from the host controller drivers, so it is not possible > for drivers to parse values directly from the DT. > > In http://www.spinics.net/lists/linux-pci/msg42540.html we already tried > to use the new DT parsing API but there is a bug (obviously) in setting > the <*>_mod_base addresses > Applying this patch we can easily set "<*>_mod_base = win->__res.start" > > This patch adds a new field in "struct of_pci_range" to store the > pci controller start address; it fills the field in of_pci_range_parser_one(); > in of_pci_get_host_bridge_resources() it retrieve the resource entry > after it is created and added to the resource list and uses > entry->__res.start to store the pci controller address > > the patch is based on 4.2-rc1 > > Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> > --- > drivers/of/address.c | 1 + > drivers/of/of_pci.c | 4 ++++ > drivers/pci/host/pcie-designware.c | 9 +++------ > include/linux/of_address.h | 1 + > 4 files changed, 9 insertions(+), 6 deletions(-) > > diff --git a/drivers/of/address.c b/drivers/of/address.c > index 8bfda6a..52f9321 100644 > --- a/drivers/of/address.c > +++ b/drivers/of/address.c > @@ -265,6 +265,7 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser, > range->pci_addr = of_read_number(parser->range + 1, ns); > range->cpu_addr = of_translate_address(parser->node, > parser->range + na); > + range->pci_ctrl_addr = of_read_number(parser->range + na, ns); This is wrong as the correct size to read is not "ns", but the parent bus #size-cells value. I think "bus_addr" would be a better name. It is not the PCI controller's address (i.e. what is in reg prop). No "pci" because it has nothing to do with PCI bus addresses. In general, this seems fragile as the dt address ranges/translation may not align with the h/w ranges. For example, what if you have 2 levels of translations and you happen to need it translated with just 1 level of translation. That said, I don't really have a better suggestion and I guess we can deal with that case if needed later. > range->size = of_read_number(parser->range + parser->pna + na, ns); > > parser->range += parser->np; > diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c > index 5751dc5..2ccc749 100644 > --- a/drivers/of/of_pci.c > +++ b/drivers/of/of_pci.c > @@ -198,6 +198,7 @@ int of_pci_get_host_bridge_resources(struct device_node *dev, > > pr_debug("Parsing ranges property...\n"); > for_each_of_pci_range(&parser, &range) { > + struct resource_entry *entry; > /* Read next ranges element */ > if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO) > snprintf(range_type, 4, " IO"); > @@ -240,6 +241,9 @@ int of_pci_get_host_bridge_resources(struct device_node *dev, > } > > pci_add_resource_offset(resources, res, res->start - range.pci_addr); > + entry = list_last_entry(resources, struct resource_entry, node); > + /*we are using __res for storing the PCI controller address*/ > + entry->__res.start = range.pci_ctrl_addr; You will use this in a follow-up patch? I'd like to see this just split into core changes and DW changes. This looks like you are making intermediate DW changes which will be removed in subsequent patches. Rob -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Rob Many Thanks for your review > -----Original Message----- > From: Rob Herring [mailto:robherring2@gmail.com] > Sent: Friday, July 10, 2015 8:56 PM > To: Gabriele Paoloni > Cc: Arnd Bergmann; Lorenzo Pieralisi; Wangzhou (B); Bjorn Helgaas; Rob > Herring; james.morse@arm.com; Liviu Dudau; linux-pci@vger.kernel.org; > linux-arm-kernel@lists.infradead.org; devicetree@vger.kernel.org; > Yuanzhichang; Zhudacai; zhangjukuo; qiuzhenfa; Liguozhu (Kenneth) > Subject: Re: [PATCH] Store PCIe controllers address in struct > of_pci_range > > On Fri, Jul 10, 2015 at 3:48 AM, Gabriele Paoloni > <gabriele.paoloni@huawei.com> wrote: > > From: gabriele paoloni <gabriele.paoloni@huawei.com> > > > > This patch is needed port PCIe designware to new DT parsing API > > As discussed in > > http://lists.infradead.org/pipermail/linux-arm-kernel/2015- > January/317743.html > > in designware we have a problem as the PCI addresses in the PCIe > controller > > address space are required in order to perform correct HW operation. > > > > In order to solve this problem commit > > f4c55c5a3f7f68c06cc559ed7af8b2d017cbb0a7 "PCI: designware: > > Please abbreviate hashs to 12 characters. Sure, will do. > > > Program ATU with untranslated address" added code to read the PCIe > > controller start address directly from the DT ranges. > > > > In the new DT parsing API of_pci_get_host_bridge_resources() hides > the > > DT parser from the host controller drivers, so it is not possible > > for drivers to parse values directly from the DT. > > > > In http://www.spinics.net/lists/linux-pci/msg42540.html we already > tried > > to use the new DT parsing API but there is a bug (obviously) in > setting > > the <*>_mod_base addresses > > Applying this patch we can easily set "<*>_mod_base = win- > >__res.start" > > > > This patch adds a new field in "struct of_pci_range" to store the > > pci controller start address; it fills the field in > of_pci_range_parser_one(); > > in of_pci_get_host_bridge_resources() it retrieve the resource entry > > after it is created and added to the resource list and uses > > entry->__res.start to store the pci controller address > > > > the patch is based on 4.2-rc1 > > > > Signed-off-by: Gabriele Paoloni <gabriele.paoloni@huawei.com> > > --- > > drivers/of/address.c | 1 + > > drivers/of/of_pci.c | 4 ++++ > > drivers/pci/host/pcie-designware.c | 9 +++------ > > include/linux/of_address.h | 1 + > > 4 files changed, 9 insertions(+), 6 deletions(-) > > > > diff --git a/drivers/of/address.c b/drivers/of/address.c > > index 8bfda6a..52f9321 100644 > > --- a/drivers/of/address.c > > +++ b/drivers/of/address.c > > @@ -265,6 +265,7 @@ struct of_pci_range > *of_pci_range_parser_one(struct of_pci_range_parser *parser, > > range->pci_addr = of_read_number(parser->range + 1, ns); > > range->cpu_addr = of_translate_address(parser->node, > > parser->range + na); > > + range->pci_ctrl_addr = of_read_number(parser->range + na, ns) ; > > This is wrong as the correct size to read is not "ns", but the parent > bus #size-cells value. Ok I will replace "ns" with "of_n_size_cells(parser->node)" > > I think "bus_addr" would be a better name. It is not the PCI > controller's address (i.e. what is in reg prop). No "pci" because it > has nothing to do with PCI bus addresses. Ok I will change the name > > In general, this seems fragile as the dt address ranges/translation > may not align with the h/w ranges. For example, what if you have 2 > levels of translations and you happen to need it translated with just > 1 level of translation. That said, I don't really have a better > suggestion and I guess we can deal with that case if needed later. Ok so, we'll leave it like this for now > > > range->size = of_read_number(parser->range + parser->pna + na, > ns); > > > > parser->range += parser->np; > > diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c > > index 5751dc5..2ccc749 100644 > > --- a/drivers/of/of_pci.c > > +++ b/drivers/of/of_pci.c > > @@ -198,6 +198,7 @@ int of_pci_get_host_bridge_resources(struct > device_node *dev, > > > > pr_debug("Parsing ranges property...\n"); > > for_each_of_pci_range(&parser, &range) { > > + struct resource_entry *entry; > > /* Read next ranges element */ > > if ((range.flags & IORESOURCE_TYPE_BITS) == > IORESOURCE_IO) > > snprintf(range_type, 4, " IO"); > > @@ -240,6 +241,9 @@ int of_pci_get_host_bridge_resources(struct > device_node *dev, > > } > > > > pci_add_resource_offset(resources, res, res->start - > range.pci_addr); > > + entry = list_last_entry(resources, struct > resource_entry, node); > > + /*we are using __res for storing the PCI controller > address*/ > > + entry->__res.start = range.pci_ctrl_addr; > > You will use this in a follow-up patch? I'd like to see this just > split into core changes and DW changes. This looks like you are making > intermediate DW changes which will be removed in subsequent patches. > > Rob
U29ycnkgSSBqdXN0IHJlYWxpemVkIEkgZm9yZ290IHRvIHJlcGx5IHRvIHRoZSBsYXN0IGl0ZW0N Cg0KR2FiDQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogR2FicmllbGUg UGFvbG9uaQ0KPiBTZW50OiBNb25kYXksIEp1bHkgMTMsIDIwMTUgMTI6MDcgUE0NCj4gVG86ICdS b2IgSGVycmluZycNCj4gQ2M6IEFybmQgQmVyZ21hbm47IExvcmVuem8gUGllcmFsaXNpOyBXYW5n emhvdSAoQik7IEJqb3JuIEhlbGdhYXM7IFJvYg0KPiBIZXJyaW5nOyBqYW1lcy5tb3JzZUBhcm0u Y29tOyBMaXZpdSBEdWRhdTsgbGludXgtcGNpQHZnZXIua2VybmVsLm9yZzsNCj4gbGludXgtYXJt LWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnOyBkZXZpY2V0cmVlQHZnZXIua2VybmVsLm9yZzsN Cj4gWXVhbnpoaWNoYW5nOyBaaHVkYWNhaTsgemhhbmdqdWt1bzsgcWl1emhlbmZhOyBMaWd1b3po dSAoS2VubmV0aCkNCj4gU3ViamVjdDogUkU6IFtQQVRDSF0gU3RvcmUgUENJZSBjb250cm9sbGVy cyBhZGRyZXNzIGluIHN0cnVjdA0KPiBvZl9wY2lfcmFuZ2UNCj4gDQo+IEhpIFJvYg0KPiANCj4g TWFueSBUaGFua3MgZm9yIHlvdXIgcmV2aWV3DQo+IA0KPiA+IC0tLS0tT3JpZ2luYWwgTWVzc2Fn ZS0tLS0tDQo+ID4gRnJvbTogUm9iIEhlcnJpbmcgW21haWx0bzpyb2JoZXJyaW5nMkBnbWFpbC5j b21dDQo+ID4gU2VudDogRnJpZGF5LCBKdWx5IDEwLCAyMDE1IDg6NTYgUE0NCj4gPiBUbzogR2Fi cmllbGUgUGFvbG9uaQ0KPiA+IENjOiBBcm5kIEJlcmdtYW5uOyBMb3JlbnpvIFBpZXJhbGlzaTsg V2FuZ3pob3UgKEIpOyBCam9ybiBIZWxnYWFzOw0KPiBSb2INCj4gPiBIZXJyaW5nOyBqYW1lcy5t b3JzZUBhcm0uY29tOyBMaXZpdSBEdWRhdTsgbGludXgtcGNpQHZnZXIua2VybmVsLm9yZzsNCj4g PiBsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmc7IGRldmljZXRyZWVAdmdlci5r ZXJuZWwub3JnOw0KPiA+IFl1YW56aGljaGFuZzsgWmh1ZGFjYWk7IHpoYW5nanVrdW87IHFpdXpo ZW5mYTsgTGlndW96aHUgKEtlbm5ldGgpDQo+ID4gU3ViamVjdDogUmU6IFtQQVRDSF0gU3RvcmUg UENJZSBjb250cm9sbGVycyBhZGRyZXNzIGluIHN0cnVjdA0KPiA+IG9mX3BjaV9yYW5nZQ0KPiA+ DQo+ID4gT24gRnJpLCBKdWwgMTAsIDIwMTUgYXQgMzo0OCBBTSwgR2FicmllbGUgUGFvbG9uaQ0K PiA+IDxnYWJyaWVsZS5wYW9sb25pQGh1YXdlaS5jb20+IHdyb3RlOg0KPiA+ID4gRnJvbTogZ2Fi cmllbGUgcGFvbG9uaSA8Z2FicmllbGUucGFvbG9uaUBodWF3ZWkuY29tPg0KPiA+ID4NCj4gPiA+ IFRoaXMgcGF0Y2ggaXMgbmVlZGVkIHBvcnQgUENJZSBkZXNpZ253YXJlIHRvIG5ldyBEVCBwYXJz aW5nIEFQSQ0KPiA+ID4gQXMgZGlzY3Vzc2VkIGluDQo+ID4gPiBodHRwOi8vbGlzdHMuaW5mcmFk ZWFkLm9yZy9waXBlcm1haWwvbGludXgtYXJtLWtlcm5lbC8yMDE1LQ0KPiA+IEphbnVhcnkvMzE3 NzQzLmh0bWwNCj4gPiA+IGluIGRlc2lnbndhcmUgd2UgaGF2ZSBhIHByb2JsZW0gYXMgdGhlIFBD SSBhZGRyZXNzZXMgaW4gdGhlIFBDSWUNCj4gPiBjb250cm9sbGVyDQo+ID4gPiBhZGRyZXNzIHNw YWNlIGFyZSByZXF1aXJlZCBpbiBvcmRlciB0byBwZXJmb3JtIGNvcnJlY3QgSFcgb3BlcmF0aW9u Lg0KPiA+ID4NCj4gPiA+IEluIG9yZGVyIHRvIHNvbHZlIHRoaXMgcHJvYmxlbSBjb21taXQNCj4g PiA+IGY0YzU1YzVhM2Y3ZjY4YzA2Y2M1NTllZDdhZjhiMmQwMTdjYmIwYTcgIlBDSTogZGVzaWdu d2FyZToNCj4gPg0KPiA+IFBsZWFzZSBhYmJyZXZpYXRlIGhhc2hzIHRvIDEyIGNoYXJhY3RlcnMu DQo+IA0KPiBTdXJlLCB3aWxsIGRvLg0KPiANCj4gPg0KPiA+ID4gUHJvZ3JhbSBBVFUgd2l0aCB1 bnRyYW5zbGF0ZWQgYWRkcmVzcyIgYWRkZWQgY29kZSB0byByZWFkIHRoZSBQQ0llDQo+ID4gPiBj b250cm9sbGVyIHN0YXJ0IGFkZHJlc3MgZGlyZWN0bHkgZnJvbSB0aGUgRFQgcmFuZ2VzLg0KPiA+ ID4NCj4gPiA+IEluIHRoZSBuZXcgRFQgcGFyc2luZyBBUEkgb2ZfcGNpX2dldF9ob3N0X2JyaWRn ZV9yZXNvdXJjZXMoKSBoaWRlcw0KPiA+IHRoZQ0KPiA+ID4gRFQgcGFyc2VyIGZyb20gdGhlIGhv c3QgY29udHJvbGxlciBkcml2ZXJzLCBzbyBpdCBpcyBub3QgcG9zc2libGUNCj4gPiA+IGZvciBk cml2ZXJzIHRvIHBhcnNlIHZhbHVlcyBkaXJlY3RseSBmcm9tIHRoZSBEVC4NCj4gPiA+DQo+ID4g PiBJbiBodHRwOi8vd3d3LnNwaW5pY3MubmV0L2xpc3RzL2xpbnV4LXBjaS9tc2c0MjU0MC5odG1s IHdlIGFscmVhZHkNCj4gPiB0cmllZA0KPiA+ID4gdG8gdXNlIHRoZSBuZXcgRFQgcGFyc2luZyBB UEkgYnV0IHRoZXJlIGlzIGEgYnVnIChvYnZpb3VzbHkpIGluDQo+ID4gc2V0dGluZw0KPiA+ID4g dGhlIDwqPl9tb2RfYmFzZSBhZGRyZXNzZXMNCj4gPiA+IEFwcGx5aW5nIHRoaXMgcGF0Y2ggd2Ug Y2FuIGVhc2lseSBzZXQgIjwqPl9tb2RfYmFzZSA9IHdpbi0NCj4gPiA+X19yZXMuc3RhcnQiDQo+ ID4gPg0KPiA+ID4gVGhpcyBwYXRjaCBhZGRzIGEgbmV3IGZpZWxkIGluICJzdHJ1Y3Qgb2ZfcGNp X3JhbmdlIiB0byBzdG9yZSB0aGUNCj4gPiA+IHBjaSBjb250cm9sbGVyIHN0YXJ0IGFkZHJlc3M7 IGl0IGZpbGxzIHRoZSBmaWVsZCBpbg0KPiA+IG9mX3BjaV9yYW5nZV9wYXJzZXJfb25lKCk7DQo+ ID4gPiBpbiBvZl9wY2lfZ2V0X2hvc3RfYnJpZGdlX3Jlc291cmNlcygpIGl0IHJldHJpZXZlIHRo ZSByZXNvdXJjZQ0KPiBlbnRyeQ0KPiA+ID4gYWZ0ZXIgaXQgaXMgY3JlYXRlZCBhbmQgYWRkZWQg dG8gdGhlIHJlc291cmNlIGxpc3QgYW5kIHVzZXMNCj4gPiA+IGVudHJ5LT5fX3Jlcy5zdGFydCB0 byBzdG9yZSB0aGUgcGNpIGNvbnRyb2xsZXIgYWRkcmVzcw0KPiA+ID4NCj4gPiA+IHRoZSBwYXRj aCBpcyBiYXNlZCBvbiA0LjItcmMxDQo+ID4gPg0KPiA+ID4gU2lnbmVkLW9mZi1ieTogR2Ficmll bGUgUGFvbG9uaSA8Z2FicmllbGUucGFvbG9uaUBodWF3ZWkuY29tPg0KPiA+ID4gLS0tDQo+ID4g PiAgZHJpdmVycy9vZi9hZGRyZXNzLmMgICAgICAgICAgICAgICB8IDEgKw0KPiA+ID4gIGRyaXZl cnMvb2Yvb2ZfcGNpLmMgICAgICAgICAgICAgICAgfCA0ICsrKysNCj4gPiA+ICBkcml2ZXJzL3Bj aS9ob3N0L3BjaWUtZGVzaWdud2FyZS5jIHwgOSArKystLS0tLS0NCj4gPiA+ICBpbmNsdWRlL2xp bnV4L29mX2FkZHJlc3MuaCAgICAgICAgIHwgMSArDQo+ID4gPiAgNCBmaWxlcyBjaGFuZ2VkLCA5 IGluc2VydGlvbnMoKyksIDYgZGVsZXRpb25zKC0pDQo+ID4gPg0KPiA+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvb2YvYWRkcmVzcy5jIGIvZHJpdmVycy9vZi9hZGRyZXNzLmMNCj4gPiA+IGluZGV4 IDhiZmRhNmEuLjUyZjkzMjEgMTAwNjQ0DQo+ID4gPiAtLS0gYS9kcml2ZXJzL29mL2FkZHJlc3Mu Yw0KPiA+ID4gKysrIGIvZHJpdmVycy9vZi9hZGRyZXNzLmMNCj4gPiA+IEBAIC0yNjUsNiArMjY1 LDcgQEAgc3RydWN0IG9mX3BjaV9yYW5nZQ0KPiA+ICpvZl9wY2lfcmFuZ2VfcGFyc2VyX29uZShz dHJ1Y3Qgb2ZfcGNpX3JhbmdlX3BhcnNlciAqcGFyc2VyLA0KPiA+ID4gICAgICAgICByYW5nZS0+ cGNpX2FkZHIgPSBvZl9yZWFkX251bWJlcihwYXJzZXItPnJhbmdlICsgMSwgbnMpOw0KPiA+ID4g ICAgICAgICByYW5nZS0+Y3B1X2FkZHIgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhwYXJzZXItPm5v ZGUsDQo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlci0+cmFuZ2Ug KyBuYSk7DQo+ID4gPiArICAgICAgIHJhbmdlLT5wY2lfY3RybF9hZGRyID0gb2ZfcmVhZF9udW1i ZXIocGFyc2VyLT5yYW5nZSArIG5hLA0KPiBucykgOw0KPiA+DQo+ID4gVGhpcyBpcyB3cm9uZyBh cyB0aGUgY29ycmVjdCBzaXplIHRvIHJlYWQgaXMgbm90ICJucyIsIGJ1dCB0aGUgcGFyZW50DQo+ ID4gYnVzICNzaXplLWNlbGxzIHZhbHVlLg0KPiANCj4gT2sgSSB3aWxsIHJlcGxhY2UgIm5zIiB3 aXRoICJvZl9uX3NpemVfY2VsbHMocGFyc2VyLT5ub2RlKSINCj4gDQo+ID4NCj4gPiBJIHRoaW5r ICJidXNfYWRkciIgd291bGQgYmUgYSBiZXR0ZXIgbmFtZS4gSXQgaXMgbm90IHRoZSBQQ0kNCj4g PiBjb250cm9sbGVyJ3MgYWRkcmVzcyAoaS5lLiB3aGF0IGlzIGluIHJlZyBwcm9wKS4gTm8gInBj aSIgYmVjYXVzZSBpdA0KPiA+IGhhcyBub3RoaW5nIHRvIGRvIHdpdGggUENJIGJ1cyBhZGRyZXNz ZXMuDQo+IA0KPiBPayBJIHdpbGwgY2hhbmdlIHRoZSBuYW1lDQo+IA0KPiA+DQo+ID4gSW4gZ2Vu ZXJhbCwgdGhpcyBzZWVtcyBmcmFnaWxlIGFzIHRoZSBkdCBhZGRyZXNzIHJhbmdlcy90cmFuc2xh dGlvbg0KPiA+IG1heSBub3QgYWxpZ24gd2l0aCB0aGUgaC93IHJhbmdlcy4gRm9yIGV4YW1wbGUs IHdoYXQgaWYgeW91IGhhdmUgMg0KPiA+IGxldmVscyBvZiB0cmFuc2xhdGlvbnMgYW5kIHlvdSBo YXBwZW4gdG8gbmVlZCBpdCB0cmFuc2xhdGVkIHdpdGgganVzdA0KPiA+IDEgbGV2ZWwgb2YgdHJh bnNsYXRpb24uIFRoYXQgc2FpZCwgSSBkb24ndCByZWFsbHkgaGF2ZSBhIGJldHRlcg0KPiA+IHN1 Z2dlc3Rpb24gYW5kIEkgZ3Vlc3Mgd2UgY2FuIGRlYWwgd2l0aCB0aGF0IGNhc2UgaWYgbmVlZGVk IGxhdGVyLg0KPiANCj4gT2sgc28sIHdlJ2xsIGxlYXZlIGl0IGxpa2UgdGhpcyBmb3Igbm93DQo+ IA0KPiA+DQo+ID4gPiAgICAgICAgIHJhbmdlLT5zaXplID0gb2ZfcmVhZF9udW1iZXIocGFyc2Vy LT5yYW5nZSArIHBhcnNlci0+cG5hICsNCj4gbmEsDQo+ID4gbnMpOw0KPiA+ID4NCj4gPiA+ICAg ICAgICAgcGFyc2VyLT5yYW5nZSArPSBwYXJzZXItPm5wOw0KPiA+ID4gZGlmZiAtLWdpdCBhL2Ry aXZlcnMvb2Yvb2ZfcGNpLmMgYi9kcml2ZXJzL29mL29mX3BjaS5jDQo+ID4gPiBpbmRleCA1NzUx ZGM1Li4yY2NjNzQ5IDEwMDY0NA0KPiA+ID4gLS0tIGEvZHJpdmVycy9vZi9vZl9wY2kuYw0KPiA+ ID4gKysrIGIvZHJpdmVycy9vZi9vZl9wY2kuYw0KPiA+ID4gQEAgLTE5OCw2ICsxOTgsNyBAQCBp bnQgb2ZfcGNpX2dldF9ob3N0X2JyaWRnZV9yZXNvdXJjZXMoc3RydWN0DQo+ID4gZGV2aWNlX25v ZGUgKmRldiwNCj4gPiA+DQo+ID4gPiAgICAgICAgIHByX2RlYnVnKCJQYXJzaW5nIHJhbmdlcyBw cm9wZXJ0eS4uLlxuIik7DQo+ID4gPiAgICAgICAgIGZvcl9lYWNoX29mX3BjaV9yYW5nZSgmcGFy c2VyLCAmcmFuZ2UpIHsNCj4gPiA+ICsgICAgICAgICAgICAgICBzdHJ1Y3QgcmVzb3VyY2VfZW50 cnkgKmVudHJ5Ow0KPiA+ID4gICAgICAgICAgICAgICAgIC8qIFJlYWQgbmV4dCByYW5nZXMgZWxl bWVudCAqLw0KPiA+ID4gICAgICAgICAgICAgICAgIGlmICgocmFuZ2UuZmxhZ3MgJiBJT1JFU09V UkNFX1RZUEVfQklUUykgPT0NCj4gPiBJT1JFU09VUkNFX0lPKQ0KPiA+ID4gICAgICAgICAgICAg ICAgICAgICAgICAgc25wcmludGYocmFuZ2VfdHlwZSwgNCwgIiBJTyIpOw0KPiA+ID4gQEAgLTI0 MCw2ICsyNDEsOSBAQCBpbnQgb2ZfcGNpX2dldF9ob3N0X2JyaWRnZV9yZXNvdXJjZXMoc3RydWN0 DQo+ID4gZGV2aWNlX25vZGUgKmRldiwNCj4gPiA+ICAgICAgICAgICAgICAgICB9DQo+ID4gPg0K PiA+ID4gICAgICAgICAgICAgICAgIHBjaV9hZGRfcmVzb3VyY2Vfb2Zmc2V0KHJlc291cmNlcywg cmVzLCByZXMtPnN0YXJ0DQo+IC0NCj4gPiByYW5nZS5wY2lfYWRkcik7DQo+ID4gPiArICAgICAg ICAgICAgICAgZW50cnkgPSBsaXN0X2xhc3RfZW50cnkocmVzb3VyY2VzLCBzdHJ1Y3QNCj4gPiBy ZXNvdXJjZV9lbnRyeSwgbm9kZSk7DQo+ID4gPiArICAgICAgICAgICAgICAgLyp3ZSBhcmUgdXNp bmcgX19yZXMgZm9yIHN0b3JpbmcgdGhlIFBDSSBjb250cm9sbGVyDQo+ID4gYWRkcmVzcyovDQo+ ID4gPiArICAgICAgICAgICAgICAgZW50cnktPl9fcmVzLnN0YXJ0ID0gcmFuZ2UucGNpX2N0cmxf YWRkcjsNCj4gPg0KPiA+IFlvdSB3aWxsIHVzZSB0aGlzIGluIGEgZm9sbG93LXVwIHBhdGNoPyBJ J2QgbGlrZSB0byBzZWUgdGhpcyBqdXN0DQo+ID4gc3BsaXQgaW50byBjb3JlIGNoYW5nZXMgYW5k IERXIGNoYW5nZXMuIFRoaXMgbG9va3MgbGlrZSB5b3UgYXJlDQo+IG1ha2luZw0KPiA+IGludGVy bWVkaWF0ZSBEVyBjaGFuZ2VzIHdoaWNoIHdpbGwgYmUgcmVtb3ZlZCBpbiBzdWJzZXF1ZW50IHBh dGNoZXMuDQoNCk9rIEkgd2lsbCBzcGxpdCBpdA0KDQpUaGUgY2hhbmdlcyBpbiAiZHJpdmVycy9w Y2kvaG9zdC9wY2llLWRlc2lnbndhcmUuYyIgY2FuIGJlIHJlbW92ZWQgZnJvbSB0aGlzIHBhdGNo OyB3ZSBjYW4gbW9kaWZ5IGRpcmVjdGx5IA0KIltQQVRDSCB2MiAyLzRdIFBDSTogZGVzaWdud2Fy ZTogQWRkIEFSTTY0IHN1cHBvcnQiIGluIHYzIHBhdGNoc2V0DQoNCj4gPg0KPiA+IFJvYg0K -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/of/address.c b/drivers/of/address.c index 8bfda6a..52f9321 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c @@ -265,6 +265,7 @@ struct of_pci_range *of_pci_range_parser_one(struct of_pci_range_parser *parser, range->pci_addr = of_read_number(parser->range + 1, ns); range->cpu_addr = of_translate_address(parser->node, parser->range + na); + range->pci_ctrl_addr = of_read_number(parser->range + na, ns); range->size = of_read_number(parser->range + parser->pna + na, ns); parser->range += parser->np; diff --git a/drivers/of/of_pci.c b/drivers/of/of_pci.c index 5751dc5..2ccc749 100644 --- a/drivers/of/of_pci.c +++ b/drivers/of/of_pci.c @@ -198,6 +198,7 @@ int of_pci_get_host_bridge_resources(struct device_node *dev, pr_debug("Parsing ranges property...\n"); for_each_of_pci_range(&parser, &range) { + struct resource_entry *entry; /* Read next ranges element */ if ((range.flags & IORESOURCE_TYPE_BITS) == IORESOURCE_IO) snprintf(range_type, 4, " IO"); @@ -240,6 +241,9 @@ int of_pci_get_host_bridge_resources(struct device_node *dev, } pci_add_resource_offset(resources, res, res->start - range.pci_addr); + entry = list_last_entry(resources, struct resource_entry, node); + /*we are using __res for storing the PCI controller address*/ + entry->__res.start = range.pci_ctrl_addr; } return 0; diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c index 69486be..106dae6 100644 --- a/drivers/pci/host/pcie-designware.c +++ b/drivers/pci/host/pcie-designware.c @@ -416,8 +416,7 @@ int dw_pcie_host_init(struct pcie_port *pp) pp->io_base = range.cpu_addr; /* Find the untranslated IO space address */ - pp->io_mod_base = of_read_number(parser.range - - parser.np + na, ns); + pp->io_mod_base = range.pci_ctrl_addr; } if (restype == IORESOURCE_MEM) { of_pci_range_to_resource(&range, np, &pp->mem); @@ -426,8 +425,7 @@ int dw_pcie_host_init(struct pcie_port *pp) pp->mem_bus_addr = range.pci_addr; /* Find the untranslated MEM space address */ - pp->mem_mod_base = of_read_number(parser.range - - parser.np + na, ns); + pp->mem_mod_base = range.pci_ctrl_addr; } if (restype == 0) { of_pci_range_to_resource(&range, np, &pp->cfg); @@ -437,8 +435,7 @@ int dw_pcie_host_init(struct pcie_port *pp) pp->cfg1_base = pp->cfg.start + pp->cfg0_size; /* Find the untranslated configuration space address */ - pp->cfg0_mod_base = of_read_number(parser.range - - parser.np + na, ns); + pp->cfg0_mod_base = range.pci_ctrl_addr; pp->cfg1_mod_base = pp->cfg0_mod_base + pp->cfg0_size; } diff --git a/include/linux/of_address.h b/include/linux/of_address.h index d88e81b..55bb1ae 100644 --- a/include/linux/of_address.h +++ b/include/linux/of_address.h @@ -16,6 +16,7 @@ struct of_pci_range { u32 pci_space; u64 pci_addr; u64 cpu_addr; + u64 pci_ctrl_addr; u64 size; u32 flags; };