Define the length of the DBI registers. This makes sure that
the kernel does not access registers beyond that point, avoiding
the following abort on a i.MX 6Quad:
  # cat /sys/devices/soc0/soc/1ffc000.pcie/pci0000\:00/0000\:00\:00.0/config
  [  100.021433] Unhandled fault: imprecise external abort (0x1406) at 
0xb6ea7000
  ...
  [  100.056423] PC is at dw_pcie_read+0x50/0x84
  [  100.060790] LR is at dw_pcie_rd_own_conf+0x44/0x48
  ...

Signed-off-by: Stefan Agner <ste...@agner.ch>
Reviewed-by: Lucas Stach <l.st...@pengutronix.de>
---
Changes in v3:
- Rebase on pci/dwc

 drivers/pci/controller/dwc/pci-imx6.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/pci/controller/dwc/pci-imx6.c 
b/drivers/pci/controller/dwc/pci-imx6.c
index cdcf54ff30fb..7015bda22aef 100644
--- a/drivers/pci/controller/dwc/pci-imx6.c
+++ b/drivers/pci/controller/dwc/pci-imx6.c
@@ -43,6 +43,7 @@ enum imx6_pcie_variants {
 
 struct imx6_pcie_drvdata {
        enum imx6_pcie_variants variant;
+       int                     dbi_length;
 };
 
 struct imx6_pcie {
@@ -981,6 +982,8 @@ static int imx6_pcie_probe(struct platform_device *pdev)
                break;
        }
 
+       pci->dbi_length = imx6_pcie->drvdata->dbi_length;
+
        /* Grab turnoff reset */
        imx6_pcie->turnoff_reset = 
devm_reset_control_get_optional_exclusive(dev, "turnoff");
        if (IS_ERR(imx6_pcie->turnoff_reset)) {
@@ -1052,7 +1055,7 @@ static void imx6_pcie_shutdown(struct platform_device 
*pdev)
 }
 
 static const struct imx6_pcie_drvdata drvdata[] = {
-       [IMX6Q] = { .variant = IMX6Q },
+       [IMX6Q] = { .variant = IMX6Q, .dbi_length = 0x15c },
        [IMX6SX] = { .variant = IMX6SX },
        [IMX6QP] = { .variant = IMX6QP },
        [IMX7D] = { .variant = IMX7D },
-- 
2.19.1

Reply via email to