]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
drm/imagination: Fix deadlock in soft reset sequence
authorAlessio Belle <alessio.belle@imgtec.com>
Mon, 9 Mar 2026 15:23:48 +0000 (15:23 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 25 Mar 2026 10:08:50 +0000 (11:08 +0100)
commit a55c2a5c8d680156495b7b1e2a9f5a3e313ba524 upstream.

The soft reset sequence is currently executed from the threaded IRQ
handler, hence it cannot call disable_irq() which internally waits
for IRQ handlers, i.e. itself, to complete.

Use disable_irq_nosync() during a soft reset instead.

Fixes: cc1aeedb98ad ("drm/imagination: Implement firmware infrastructure and META FW support")
Cc: stable@vger.kernel.org
Signed-off-by: Alessio Belle <alessio.belle@imgtec.com>
Reviewed-by: Matt Coster <matt.coster@imgtec.com>
Link: https://patch.msgid.link/20260309-fix-soft-reset-v1-1-121113be554f@imgtec.com
Signed-off-by: Matt Coster <matt.coster@imgtec.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/gpu/drm/imagination/pvr_power.c

index d97613c6a0a9ba983ef0d5bf2ca1fa6ff5ebd8c2..bf4cf8426f91350c2ab54ba721c292e765c606dd 100644 (file)
@@ -408,7 +408,16 @@ pvr_power_reset(struct pvr_device *pvr_dev, bool hard_reset)
        }
 
        /* Disable IRQs for the duration of the reset. */
-       disable_irq(pvr_dev->irq);
+       if (hard_reset) {
+               disable_irq(pvr_dev->irq);
+       } else {
+               /*
+                * Soft reset is triggered as a response to a FW command to the Host and is
+                * processed from the threaded IRQ handler. This code cannot (nor needs to)
+                * wait for any IRQ processing to complete.
+                */
+               disable_irq_nosync(pvr_dev->irq);
+       }
 
        do {
                if (hard_reset) {