mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-03-22 07:27:12 +08:00
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: cc1aeedb98 ("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>
This commit is contained in:
committed by
Matt Coster
parent
c6cb77c474
commit
a55c2a5c8d
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user