]> git.ipfire.org Git - thirdparty/linux.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)
committerMatt Coster <matt.coster@imgtec.com>
Tue, 17 Mar 2026 14:27:04 +0000 (14:27 +0000)
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>
drivers/gpu/drm/imagination/pvr_power.c

index 0cf7393f89c6b02b0d7e5a421dd0f2e40fda1c0f..ab10b4ac06b0237b889e6c86ebc703bb190db8ee 100644 (file)
@@ -510,7 +510,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) {