On Tue, May 12, 2026 at 5:09 AM Boris Brezillon <[email protected]> wrote: > > 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; > } > It looks like we can get rid of state transitions if panthor_irq_{enable,disable}_events updates INT_MASK directly when the handler is not threaded. Hm, we can even make pirq->state atomic again to get rid of locking.
> > + 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; > > > > >
