summaryrefslogtreecommitdiff
path: root/drivers/pci
diff options
context:
space:
mode:
authorOleksandr Suvorov <oleksandr.suvorov@toradex.com>2019-08-30 12:20:03 +0300
committerOleksandr Suvorov <oleksandr.suvorov@toradex.com>2019-09-02 11:53:34 +0300
commitdfe32b2cf59cf8d33e13a884381eeed7b88f13d2 (patch)
treec0126c3a34ec59aac76ac659f9c0929ab210eba7 /drivers/pci
parenta9038a0051a24653ecd324ed1230a2f334e646a4 (diff)
PCI: imx: fix crash on system suspend
The driver tries to modify registers after disable important clocks. This causes the crash a driver: [ 67.083289] Synchronous External Abort: synchronous external abort (0x96000210) at 0xffff00000d9c0008 [ 67.092620] Internal error: : 96000210 [#1] PREEMPT SMP [ 67.097935] Modules linked in: 8021q garp stp mrp crc32_ce crct10dif_ce mwifiex_pcie mwifiex galcore(O) [ 67.107447] Process sh (pid: 4032, stack limit = 0xffff00001a668000) [ 67.113897] CPU: 3 PID: 4032 Comm: sh Tainted: G O 4.14.117-3.0.2+ge43e3a26e1b7 #1 [ 67.122691] Hardware name: Toradex Colibri iMX8QXP/DX on Colibri Evaluation Board V3 (DT) [ 67.130963] task: ffff8000761b4380 task.stack: ffff00001a668000 [ 67.136983] PC is at regmap_mmio_read32le+0x8/0x20 [ 67.141866] LR is at regmap_mmio_read+0x2c/0x68 [ 67.146484] pc : [<ffff0000086db108>] lr : [<ffff0000086db1e4>] pstate: 000001c5 [ 67.153971] sp : ffff00001a66b990 [ 67.157372] x29: ffff00001a66b990 x28: 0000000000000000 [ 67.162778] x27: 0000000000000002 x26: ffff0000096de000 [ 67.168183] x25: 0000000000000000 x24: 0000000000000000 [ 67.173589] x23: 0000000000000200 x22: ffff00001a66ba4c [ 67.178994] x21: ffff80007ab83400 x20: ffff00001a66ba4c [ 67.184400] x19: ffff80007aab0680 x18: 0000000000000001 [ 67.189805] x17: 0000ffff8d856160 x16: 0000000000000000 [ 67.195210] x15: 0000000000000010 x14: ffff80007ff6bd80 [ 67.200615] x13: 0000000000000004 x12: 0000000000000000 [ 67.206023] x11: 0000000000000001 x10: 0000000000000980 [ 67.211428] x9 : ffff00001a66b920 x8 : ffff8000761b4d60 [ 67.216833] x7 : 0000000000000004 x6 : 0000000000000000 [ 67.222238] x5 : 0000000000000000 x4 : 0000000000000000 [ 67.227644] x3 : ffff0000086db1b8 x2 : ffff0000086db100 [ 67.233047] x1 : 00000000000c0008 x0 : ffff00000d9c0008 [ 67.238454] Call trace: [ 67.240987] Exception stack(0xffff00001a66b850 to 0xffff00001a66b990) [ 67.247521] b840: ffff00000d9c0008 00000000000c0008 [ 67.255448] b860: ffff0000086db100 ffff0000086db1b8 0000000000000000 0000000000000000 [ 67.263373] b880: 0000000000000000 0000000000000004 ffff8000761b4d60 ffff00001a66b920 [ 67.271300] b8a0: 0000000000000980 0000000000000001 0000000000000000 0000000000000004 [ 67.279226] b8c0: ffff80007ff6bd80 0000000000000010 0000000000000000 0000ffff8d856160 [ 67.287152] b8e0: 0000000000000001 ffff80007aab0680 ffff00001a66ba4c ffff80007ab83400 [ 67.295079] b900: ffff00001a66ba4c 0000000000000200 0000000000000000 0000000000000000 [ 67.303005] b920: ffff0000096de000 0000000000000002 0000000000000000 ffff00001a66b990 [ 67.310932] b940: ffff0000086db1e4 ffff00001a66b990 ffff0000086db108 00000000000001c5 [ 67.318858] b960: ffff80007ab838f0 0000000000000000 0000ffffffffffff 0000000000000002 [ 67.326785] b980: ffff00001a66b990 ffff0000086db108 [ 67.331756] [<ffff0000086db108>] regmap_mmio_read32le+0x8/0x20 [ 67.337681] [<ffff0000086d4134>] _regmap_bus_reg_read+0x14/0x20 [ 67.343693] [<ffff0000086d5a40>] _regmap_read+0x60/0xe0 [ 67.349011] [<ffff0000086d5e34>] _regmap_update_bits+0x9c/0xe8 [ 67.354937] [<ffff0000086d6e58>] regmap_update_bits_base+0x60/0x90 [ 67.361214] [<ffff0000084de284>] pci_imx_suspend_noirq+0x1dc/0x270 [ 67.367490] [<ffff0000086c0f30>] pm_generic_suspend_noirq+0x28/0x40 [ 67.373853] [<ffff0000086ce250>] genpd_finish_suspend+0xd0/0xf8 [ 67.379865] [<ffff0000086ce2a0>] pm_genpd_suspend_noirq+0x10/0x18 [ 67.386052] [<ffff0000086c5670>] dpm_run_callback.isra.7+0x40/0xa0 [ 67.392326] [<ffff0000086c5ca8>] __device_suspend_noirq+0xb0/0x148 [ 67.398598] [<ffff0000086c6f78>] dpm_noirq_suspend_devices+0x100/0x200 [ 67.405220] [<ffff0000086c709c>] dpm_suspend_noirq+0x24/0x60 [ 67.410975] [<ffff0000081122ec>] suspend_devices_and_enter+0x144/0x560 [ 67.417595] [<ffff000008112a14>] pm_suspend+0x30c/0x354 [ 67.422913] [<ffff0000081114d8>] state_store+0x88/0xf8 [ 67.428146] [<ffff000008d5c92c>] kobj_attr_store+0x14/0x28 [ 67.433727] [<ffff000008287b90>] sysfs_kf_write+0x40/0x58 [ 67.439219] [<ffff000008286e54>] kernfs_fop_write+0xcc/0x1e0 [ 67.444975] [<ffff00000820b1e8>] __vfs_write+0x18/0x118 [ 67.450292] [<ffff00000820b4d4>] vfs_write+0xa4/0x1a8 [ 67.455438] [<ffff00000820b77c>] SyS_write+0x44/0xa0 [ 67.460492] Exception stack(0xffff00001a66bec0 to 0xffff00001a66c000) [ 67.467028] bec0: 0000000000000001 0000aaaacb49e7d0 0000000000000004 0000ffffb585cf68 [ 67.474953] bee0: 0000000000000000 5551000454000000 0000000000000003 000000000000006d [ 67.482883] bf00: 0000000000000040 0000000000000001 0000ffffc12f3c30 0000000000000000 [ 67.490808] bf20: 0000000000000000 0000000000000018 0000000000000001 0000000000000008 [ 67.498736] bf40: 0000aaaab6c698e8 0000ffffb575c540 0000000000000fff 0000000000000001 [ 67.506663] bf60: 0000aaaacb49e7d0 0000ffffb5859588 0000000000000004 0000aaaacb49e7d0 [ 67.514591] bf80: 0000000000000004 0000ffffb5859670 0000aaaab6c32000 0000000000000000 [ 67.522519] bfa0: 0000aaaab6c6a000 0000ffffc12f3c70 0000ffffb575f930 0000ffffc12f3c70 [ 67.530444] bfc0: 0000ffffb57b13dc 0000000020000000 0000000000000001 0000000000000040 [ 67.538371] bfe0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000 [ 67.546300] [<ffff000008083b18>] __sys_trace_return+0x0/0x4 [ 67.551968] Code: b5000001 d65f03c0 f9400000 8b214000 (b9400000) [ 67.558157] ---[ end trace 72215c33ce658969 ]--- Using runtime PM across suspend/resume fixes this crash. Still need to convert all clock work into runtime PM carefully. Signed-off-by: Oleksandr Suvorov <oleksandr.suvorov@toradex.com>
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/dwc/pci-imx6.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/pci/dwc/pci-imx6.c b/drivers/pci/dwc/pci-imx6.c
index 093646780cac..7855ded3102f 100644
--- a/drivers/pci/dwc/pci-imx6.c
+++ b/drivers/pci/dwc/pci-imx6.c
@@ -642,7 +642,6 @@ static int imx_pcie_enable_ref_clk(struct imx_pcie *imx_pcie)
ret = clk_prepare_enable(imx_pcie->pcie_inbound_axi);
if (ret)
dev_err(dev, "unable to enable pcie_axi clock\n");
-
break;
}
@@ -2079,6 +2078,8 @@ static int pci_imx_suspend_noirq(struct device *dev)
IMX6Q_GPR1_PCIE_TEST_PD,
IMX6Q_GPR1_PCIE_TEST_PD);
} else {
+ pm_runtime_put_sync(dev);
+
pci_imx_clk_disable(dev);
imx_pcie_phy_pwr_dn(imx_pcie);
@@ -2147,6 +2148,8 @@ static int pci_imx_resume_noirq(struct device *dev)
regmap_update_bits(imx_pcie->iomuxc_gpr, IOMUXC_GPR1,
IMX6Q_GPR1_PCIE_TEST_PD, 0);
} else {
+ pm_runtime_get_sync(dev);
+
pci_imx_ltssm_disable(dev);
imx_pcie_assert_core_reset(imx_pcie);
imx_pcie_init_phy(imx_pcie);
@@ -2808,6 +2811,8 @@ static int imx_pcie_probe(struct platform_device *pdev)
&& (imx_pcie->hard_wired == 0))
imx_pcie_regions_setup(&pdev->dev);
}
+ pm_runtime_get_sync(&pdev->dev);
+
return 0;
}
@@ -2818,6 +2823,8 @@ static void imx_pcie_shutdown(struct platform_device *pdev)
/* bring down link, so bootloader gets clean state in case of reboot */
if (imx_pcie->variant == IMX6Q)
imx_pcie_assert_core_reset(imx_pcie);
+
+ pm_runtime_put_sync(&pdev->dev);
}
static const struct of_device_id imx_pcie_of_match[] = {