Skip to contentSkip to conversation

PCI: designware: check for iATU unroll support after initializing host

PATCH In review Niklas Cassel 5 participants 5 messages Oct 14, 2016 – Nov 2, 2016 PCI

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 PCI: designware: check for iATU unroll support after initializing host

From: Niklas Cassel <[email protected]>

dw_pcie_iatu_unroll_enabled reads a dbi_base register. Reading any dbi_base register before pp->ops->host_init has been called causes "imprecise external abort" on platforms like ARTPEC-6, where the PCIe module is disabled at boot and first enabled in pp->ops->host_init. Move dw_pcie_iatu_unroll_enabled to dw_pcie_setup_rc, since it is after pp->ops->host_init, but before pp->iatu_unroll_enabled is actually used.

Fixes a0601a470537 ("PCI: designware: Add iATU Unroll feature")
---
 drivers/pci/host/pcie-designware.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/pci/host/pcie-designware.c +5 -2
index 035f50c03281..bed19994c1e9 100644
@@ -637,8 +637,6 @@ int dw_pcie_host_init(struct pcie_port *pp)
 		}
 	}
 
-	pp->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pp);
-
 	if (pp->ops->host_init)
 		pp->ops->host_init(pp);
 
@@ -809,6 +807,11 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
 {
 	u32 val;
 
+	/* get iATU unroll support */
+	pp->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pp);
+	dev_dbg(pp->dev, "iATU unroll: %s\n",
+		pp->iatu_unroll_enabled ? "enabled" : "disabled");
+
 	/* set the number of lanes */
 	val = dw_pcie_readl_rc(pp, PCIE_PORT_LINK_CONTROL);
 	val &= ~PORT_LINK_MODE_MASK;
Signature · 1 line
2.1.4
Acked-by on v1 1/1
#1 lore raw
Quoted 31 lines · Niklas Cassel

From: Niklas Cassel <[email protected]>

dw_pcie_iatu_unroll_enabled reads a dbi_base register. Reading any dbi_base register before pp->ops->host_init has been called causes "imprecise external abort" on platforms like ARTPEC-6, where the PCIe module is disabled at boot and first enabled in pp->ops->host_init. Move dw_pcie_iatu_unroll_enabled to dw_pcie_setup_rc, since it is after pp->ops->host_init, but before pp->iatu_unroll_enabled is actually used.

Fixes a0601a470537 ("PCI: designware: Add iATU Unroll feature")
---
 drivers/pci/host/pcie-designware.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/pci/host/pcie-designware.c +0 -2
index 035f50c03281..bed19994c1e9 100644
@@ -637,8 +637,6 @@ int dw_pcie_host_init(struct pcie_port *pp)
 		}
 	}
 
-	pp->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pp);
-
 	if (pp->ops->host_init)
 		pp->ops->host_init(pp);
 
@@ -809,6 +807,11 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
 {

drivers/pci/host/pcie-designware.c void dw_pcie_setup_rc(struct pcie_port *pp) · line 817

Quoted 10 lines
drivers/pci/host/pcie-designware.c +5 -0
 	u32 val;
 
+	/* get iATU unroll support */
+	pp->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pp);
+	dev_dbg(pp->dev, "iATU unroll: %s\n",
+		pp->iatu_unroll_enabled ? "enabled" : "disabled");
+
 	/* set the number of lanes */
 	val = dw_pcie_readl_rc(pp, PCIE_PORT_LINK_CONTROL);
 	val &= ~PORT_LINK_MODE_MASK;

Thanks
Joao

Tested-by on v1 1/1
#2 lore raw
In reply to Niklas Cassel
Quoted 10 lines · On Fri, 14 Oct 2016 23:54:55 +0200 Niklas Cassel <[email protected]> wrote:

From: Niklas Cassel <[email protected]>

dw_pcie_iatu_unroll_enabled reads a dbi_base register. Reading any dbi_base register before pp->ops->host_init has been called causes "imprecise external abort" on platforms like ARTPEC-6, where the PCIe module is disabled at boot and first enabled in pp->ops->host_init. Move dw_pcie_iatu_unroll_enabled to dw_pcie_setup_rc, since it is after pp->ops->host_init, but before pp->iatu_unroll_enabled is actually used.

