Thread (32 messages) 32 messages, 10 authors, 2020-12-10

Re: [PATCH v6 0/5] PCI: Unify ECAM constants in native PCI Express drivers

From: Bjorn Helgaas <helgaas@kernel.org>
Date: 2020-12-09 14:58:26
Also in: linux-arm-kernel, linux-pci, linux-rockchip
Subsystem: pci subsystem, the rest · Maintainers: Bjorn Helgaas, Linus Torvalds

On Wed, Dec 09, 2020 at 02:08:00PM +0100, Michael Walle wrote:
[+ Vladimir and Alex]

Am 2020-12-09 13:36, schrieb Bjorn Helgaas:
quoted
On Tue, Dec 08, 2020 at 04:41:50PM +0100, Michael Walle wrote:
quoted
quoted
On Sun, 29 Nov 2020 23:07:38 +0000, Krzysztof Wilczyński wrote:
quoted
Unify ECAM-related constants into a single set of standard constants
defining memory address shift values for the byte-level address that can
be used when accessing the PCI Express Configuration Space, and then
move native PCI Express controller drivers to use newly introduced
definitions retiring any driver-specific ones.

The ECAM ("Enhanced Configuration Access Mechanism") is defined by the
PCI Express specification (see PCI Express Base Specification, Revision
5.0, Version 1.0, Section 7.2.2, p. 676), thus most hardware should
implement it the same way.

[...]
Applied to pci/ecam, thanks!

[1/5] PCI: Unify ECAM constants in native PCI Express drivers
     https://git.kernel.org/lpieralisi/pci/c/f3c07cf692
quoted
Patch 1/5 breaks LS1028A boards:

[..]
[    1.144426] pci-host-generic 1f0000000.pcie: host bridge
/soc/pcie@1f0000000 ranges:
[    1.152276] pci-host-generic 1f0000000.pcie:      MEM
0x01f8000000..0x01f815ffff -> 0x0000000000
[    1.161161] pci-host-generic 1f0000000.pcie:      MEM
0x01f8160000..0x01f81cffff -> 0x0000000000
[    1.170043] pci-host-generic 1f0000000.pcie:      MEM
0x01f81d0000..0x01f81effff -> 0x0000000000
[    1.178924] pci-host-generic 1f0000000.pcie:      MEM
0x01f81f0000..0x01f820ffff -> 0x0000000000
[    1.187805] pci-host-generic 1f0000000.pcie:      MEM
0x01f8210000..0x01f822ffff -> 0x0000000000
[    1.196686] pci-host-generic 1f0000000.pcie:      MEM
0x01f8230000..0x01f824ffff -> 0x0000000000
[    1.205562] pci-host-generic 1f0000000.pcie:      MEM
0x01fc000000..0x01fc3fffff -> 0x0000000000
Can you attach your DT?
That would be the following:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm64/boot/dts/freescale/fsl-ls1028a-kontron-sl28-var3-ads2.dts

You'll find the PCI devices/bridge in:
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi
quoted
The fact that all these windows map to PCI
bus address 0 looks broken.  Prior to patch 1/5, do the devices below
this bridge actually work?
Yes, these should be the onboard network controller and ethernet
switch.
Interesting.  I can't see how they could work with those address
mappings, but that's another question we can look at later.
quoted
Looks like you're using the pci-host-generic driver; which of the
.compatible strings (pci-host-cam-generic, pci-host-ecam-generic,
marvell,armada8k-pcie-ecam, etc) are you using?  (I think that's in
the DT as well.)
compatible = "pci-host-ecam-generic";
-michael
Can you try the following just to get started?
diff --git a/drivers/pci/access.c b/drivers/pci/access.c
index 46935695cfb9..569a45727bc7 100644
--- a/drivers/pci/access.c
+++ b/drivers/pci/access.c
@@ -79,6 +79,7 @@ int pci_generic_config_read(struct pci_bus *bus, unsigned int devfn,
 {
 	void __iomem *addr;
 
+	pci_info(bus, "%s(%#x %#05x %d)\n", __func__, devfn, where, size);
 	addr = bus->ops->map_bus(bus, devfn, where);
 	if (!addr) {
 		*val = ~0;
@@ -101,6 +102,7 @@ int pci_generic_config_write(struct pci_bus *bus, unsigned int devfn,
 {
 	void __iomem *addr;
 
+	pci_info(bus, "%s(%#x %#05x %d)\n", __func__, devfn, where, size);
 	addr = bus->ops->map_bus(bus, devfn, where);
 	if (!addr)
 		return PCIBIOS_DEVICE_NOT_FOUND;
diff --git a/drivers/pci/ecam.c b/drivers/pci/ecam.c
index 59f91d434859..78f776e590be 100644
--- a/drivers/pci/ecam.c
+++ b/drivers/pci/ecam.c
@@ -33,6 +33,8 @@ struct pci_config_window *pci_ecam_create(struct device *dev,
 	struct resource *conflict;
 	int i, err;
 
+	dev_info(dev, "%s cfg %pR bus %pR\n", __func__, cfgres, busr);
+
 	if (busr->start > busr->end)
 		return ERR_PTR(-EINVAL);
 
@@ -85,6 +87,9 @@ struct pci_config_window *pci_ecam_create(struct device *dev,
 			goto err_exit_iomap;
 	}
 
+	dev_info(dev, "%s per_bus_mapping %d win %px\n", __func__,
+		 per_bus_mapping, cfg->win);
+
 	if (ops->init) {
 		err = ops->init(cfg);
 		if (err)
@@ -140,6 +145,8 @@ void __iomem *pci_ecam_map_bus(struct pci_bus *bus, unsigned int devfn,
 	if (busn < cfg->busr.start || busn > cfg->busr.end)
 		return NULL;
 
+	pci_info(bus, "%s(%#x %#05x): %pR\n", __func__, devfn, where,
+		 &cfg->busr);
 	busn -= cfg->busr.start;
 	if (per_bus_mapping) {
 		base = cfg->winp[busn];
@@ -147,6 +154,8 @@ void __iomem *pci_ecam_map_bus(struct pci_bus *bus, unsigned int devfn,
 	} else
 		base = cfg->win;
 
+	pci_info(bus, "%s base %px bus_shift %d\n", __func__, base,
+		 cfg->ops->bus_shift);
 	if (cfg->ops->bus_shift) {
 		bus_offset = (busn & PCIE_ECAM_BUS_MASK) << bus_shift;
 		devfn_offset = (devfn & PCIE_ECAM_DEVFN_MASK) << devfn_shift;
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help