If we want some FW events to be processed in the interrupt path, we need the helpers manipulating req regs to be IRQ-safe, which implies using spin_lock_irqsave instead of spinlock. While at it, use guards instead of plain spin_lock/unlock calls.
Reviewed-by: Steven Price <[email protected]> Reviewed-by: Liviu Dudau <[email protected]> Signed-off-by: Boris Brezillon <[email protected]> --- drivers/gpu/drm/panthor/panthor_fw.h | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/panthor/panthor_fw.h b/drivers/gpu/drm/panthor/panthor_fw.h index a99a9b6f4825..e56b7fe15bb3 100644 --- a/drivers/gpu/drm/panthor/panthor_fw.h +++ b/drivers/gpu/drm/panthor/panthor_fw.h @@ -432,12 +432,11 @@ struct panthor_fw_global_iface { #define panthor_fw_toggle_reqs(__iface, __in_reg, __out_reg, __mask) \ do { \ u32 __cur_val, __new_val, __out_val; \ - spin_lock(&(__iface)->lock); \ + guard(spinlock_irqsave)(&(__iface)->lock); \ __cur_val = READ_ONCE((__iface)->input->__in_reg); \ __out_val = READ_ONCE((__iface)->output->__out_reg); \ __new_val = ((__out_val ^ (__mask)) & (__mask)) | (__cur_val & ~(__mask)); \ WRITE_ONCE((__iface)->input->__in_reg, __new_val); \ - spin_unlock(&(__iface)->lock); \ } while (0) /** @@ -458,21 +457,19 @@ struct panthor_fw_global_iface { #define panthor_fw_update_reqs(__iface, __in_reg, __val, __mask) \ do { \ u32 __cur_val, __new_val; \ - spin_lock(&(__iface)->lock); \ + guard(spinlock_irqsave)(&(__iface)->lock); \ __cur_val = READ_ONCE((__iface)->input->__in_reg); \ __new_val = (__cur_val & ~(__mask)) | ((__val) & (__mask)); \ WRITE_ONCE((__iface)->input->__in_reg, __new_val); \ - spin_unlock(&(__iface)->lock); \ } while (0) #define panthor_fw_update_reqs64(__iface, __in_reg, __val, __mask) \ do { \ u64 __cur_val, __new_val; \ - spin_lock(&(__iface)->lock); \ + guard(spinlock_irqsave)(&(__iface)->lock); \ __cur_val = READ_ONCE((__iface)->input->__in_reg); \ __new_val = (__cur_val & ~(__mask)) | ((__val) & (__mask)); \ WRITE_ONCE((__iface)->input->__in_reg, __new_val); \ - spin_unlock(&(__iface)->lock); \ } while (0) struct panthor_fw_global_iface * -- 2.54.0