Quoted 3 lines
Fixes a0601a470537 ("PCI: designware: Add iATU Unroll feature")

My Utilite Pro was failing to boot and this fixed it so thanks.

Quoted 29 lines
---
 drivers/pci/host/pcie-designware.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
(quoted diff) +0 -0

b/drivers/pci/host/pcie-designware.c index 035f50c03281..bed19994c1e9 100644 --- a/drivers/pci/host/pcie-designware.c
+++ b/drivers/pci/host/pcie-designware.c

drivers/pci/host/pcie-designware.c +5 -2
@@ -637,8 +637,6 @@ int dw_pcie_host_init(struct pcie_port *pp)
 		}
 	}
 
-	pp->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pp);
-
 	if (pp->ops->host_init)
 		pp->ops->host_init(pp);
 
@@ -809,6 +807,11 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
 {
 	u32 val;
 
+	/* get iATU unroll support */
+	pp->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pp);
+	dev_dbg(pp->dev, "iATU unroll: %s\n",
+		pp->iatu_unroll_enabled ? "enabled" : "disabled");
+
 	/* set the number of lanes */
 	val = dw_pcie_readl_rc(pp, PCIE_PORT_LINK_CONTROL);
 	val &= ~PORT_LINK_MODE_MASK;
Acked-by on v1 1/1
#3 lore raw
In reply to Niklas Cassel

Hi,

Quoted 11 lines · Niklas Cassel

From: Niklas Cassel <[email protected]>

dw_pcie_iatu_unroll_enabled reads a dbi_base register. Reading any dbi_base register before pp->ops->host_init has been called causes "imprecise external abort" on platforms like ARTPEC-6, where the PCIe module is disabled at boot and first enabled in pp->ops->host_init. Move dw_pcie_iatu_unroll_enabled to dw_pcie_setup_rc, since it is after pp->ops->host_init, but before pp->iatu_unroll_enabled is actually used.

Fixes a0601a470537 ("PCI: designware: Add iATU Unroll feature")

This fixes the regression I've seen on i.MX6 devices in my board farm as well.

Bjorn, can you please pick this up and get it sent up for 4.9-rc soon? I worry about losing bisectability if this remains broken for a while. Thanks!

-Olof

#4 lore raw
In reply to Niklas Cassel
Quoted 11 lines · Niklas Cassel

From: Niklas Cassel <[email protected]>

dw_pcie_iatu_unroll_enabled reads a dbi_base register. Reading any dbi_base register before pp->ops->host_init has been called causes "imprecise external abort" on platforms like ARTPEC-6, where the PCIe module is disabled at boot and first enabled in pp->ops->host_init. Move dw_pcie_iatu_unroll_enabled to dw_pcie_setup_rc, since it is after pp->ops->host_init, but before pp->iatu_unroll_enabled is actually used.

Fixes a0601a470537 ("PCI: designware: Add iATU Unroll feature")

Applied to for-linus for v4.9 with acks and tested-by from Joao, Olof, and James, thanks!

Quoted 36 lines
---
 drivers/pci/host/pcie-designware.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/pci/host/pcie-designware.c +5 -2
index 035f50c03281..bed19994c1e9 100644
@@ -637,8 +637,6 @@ int dw_pcie_host_init(struct pcie_port *pp)
 		}
 	}
 
-	pp->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pp);
-
 	if (pp->ops->host_init)
 		pp->ops->host_init(pp);
 
@@ -809,6 +807,11 @@ void dw_pcie_setup_rc(struct pcie_port *pp)
 {
 	u32 val;
 
+	/* get iATU unroll support */
+	pp->iatu_unroll_enabled = dw_pcie_iatu_unroll_enabled(pp);
+	dev_dbg(pp->dev, "iATU unroll: %s\n",
+		pp->iatu_unroll_enabled ? "enabled" : "disabled");
+
 	/* set the number of lanes */
 	val = dw_pcie_readl_rc(pp, PCIE_PORT_LINK_CONTROL);
 	val &= ~PORT_LINK_MODE_MASK;
Signature · 6 lines
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html