drm/i915/uc: Stop talking with GuC when resetting
authorMichal Wajdeczko <michal.wajdeczko@intel.com>
Thu, 23 May 2019 17:25:55 +0000 (17:25 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Thu, 23 May 2019 20:58:36 +0000 (21:58 +0100)
Knowing that GuC will be reset soon, we may stop all communication
immediately without doing graceful cleanup as it is not needed.

This patch will also help us capture any unwanted/unexpected attempts
to talk with GuC after we decided to reset it. And we need to keep
'disable' part as current and upcoming firmware still expect graceful
cleanup.

v2: update commit msg

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

index f5e7f066330427275990807c90e88958a8ab28fd..41ba593a4df78442d85809e4e996700408091493 100644 (file)
@@ -96,4 +96,9 @@ void intel_guc_ct_fini(struct intel_guc_ct *ct);
 int intel_guc_ct_enable(struct intel_guc_ct *ct);
 void intel_guc_ct_disable(struct intel_guc_ct *ct);
 
+static inline void intel_guc_ct_stop(struct intel_guc_ct *ct)
+{
+       ct->host_channel.enabled = false;
+}
+
 #endif /* _INTEL_GUC_CT_H_ */
index 3d81a512e5c8bcd158ab71ce88a7bcf3175441a2..f17cb3dad90bb27f6b281facb361f5facd1e7ad5 100644 (file)
@@ -224,6 +224,17 @@ static int guc_enable_communication(struct intel_guc *guc)
        return 0;
 }
 
+static void guc_stop_communication(struct intel_guc *guc)
+{
+       struct drm_i915_private *i915 = guc_to_i915(guc);
+
+       if (HAS_GUC_CT(i915))
+               intel_guc_ct_stop(&guc->ct);
+
+       guc->send = intel_guc_send_nop;
+       guc->handler = intel_guc_to_host_event_handler_nop;
+}
+
 static void guc_disable_communication(struct intel_guc *guc)
 {
        struct drm_i915_private *i915 = guc_to_i915(guc);
@@ -485,7 +496,7 @@ void intel_uc_reset_prepare(struct drm_i915_private *i915)
        if (!USES_GUC(i915))
                return;
 
-       guc_disable_communication(guc);
+       guc_stop_communication(guc);
        __uc_sanitize(i915);
 }