Unverified Commit a55c2a5c authored by Alessio Belle's avatar Alessio Belle Committed by Matt Coster
Browse files

drm/imagination: Fix deadlock in soft reset sequence



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: cc1aeedb ("drm/imagination: Implement firmware infrastructure and META FW support")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarAlessio Belle <alessio.belle@imgtec.com>
Reviewed-by: default avatarMatt Coster <matt.coster@imgtec.com>
Link: https://patch.msgid.link/20260309-fix-soft-reset-v1-1-121113be554f@imgtec.com


Signed-off-by: default avatarMatt Coster <matt.coster@imgtec.com>
parent c6cb77c4
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -510,7 +510,16 @@ pvr_power_reset(struct pvr_device *pvr_dev, bool hard_reset)
	}

	/* Disable IRQs for the duration of the reset. */
	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) {