diff options
| -rw-r--r-- | drivers/gpu/drm/panfrost/panfrost_device.c | 9 | ||||
| -rw-r--r-- | drivers/gpu/drm/panfrost/panfrost_device.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/panfrost/panfrost_job.c | 17 | ||||
| -rw-r--r-- | drivers/gpu/drm/panfrost/panfrost_job.h | 1 |
4 files changed, 16 insertions, 13 deletions
diff --git a/drivers/gpu/drm/panfrost/panfrost_device.c b/drivers/gpu/drm/panfrost/panfrost_device.c index 733b728ec75f..f1d811a6de6c 100644 --- a/drivers/gpu/drm/panfrost/panfrost_device.c +++ b/drivers/gpu/drm/panfrost/panfrost_device.c @@ -400,13 +400,16 @@ bool panfrost_exception_needs_reset(const struct panfrost_device *pfdev, return false; } -void panfrost_device_reset(struct panfrost_device *pfdev) +void panfrost_device_reset(struct panfrost_device *pfdev, bool enable_job_int) { panfrost_gpu_soft_reset(pfdev); panfrost_gpu_power_on(pfdev); panfrost_mmu_reset(pfdev); - panfrost_job_enable_interrupts(pfdev); + + panfrost_job_reset_interrupts(pfdev); + if (enable_job_int) + panfrost_job_enable_interrupts(pfdev); } static int panfrost_device_runtime_resume(struct device *dev) @@ -430,7 +433,7 @@ static int panfrost_device_runtime_resume(struct device *dev) } } - panfrost_device_reset(pfdev); + panfrost_device_reset(pfdev, true); panfrost_devfreq_resume(pfdev); return 0; diff --git a/drivers/gpu/drm/panfrost/panfrost_device.h b/drivers/gpu/drm/panfrost/panfrost_device.h index ac7147ed806b..45d77cda8b89 100644 --- a/drivers/gpu/drm/panfrost/panfrost_device.h +++ b/drivers/gpu/drm/panfrost/panfrost_device.h @@ -250,7 +250,7 @@ int panfrost_unstable_ioctl_check(void); int panfrost_device_init(struct panfrost_device *pfdev); void panfrost_device_fini(struct panfrost_device *pfdev); -void panfrost_device_reset(struct panfrost_device *pfdev); +void panfrost_device_reset(struct panfrost_device *pfdev, bool enable_job_int); extern const struct dev_pm_ops panfrost_pm_ops; diff --git a/drivers/gpu/drm/panfrost/panfrost_job.c b/drivers/gpu/drm/panfrost/panfrost_job.c index dc4228af78f9..39e919420aaf 100644 --- a/drivers/gpu/drm/panfrost/panfrost_job.c +++ b/drivers/gpu/drm/panfrost/panfrost_job.c @@ -430,11 +430,14 @@ static struct dma_fence *panfrost_job_run(struct drm_sched_job *sched_job) return fence; } +void panfrost_job_reset_interrupts(struct panfrost_device *pfdev) +{ + job_write(pfdev, JOB_INT_CLEAR, ALL_JS_INT_MASK); +} + void panfrost_job_enable_interrupts(struct panfrost_device *pfdev) { clear_bit(PANFROST_COMP_BIT_JOB, pfdev->is_suspended); - - job_write(pfdev, JOB_INT_CLEAR, ALL_JS_INT_MASK); job_write(pfdev, JOB_INT_MASK, ALL_JS_INT_MASK); } @@ -727,12 +730,7 @@ panfrost_reset(struct panfrost_device *pfdev, spin_unlock(&pfdev->js->job_lock); /* Proceed with reset now. */ - panfrost_device_reset(pfdev); - - /* panfrost_device_reset() unmasks job interrupts, but we want to - * keep them masked a bit longer. - */ - job_write(pfdev, JOB_INT_MASK, 0); + panfrost_device_reset(pfdev, false); /* GPU has been reset, we can clear the reset pending bit. */ atomic_set(&pfdev->reset.pending, 0); @@ -754,7 +752,7 @@ panfrost_reset(struct panfrost_device *pfdev, drm_sched_start(&pfdev->js->queue[i].sched, 0); /* Re-enable job interrupts now that everything has been restarted. */ - job_write(pfdev, JOB_INT_MASK, ALL_JS_INT_MASK); + panfrost_job_enable_interrupts(pfdev); dma_fence_end_signalling(cookie); } @@ -907,6 +905,7 @@ int panfrost_job_init(struct panfrost_device *pfdev) } } + panfrost_job_reset_interrupts(pfdev); panfrost_job_enable_interrupts(pfdev); return 0; diff --git a/drivers/gpu/drm/panfrost/panfrost_job.h b/drivers/gpu/drm/panfrost/panfrost_job.h index 458666bf684b..f6d9960740ae 100644 --- a/drivers/gpu/drm/panfrost/panfrost_job.h +++ b/drivers/gpu/drm/panfrost/panfrost_job.h @@ -69,6 +69,7 @@ void panfrost_job_close(struct drm_file *file); int panfrost_job_get_slot(struct panfrost_job *job); int panfrost_job_push(struct panfrost_job *job); void panfrost_job_put(struct panfrost_job *job); +void panfrost_job_reset_interrupts(struct panfrost_device *pfdev); void panfrost_job_enable_interrupts(struct panfrost_device *pfdev); void panfrost_job_suspend_irq(struct panfrost_device *pfdev); int panfrost_job_is_idle(struct panfrost_device *pfdev); |
