diff options
author | Oleksandr Suvorov <oleksandr.suvorov@toradex.com> | 2019-08-30 12:20:03 +0300 |
---|---|---|
committer | Oleksandr Suvorov <oleksandr.suvorov@toradex.com> | 2019-09-02 11:53:34 +0300 |
commit | dfe32b2cf59cf8d33e13a884381eeed7b88f13d2 (patch) | |
tree | c0126c3a34ec59aac76ac659f9c0929ab210eba7 /drivers | |
parent | a9038a0051a24653ecd324ed1230a2f334e646a4 (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')
-rw-r--r-- | drivers/pci/dwc/pci-imx6.c | 9 |
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[] = { |