[PATCH 07/11] resume

Chris Wilson chris at chris-wilson.co.uk
Wed May 18 11:08:49 UTC 2016


---
 drivers/gpu/drm/i915/i915_drv.c | 41 ++++++++++++++++++++++++++++++-----------
 1 file changed, 30 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index fa619f2e67f8..385dbedec8bd 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -741,6 +741,7 @@ struct resume_context {
 	struct drm_i915_private *i915;
 
 	async_cookie_t cookie;
+	struct async_fence *irq_fence;
 };
 
 static struct resume_context *resume_context(struct drm_device *dev)
@@ -757,6 +758,8 @@ static struct resume_context *resume_context(struct drm_device *dev)
 		kref_init(&ctx->kref);
 		ctx->i915 = dev_priv;
 
+		ctx->irq_fence = async_fence_create(GFP_KERNEL);
+
 		dev_priv->async_context = ctx;
 	}
 
@@ -767,6 +770,7 @@ static void resume_context_free(struct kref *kref)
 {
 	struct resume_context *ctx = container_of(kref, typeof(*ctx), kref);
 
+	async_fence_put(ctx->irq_fence);
 	kfree(ctx);
 }
 
@@ -797,6 +801,27 @@ static void i915_drm_complete(struct drm_device *dev)
 	resume_context_put(ctx);
 }
 
+static void i915_gem_resume(void *data, async_cookie_t cookie)
+{
+	struct resume_context *ctx = data;
+	struct drm_device *dev = ctx->i915->dev;
+
+	mutex_lock(&dev->struct_mutex);
+	i915_gem_restore_gtt_mappings(dev);
+	mutex_unlock(&dev->struct_mutex);
+
+	async_fence_wait(ctx->irq_fence);
+
+	mutex_lock(&dev->struct_mutex);
+	if (i915_gem_init_hw(dev)) {
+		DRM_ERROR("failed to re-initialize GPU, declaring wedged!\n");
+			atomic_or(I915_WEDGED, &ctx->i915->gpu_error.reset_counter);
+	}
+	mutex_unlock(&dev->struct_mutex);
+
+	resume_context_put(ctx);
+}
+
 static int i915_drm_resume(struct drm_device *dev)
 {
 	struct resume_context *ctx;
@@ -810,11 +835,11 @@ static int i915_drm_resume(struct drm_device *dev)
 	if (i915_ggtt_enable_hw(dev))
 		DRM_ERROR("failed to re-enable GGTT\n");
 
-	intel_csr_ucode_resume(ctx->i915);
+	ctx->cookie = async_schedule_domain(i915_gem_resume,
+					    resume_context_get(ctx),
+					    &ctx->i915->async_domain);
 
-	mutex_lock(&dev->struct_mutex);
-	i915_gem_restore_gtt_mappings(dev);
-	mutex_unlock(&dev->struct_mutex);
+	intel_csr_ucode_resume(ctx->i915);
 
 	i915_restore_state(dev);
 	intel_opregion_setup(dev);
@@ -831,13 +856,7 @@ static int i915_drm_resume(struct drm_device *dev)
 	 * interrupts.
 	 */
 	intel_runtime_pm_enable_interrupts(ctx->i915);
-
-	mutex_lock(&dev->struct_mutex);
-	if (i915_gem_init_hw(dev)) {
-		DRM_ERROR("failed to re-initialize GPU, declaring wedged!\n");
-			atomic_or(I915_WEDGED, &ctx->i915->gpu_error.reset_counter);
-	}
-	mutex_unlock(&dev->struct_mutex);
+	async_fence_signal(ctx->irq_fence);
 
 	intel_guc_resume(dev);
 
-- 
2.8.1



More information about the Intel-gfx-trybot mailing list