Skip to content

Commit 42e7ab3

Browse files
larunbestevenprice-arm
authored andcommitted
drm/panfrost: Make re-enabling job interrupts at device reset optional
Rather than remasking interrupts after a device reset in the main reset path, allow selecting whether to do this with an additional bool parameter. To this end, split reenabling job interrupts into two functions, one that clears the interrupts and another one which unmasks them conditionally. Reviewed-by: Steven Price <steven.price@arm.com> Reviewed-by: Boris Brezillon <boris.brezillon@collabora.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Signed-off-by: Adrián Larumbe <adrian.larumbe@collabora.com> Link: https://lore.kernel.org/r/20251019145225.3621989-9-adrian.larumbe@collabora.com Signed-off-by: Steven Price <steven.price@arm.com>
1 parent fc237ec commit 42e7ab3

4 files changed

Lines changed: 16 additions & 13 deletions

File tree

drivers/gpu/drm/panfrost/panfrost_device.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -400,13 +400,16 @@ bool panfrost_exception_needs_reset(const struct panfrost_device *pfdev,
400400
return false;
401401
}
402402

403-
void panfrost_device_reset(struct panfrost_device *pfdev)
403+
void panfrost_device_reset(struct panfrost_device *pfdev, bool enable_job_int)
404404
{
405405
panfrost_gpu_soft_reset(pfdev);
406406

407407
panfrost_gpu_power_on(pfdev);
408408
panfrost_mmu_reset(pfdev);
409-
panfrost_job_enable_interrupts(pfdev);
409+
410+
panfrost_job_reset_interrupts(pfdev);
411+
if (enable_job_int)
412+
panfrost_job_enable_interrupts(pfdev);
410413
}
411414

412415
static int panfrost_device_runtime_resume(struct device *dev)
@@ -430,7 +433,7 @@ static int panfrost_device_runtime_resume(struct device *dev)
430433
}
431434
}
432435

433-
panfrost_device_reset(pfdev);
436+
panfrost_device_reset(pfdev, true);
434437
panfrost_devfreq_resume(pfdev);
435438

436439
return 0;

drivers/gpu/drm/panfrost/panfrost_device.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ int panfrost_unstable_ioctl_check(void);
250250

251251
int panfrost_device_init(struct panfrost_device *pfdev);
252252
void panfrost_device_fini(struct panfrost_device *pfdev);
253-
void panfrost_device_reset(struct panfrost_device *pfdev);
253+
void panfrost_device_reset(struct panfrost_device *pfdev, bool enable_job_int);
254254

255255
extern const struct dev_pm_ops panfrost_pm_ops;
256256

drivers/gpu/drm/panfrost/panfrost_job.c

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -430,11 +430,14 @@ static struct dma_fence *panfrost_job_run(struct drm_sched_job *sched_job)
430430
return fence;
431431
}
432432

433+
void panfrost_job_reset_interrupts(struct panfrost_device *pfdev)
434+
{
435+
job_write(pfdev, JOB_INT_CLEAR, ALL_JS_INT_MASK);
436+
}
437+
433438
void panfrost_job_enable_interrupts(struct panfrost_device *pfdev)
434439
{
435440
clear_bit(PANFROST_COMP_BIT_JOB, pfdev->is_suspended);
436-
437-
job_write(pfdev, JOB_INT_CLEAR, ALL_JS_INT_MASK);
438441
job_write(pfdev, JOB_INT_MASK, ALL_JS_INT_MASK);
439442
}
440443

@@ -727,12 +730,7 @@ panfrost_reset(struct panfrost_device *pfdev,
727730
spin_unlock(&pfdev->js->job_lock);
728731

729732
/* Proceed with reset now. */
730-
panfrost_device_reset(pfdev);
731-
732-
/* panfrost_device_reset() unmasks job interrupts, but we want to
733-
* keep them masked a bit longer.
734-
*/
735-
job_write(pfdev, JOB_INT_MASK, 0);
733+
panfrost_device_reset(pfdev, false);
736734

737735
/* GPU has been reset, we can clear the reset pending bit. */
738736
atomic_set(&pfdev->reset.pending, 0);
@@ -754,7 +752,7 @@ panfrost_reset(struct panfrost_device *pfdev,
754752
drm_sched_start(&pfdev->js->queue[i].sched, 0);
755753

756754
/* Re-enable job interrupts now that everything has been restarted. */
757-
job_write(pfdev, JOB_INT_MASK, ALL_JS_INT_MASK);
755+
panfrost_job_enable_interrupts(pfdev);
758756

759757
dma_fence_end_signalling(cookie);
760758
}
@@ -907,6 +905,7 @@ int panfrost_job_init(struct panfrost_device *pfdev)
907905
}
908906
}
909907

908+
panfrost_job_reset_interrupts(pfdev);
910909
panfrost_job_enable_interrupts(pfdev);
911910

912911
return 0;

drivers/gpu/drm/panfrost/panfrost_job.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ void panfrost_job_close(struct drm_file *file);
6969
int panfrost_job_get_slot(struct panfrost_job *job);
7070
int panfrost_job_push(struct panfrost_job *job);
7171
void panfrost_job_put(struct panfrost_job *job);
72+
void panfrost_job_reset_interrupts(struct panfrost_device *pfdev);
7273
void panfrost_job_enable_interrupts(struct panfrost_device *pfdev);
7374
void panfrost_job_suspend_irq(struct panfrost_device *pfdev);
7475
int panfrost_job_is_idle(struct panfrost_device *pfdev);

0 commit comments

Comments
 (0)