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)
}
}
- panfrost_device_reset(pfdev);
+ panfrost_device_reset(pfdev, true);
panfrost_devfreq_resume(pfdev);
return 0;
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;
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);
}
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);
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);
}
}
}
+ panfrost_job_reset_interrupts(pfdev);
panfrost_job_enable_interrupts(pfdev);
return 0;
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);