--- drivers/gpu/drm/i915/i915_drv.c | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 60ce7373ab45..46f1fd542d73 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); + + async_fence_wait(ctx->irq_fence); + + 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); @@ -832,12 +857,7 @@ static int i915_drm_resume(struct drm_device *dev) */ 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 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx