OSDN Git Service

drm/i915/guc: Calling guc_disable_communication in all suspend paths
authorSujaritha Sundaresan <sujaritha.sundaresan@intel.com>
Wed, 20 Feb 2019 01:39:27 +0000 (17:39 -0800)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 20 Feb 2019 23:53:21 +0000 (23:53 +0000)
This aim of this patch is to call guc_disable_communication in all
suspend paths. The reason to introduce this is to resolve a bug that
occurred due to suspend late not being called in the hibernate devices
path.

Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Signed-off-by: Sujaritha Sundaresan <sujaritha.sundaresan@intel.com>
Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Link: https://patchwork.freedesktop.org/patch/msgid/20190220013927.9488-3-sujaritha.sundaresan@intel.com
drivers/gpu/drm/i915/i915_reset.c
drivers/gpu/drm/i915/intel_uc.c
drivers/gpu/drm/i915/intel_uc.h

index 19ad56b..39a0893 100644 (file)
@@ -673,7 +673,7 @@ static void reset_prepare(struct drm_i915_private *i915)
        for_each_engine(engine, i915, id)
                reset_prepare_engine(engine);
 
-       intel_uc_sanitize(i915);
+       intel_uc_reset_prepare(i915);
        revoke_mmaps(i915);
 }
 
index e711eb3..2d360d5 100644 (file)
@@ -332,8 +332,6 @@ void intel_uc_sanitize(struct drm_i915_private *i915)
 
        GEM_BUG_ON(!HAS_GUC(i915));
 
-       guc_disable_communication(guc);
-
        intel_huc_sanitize(huc);
        intel_guc_sanitize(guc);
 
@@ -451,6 +449,23 @@ void intel_uc_fini_hw(struct drm_i915_private *i915)
        guc_disable_communication(guc);
 }
 
+/**
+ * intel_uc_reset_prepare - Prepare for reset
+ * @i915: device private
+ *
+ * Preparing for full gpu reset.
+ */
+void intel_uc_reset_prepare(struct drm_i915_private *i915)
+{
+       struct intel_guc *guc = &i915->guc;
+
+       if (!USES_GUC(i915))
+               return;
+
+       guc_disable_communication(guc);
+       intel_uc_sanitize(i915);
+}
+
 int intel_uc_suspend(struct drm_i915_private *i915)
 {
        struct intel_guc *guc = &i915->guc;
@@ -468,7 +483,7 @@ int intel_uc_suspend(struct drm_i915_private *i915)
                return err;
        }
 
-       gen9_disable_guc_interrupts(i915);
+       guc_disable_communication(guc);
 
        return 0;
 }
@@ -484,7 +499,7 @@ int intel_uc_resume(struct drm_i915_private *i915)
        if (guc->fw.load_status != INTEL_UC_FIRMWARE_SUCCESS)
                return 0;
 
-       gen9_enable_guc_interrupts(i915);
+       guc_enable_communication(guc);
 
        err = intel_guc_resume(guc);
        if (err) {
index 870faf9..c147297 100644 (file)
@@ -38,6 +38,7 @@ int intel_uc_init_hw(struct drm_i915_private *dev_priv);
 void intel_uc_fini_hw(struct drm_i915_private *dev_priv);
 int intel_uc_init(struct drm_i915_private *dev_priv);
 void intel_uc_fini(struct drm_i915_private *dev_priv);
+void intel_uc_reset_prepare(struct drm_i915_private *i915);
 int intel_uc_suspend(struct drm_i915_private *dev_priv);
 int intel_uc_resume(struct drm_i915_private *dev_priv);