With this patch we disable GuC submission in i915_drm_suspend path. This will destroy the client which will be setup back again. We also reuse the complete sanitization done via intel_uc_runtime_suspend in this path. We have added resume functionality but currently it will not be triggered as GuC is reset at the end of suspend. So we depend on intel_uc_resume post intel_uc_init_hw in i915_drm_resume. This also fixes issue where intel_uc_fini_hw was being called after GPU reset happening in i915_gem_suspend during i915_driver_unload. v2: Rebase w.r.t removal of GuC code restructuring. Added struct_mutex protection for i915_guc_submission_disable. v3: Rebase w.r.t updated GuC suspend function name. v4: Added lockdep assert in i915_guc_submission_enable/disable. Refined intel_uc_suspend to remove unnecessary locals and simplify return. (Michal Winiarski) Removed comment in guc_client_free about ignoring failure for destroy_doorbell. (Oscar) Rebase w.r.t i915_modparams change. v5: Removed lockdep assert as mutex is needed by internal functions which already have the asserts. (Chris) Removed enable_guc_submission check for disabling GuC submission. (Chris) v6: Rebase with enable_guc_submission related change done in earlier newly introduced patches. v7: Fixed intel_uc_resume to call intel_uc_runtime_resume and added comment about need to enable submission later if needed. Commit message updated. (Sagar) Signed-off-by: Sagar Arun Kamble <sagar.a.kamble@xxxxxxxxx> Cc: Michal Wajdeczko <michal.wajdeczko@xxxxxxxxx> Cc: Michał Winiarski <michal.winiarski@xxxxxxxxx> Reviewed-by: Michał Winiarski <michal.winiarski@xxxxxxxxx> --- drivers/gpu/drm/i915/i915_guc_submission.c | 3 --- drivers/gpu/drm/i915/intel_uc.c | 18 ++++++++++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c index ca6c4f9..ab1c382 100644 --- a/drivers/gpu/drm/i915/i915_guc_submission.c +++ b/drivers/gpu/drm/i915/i915_guc_submission.c @@ -885,9 +885,6 @@ static void guc_client_free(struct i915_guc_client *client) * Be sure to drop any locks */ - /* FIXME: in many cases, by the time we get here the GuC has been - * reset, so we cannot destroy the doorbell properly. Ignore the - * error message for now */ destroy_doorbell(client); guc_stage_desc_fini(client->guc, client); i915_gem_object_unpin_map(client->vma->obj); diff --git a/drivers/gpu/drm/i915/intel_uc.c b/drivers/gpu/drm/i915/intel_uc.c index c54b302..feb149e 100644 --- a/drivers/gpu/drm/i915/intel_uc.c +++ b/drivers/gpu/drm/i915/intel_uc.c @@ -471,8 +471,6 @@ void intel_uc_fini_hw(struct drm_i915_private *dev_priv) { guc_free_load_err_log(&dev_priv->guc); - i915_guc_submission_disable(dev_priv); - guc_disable_communication(&dev_priv->guc); gen9_disable_guc_interrupts(dev_priv); @@ -550,12 +548,24 @@ int intel_uc_runtime_resume(struct drm_i915_private *dev_priv) int intel_uc_suspend(struct drm_i915_private *dev_priv) { - return intel_guc_suspend(dev_priv); + mutex_lock(&dev_priv->drm.struct_mutex); + i915_guc_submission_disable(dev_priv); + mutex_unlock(&dev_priv->drm.struct_mutex); + + return intel_uc_runtime_suspend(dev_priv); } int intel_uc_resume(struct drm_i915_private *dev_priv) { - return intel_guc_resume(dev_priv); + /* + * FIXME: intel_uc_suspend disables GuC submission. This is + * needed for unload path as well. Also, GuC is reset at the end + * of suspend which makes disabling submission post that not + * possible. Hence we re-enable submission during intel_uc_init_hw. + * Once reset at the end of suspend is removed we need to enable + * GuC submission post resuming GuC. + */ + return intel_uc_runtime_resume(dev_priv); } void intel_uc_sanitize(struct drm_i915_private *dev_priv) -- 1.9.1 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx