diff mbox series

PCI: dwc: move dw_pcie_iatu_detect() after host_init callback

Message ID 20210407131255.702054-1-dmitry.baryshkov@linaro.org
State New
Headers show
Series PCI: dwc: move dw_pcie_iatu_detect() after host_init callback | expand

Commit Message

Dmitry Baryshkov April 7, 2021, 1:12 p.m. UTC
The commit 9ea483375ded ("PCI: dwc: Move forward the iATU detection
process") broke PCIe support on Qualcomm SM8250 (and maybe other
platforms) since it moves the call to dw_pcie_iatu_detect() at the
beginning of the dw_pcie_host_init(), before ops->host_init() callback.
Accessing PCIe registers at this point causes the board to reboot since
not all clocks are enabled, making PCIe registers unavailable.

Move dw_pcie_iatu_detect() call after calling ops->host_init() callback,
so that all register are accessible.

Cc: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
Fixes: 9ea483375ded ("PCI: dwc: Move forward the iATU detection process")
Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/pci/controller/dwc/pcie-designware-host.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

Comments

Dmitry Baryshkov April 7, 2021, 1:37 p.m. UTC | #1
Hi,

On Wed, 7 Apr 2021 at 16:12, Dmitry Baryshkov
<dmitry.baryshkov@linaro.org> wrote:
>
> The commit 9ea483375ded ("PCI: dwc: Move forward the iATU detection
> process") broke PCIe support on Qualcomm SM8250 (and maybe other
> platforms) since it moves the call to dw_pcie_iatu_detect() at the
> beginning of the dw_pcie_host_init(), before ops->host_init() callback.
> Accessing PCIe registers at this point causes the board to reboot since
> not all clocks are enabled, making PCIe registers unavailable.
>
> Move dw_pcie_iatu_detect() call after calling ops->host_init() callback,
> so that all register are accessible.
>
> Cc: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> Fixes: 9ea483375ded ("PCI: dwc: Move forward the iATU detection process")

Please disregard the Fixes: tag here, the patch in question came to me
from a local tree, which I failed to notice.
The patch still applies on top of the previously dropped patch (and it
is the same fix as the one proposed for exynos by Marek Szyprowski at
https://lore.kernel.org/linux-pci/b777ab31-e0b9-bbc0-9631-72b93097919e@samsung.com/.

> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> ---
>  drivers/pci/controller/dwc/pcie-designware-host.c | 3 +--
>  1 file changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> index 52f6887179cd..24192b40e3a2 100644
> --- a/drivers/pci/controller/dwc/pcie-designware-host.c
> +++ b/drivers/pci/controller/dwc/pcie-designware-host.c
> @@ -319,8 +319,6 @@ int dw_pcie_host_init(struct pcie_port *pp)
>                         return PTR_ERR(pci->dbi_base);
>         }
>
> -       dw_pcie_iatu_detect(pci);
> -
>         bridge = devm_pci_alloc_host_bridge(dev, 0);
>         if (!bridge)
>                 return -ENOMEM;
> @@ -400,6 +398,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
>                 if (ret)
>                         goto err_free_msi;
>         }
> +       dw_pcie_iatu_detect(pci);
>
>         dw_pcie_setup_rc(pp);
>         dw_pcie_msi_init(pp);
> --
> 2.30.2
>
Lorenzo Pieralisi April 13, 2021, 10:21 a.m. UTC | #2
On Wed, Apr 07, 2021 at 04:37:15PM +0300, Dmitry Baryshkov wrote:
> Hi,
> 
> On Wed, 7 Apr 2021 at 16:12, Dmitry Baryshkov
> <dmitry.baryshkov@linaro.org> wrote:
> >
> > The commit 9ea483375ded ("PCI: dwc: Move forward the iATU detection
> > process") broke PCIe support on Qualcomm SM8250 (and maybe other
> > platforms) since it moves the call to dw_pcie_iatu_detect() at the
> > beginning of the dw_pcie_host_init(), before ops->host_init() callback.
> > Accessing PCIe registers at this point causes the board to reboot since
> > not all clocks are enabled, making PCIe registers unavailable.
> >
> > Move dw_pcie_iatu_detect() call after calling ops->host_init() callback,
> > so that all register are accessible.
> >
> > Cc: Hou Zhiqiang <Zhiqiang.Hou@nxp.com>
> > Fixes: 9ea483375ded ("PCI: dwc: Move forward the iATU detection process")
> 
> Please disregard the Fixes: tag here, the patch in question came to me
> from a local tree, which I failed to notice.
> The patch still applies on top of the previously dropped patch (and it
> is the same fix as the one proposed for exynos by Marek Szyprowski at
> https://lore.kernel.org/linux-pci/b777ab31-e0b9-bbc0-9631-72b93097919e@samsung.com/.

Ok. Can you integrate Bjorn's changes (reported in the thread above) to
the commit log and resend it with Marek in CC so that I can merge it
please ?

Thanks,
Lorenzo

> > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> > ---
> >  drivers/pci/controller/dwc/pcie-designware-host.c | 3 +--
> >  1 file changed, 1 insertion(+), 2 deletions(-)
> >
> > diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
> > index 52f6887179cd..24192b40e3a2 100644
> > --- a/drivers/pci/controller/dwc/pcie-designware-host.c
> > +++ b/drivers/pci/controller/dwc/pcie-designware-host.c
> > @@ -319,8 +319,6 @@ int dw_pcie_host_init(struct pcie_port *pp)
> >                         return PTR_ERR(pci->dbi_base);
> >         }
> >
> > -       dw_pcie_iatu_detect(pci);
> > -
> >         bridge = devm_pci_alloc_host_bridge(dev, 0);
> >         if (!bridge)
> >                 return -ENOMEM;
> > @@ -400,6 +398,7 @@ int dw_pcie_host_init(struct pcie_port *pp)
> >                 if (ret)
> >                         goto err_free_msi;
> >         }
> > +       dw_pcie_iatu_detect(pci);
> >
> >         dw_pcie_setup_rc(pp);
> >         dw_pcie_msi_init(pp);
> > --
> > 2.30.2
> >
> 
> 
> -- 
> With best wishes
> Dmitry
diff mbox series

Patch

diff --git a/drivers/pci/controller/dwc/pcie-designware-host.c b/drivers/pci/controller/dwc/pcie-designware-host.c
index 52f6887179cd..24192b40e3a2 100644
--- a/drivers/pci/controller/dwc/pcie-designware-host.c
+++ b/drivers/pci/controller/dwc/pcie-designware-host.c
@@ -319,8 +319,6 @@  int dw_pcie_host_init(struct pcie_port *pp)
 			return PTR_ERR(pci->dbi_base);
 	}
 
-	dw_pcie_iatu_detect(pci);
-
 	bridge = devm_pci_alloc_host_bridge(dev, 0);
 	if (!bridge)
 		return -ENOMEM;
@@ -400,6 +398,7 @@  int dw_pcie_host_init(struct pcie_port *pp)
 		if (ret)
 			goto err_free_msi;
 	}
+	dw_pcie_iatu_detect(pci);
 
 	dw_pcie_setup_rc(pp);
 	dw_pcie_msi_init(pp);