From 22dccf0395202d294feb4d60bd12c6686c8be1aa Mon Sep 17 00:00:00 2001 From: Simon Xue Date: Thu, 1 Dec 2022 10:17:54 +0800 Subject: [PATCH] iommu/rockchip: fix devm_free_irq RK3128 vop-iommu skip request the irq due to register read issue. So don't free irq when shut down or belowing error will output [ 102.107589] WARNING: CPU: 3 PID: 1013 at kernel/irq/devres.c:143 devm_free_irq+0x68/0x9c [ 102.115720] Modules linked in: [ 102.118862] CPU: 3 PID: 1013 Comm: init Not tainted 5.10.110 #15 [ 102.124907] Hardware name: Generic DT based system [ 102.129732] Backtrace: [ 102.132230] [] (dump_backtrace) from [] (show_stack+0x20/0x24) [ 102.139843] r7:600f0013 r6:c0e96442 r5:00000000 r4:c1219d6c [ 102.145553] [] (show_stack) from [] (dump_stack_lvl+0x94/0xac) [ 102.153171] [] (dump_stack_lvl) from [] (dump_stack+0x14/0x1c) [ 102.160780] r7:00000000 r6:00000000 r5:00000009 r4:c017ac34 [ 102.166488] [] (dump_stack) from [] (__warn+0xd4/0x100) [ 102.173497] [] (__warn) from [] (warn_slowpath_fmt+0x8c/0xc4) [ 102.181026] r9:00000000 r8:00000009 r7:c017ac34 r6:0000008f r5:c0df4ea4 r4:c353c000 [ 102.188820] [] (warn_slowpath_fmt) from [] (devm_free_irq+0x68/0x9c) [ 102.196962] r9:c0e44260 r8:c128d018 r7:c12ea690 r6:c1a17f40 r5:0000002e r4:c353c000 [ 102.204759] [] (devm_free_irq) from [] (rk_iommu_shutdown+0x58/0x5c) [ 102.212895] r6:c1a17f40 r5:00000001 r4:c197ec00 [ 102.217558] [] (rk_iommu_shutdown) from [] (platform_drv_shutdown+0x2c/0x30) [ 102.226385] r7:c12ea690 r6:c12285f0 r5:c197ec10 r4:c197ec14 [ 102.232094] [] (platform_drv_shutdown) from [] (device_shutdown+0x15c/0x1dc) [ 102.240938] [] (device_shutdown) from [] (kernel_restart_prepare+0x3c/0x48) [ 102.249684] r10:00000058 r9:01234567 r8:00000010 r7:c353c000 r6:4321fedc r5:c11168ec [ 102.257548] r4:00000000 [ 102.260124] [] (kernel_restart_prepare) from [] (kernel_restart+0x1c/0x60) [ 102.268785] [] (kernel_restart) from [] (__do_sys_reboot+0x154/0x1e0) [ 102.277004] r5:c11168ec r4:00000000 [ 102.280617] [] (__do_sys_reboot) from [] (sys_reboot+0x18/0x1c) [ 102.288326] r9:c353c000 r8:c01002c4 r7:00000058 r6:005241c4 r5:00524140 r4:00000000 [ 102.296121] [] (sys_reboot) from [] (ret_fast_syscall+0x0/0x54) [ 102.303821] Exception stack(0xc353dfa8 to 0xc353dff0) [ 102.308912] dfa0: 00000000 00524140 fee1dead 28121969 01234567 00000010 [ 102.317141] dfc0: 00000000 00524140 005241c4 00000058 beddbefc 0044b1a8 b6f39d00 b6f3a010 [ 102.325364] dfe0: 00523b5c beddbc90 004dadf4 b6e584c8 [ 102.330545] ---[ end trace adc766c58fa6634f ]--- [ 102.335275] ------------[ cut here ]------------ [ 102.339948] WARNING: CPU: 3 PID: 1013 at kernel/irq/manage.c:1756 free_irq+0x26c/0x29c [ 102.347907] Trying to free already-free IRQ 46 [ 102.352381] Modules linked in: [ 102.355479] CPU: 3 PID: 1013 Comm: init Tainted: G W 5.10.110 #15 [ 102.362907] Hardware name: Generic DT based system [ 102.367721] Backtrace: [ 102.370212] [] (dump_backtrace) from [] (show_stack+0x20/0x24) [ 102.377824] r7:600f0093 r6:c0e96442 r5:00000000 r4:c1219d6c [ 102.383532] [] (show_stack) from [] (dump_stack_lvl+0x94/0xac) [ 102.391150] [] (dump_stack_lvl) from [] (dump_stack+0x14/0x1c) [ 102.398759] r7:c353dd34 r6:00000000 r5:00000009 r4:c017823c [ 102.404466] [] (dump_stack) from [] (__warn+0xd4/0x100) [ 102.411473] [] (__warn) from [] (warn_slowpath_fmt+0x8c/0xc4) [ 102.419002] r9:c0df48e7 r8:00000009 r7:c017823c r6:000006dc r5:c0df4854 r4:c353c000 [ 102.426799] [] (warn_slowpath_fmt) from [] (free_irq+0x26c/0x29c) [ 102.434676] r9:600f0013 r8:0000002e r7:c1a17f40 r6:c1978a6c r5:00000000 r4:c1978a00 [ 102.442471] [] (free_irq) from [] (devm_free_irq+0x74/0x9c) [ 102.449832] r10:c197ec54 r9:c0e44260 r8:c128d018 r7:c12ea690 r6:c1a17f40 r5:0000002e [ 102.457700] r4:c353c000 [ 102.460278] [] (devm_free_irq) from [] (rk_iommu_shutdown+0x58/0x5c) [ 102.468414] r6:c1a17f40 r5:00000001 r4:c197ec00 [ 102.473075] [] (rk_iommu_shutdown) from [] (platform_drv_shutdown+0x2c/0x30) [ 102.481901] r7:c12ea690 r6:c12285f0 r5:c197ec10 r4:c197ec14 [ 102.487611] [] (platform_drv_shutdown) from [] (device_shutdown+0x15c/0x1dc) [ 102.496453] [] (device_shutdown) from [] (kernel_restart_prepare+0x3c/0x48) [ 102.505200] r10:00000058 r9:01234567 r8:00000010 r7:c353c000 r6:4321fedc r5:c11168ec [ 102.513066] r4:00000000 [ 102.515642] [] (kernel_restart_prepare) from [] (kernel_restart+0x1c/0x60) [ 102.524302] [] (kernel_restart) from [] (__do_sys_reboot+0x154/0x1e0) [ 102.532521] r5:c11168ec r4:00000000 [ 102.536134] [] (__do_sys_reboot) from [] (sys_reboot+0x18/0x1c) [ 102.543833] r9:c353c000 r8:c01002c4 r7:00000058 r6:005241c4 r5:00524140 r4:00000000 [ 102.551626] [] (sys_reboot) from [] (ret_fast_syscall+0x0/0x54) [ 102.559324] Exception stack(0xc353dfa8 to 0xc353dff0) [ 102.564414] dfa0: 00000000 00524140 fee1dead 28121969 01234567 00000010 [ 102.572641] dfc0: 00000000 00524140 005241c4 00000058 beddbefc 0044b1a8 b6f39d00 b6f3a010 [ 102.580864] dfe0: 00523b5c beddbc90 004dadf4 b6e584c8 [ 102.585947] ---[ end trace adc766c58fa66350 ]--- Change-Id: Ic0603d4d00528dc6b5ef6d480b15d3c14585dec3 Signed-off-by: Simon Xue --- drivers/iommu/rockchip-iommu.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/iommu/rockchip-iommu.c b/drivers/iommu/rockchip-iommu.c index 5d22c575b295..541fbf22ce56 100644 --- a/drivers/iommu/rockchip-iommu.c +++ b/drivers/iommu/rockchip-iommu.c @@ -1960,12 +1960,16 @@ static void rk_iommu_shutdown(struct platform_device *pdev) struct rk_iommu *iommu = platform_get_drvdata(pdev); int i; + if (iommu->skip_read) + goto skip_free_irq; + for (i = 0; i < iommu->num_irq; i++) { int irq = platform_get_irq(pdev, i); devm_free_irq(iommu->dev, irq, iommu); } +skip_free_irq: pm_runtime_force_suspend(&pdev->dev); }