On Tue, 12 May 2026 13:37:41 +0200 Boris Brezillon <[email protected]> wrote:
> The current panthor_gpu_irq_handler() logic is already IRQ-safe > (no sleep or sleeping locks, spinlocks taken with irqsave in other > contexts, etc), so let's toggle the switch and make it an hard IRQ > handler. > > Signed-off-by: Boris Brezillon <[email protected]> > --- > drivers/gpu/drm/panthor/panthor_gpu.c | 15 ++++++++------- > 1 file changed, 8 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/panthor/panthor_gpu.c > b/drivers/gpu/drm/panthor/panthor_gpu.c > index b9c51f8a051d..04c8f23baf3f 100644 > --- a/drivers/gpu/drm/panthor/panthor_gpu.c > +++ b/drivers/gpu/drm/panthor/panthor_gpu.c > @@ -86,10 +86,15 @@ static void panthor_gpu_l2_config_set(struct > panthor_device *ptdev) > gpu_write(gpu->iomem, GPU_L2_CONFIG, l2_config); > } > > -static void panthor_gpu_irq_handler(struct panthor_irq *pirq, u32 status) > +static irqreturn_t panthor_gpu_irq_raw_handler(int irq, void *data) > { > + struct panthor_irq *pirq = data; > struct panthor_device *ptdev = pirq->ptdev; > struct panthor_gpu *gpu = ptdev->gpu; > + u32 status = gpu_read(gpu->irq.iomem, INT_STAT); > + > + if (!status) > + return IRQ_NONE; > Forgot to add the pirq state transition here: scoped_guard(spinlock_irqsave, &pirq->mask_lock) { if (pirq->state != PANTHOR_IRQ_STATE_ACTIVE) return IRQ_NONE; pirq->state = PANTHOR_IRQ_STATE_PROCESSING; } > gpu_write(gpu->irq.iomem, INT_CLEAR, status); > > @@ -115,11 +120,8 @@ static void panthor_gpu_irq_handler(struct panthor_irq > *pirq, u32 status) > ptdev->gpu->pending_reqs &= ~status; > wake_up_all(&ptdev->gpu->reqs_acked); > } > -} > > -static irqreturn_t panthor_gpu_irq_threaded_handler(int irq, void *data) > -{ > - return panthor_irq_default_threaded_handler(data, > panthor_gpu_irq_handler); and restore it here: scoped_guard(spinlock_irqsave, &pirq->mask_lock) { if (pirq->state == PANTHOR_IRQ_STATE_PROCESSING) pirq->state = PANTHOR_IRQ_STATE_ACTIVE; } > + return IRQ_HANDLED; > } > > /** > @@ -176,8 +178,7 @@ int panthor_gpu_init(struct panthor_device *ptdev) > ret = panthor_irq_request(ptdev, &ptdev->gpu->irq, irq, > GPU_INTERRUPTS_MASK, > ptdev->iomem + GPU_INT_BASE, "gpu", > - panthor_irq_default_raw_handler, > - panthor_gpu_irq_threaded_handler); > + panthor_gpu_irq_raw_handler, NULL); > if (ret) > return ret; > >
