drm/i915/uc: Extract common code from GuC stop/disable comm
During normal driver unload we attempt to disable GuC communication while it is currently stopped. This results in a nop'd call to intel_guc_ct_disable within guc_disable_communication because stop/disable rely on the same flag to prevent further comms with CT. We can avoid the call to disable and still leave communication in a satisfactory state by extracting a set of shared steps from stop/disable. This set can include guc_disable_interrupts as we do not require the single caller of guc_stop_communication to be atomic: "drm/i915/selftests: Fixup atomic reset checking". This situation (stop -> disable) only occurs during intel_uc_fini_hw, so during fini, call guc_disable_communication only if currently enabled. The symmetric calls to enable/disable remain unmodified for all other scenarios. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110943 Signed-off-by: Fernando Pacheco <fernando.pacheco@intel.com> Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@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/20190829174154.14675-1-fernando.pacheco@intel.com
This commit is contained in:
parent
e7b6affd0b
commit
9be02fde93
|
@ -224,17 +224,7 @@ static int guc_enable_communication(struct intel_guc *guc)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void guc_stop_communication(struct intel_guc *guc)
|
||||
{
|
||||
intel_guc_ct_stop(&guc->ct);
|
||||
|
||||
guc->send = intel_guc_send_nop;
|
||||
guc->handler = intel_guc_to_host_event_handler_nop;
|
||||
|
||||
guc_clear_mmio_msg(guc);
|
||||
}
|
||||
|
||||
static void guc_disable_communication(struct intel_guc *guc)
|
||||
static void __guc_stop_communication(struct intel_guc *guc)
|
||||
{
|
||||
/*
|
||||
* Events generated during or after CT disable are logged by guc in
|
||||
|
@ -247,6 +237,20 @@ static void guc_disable_communication(struct intel_guc *guc)
|
|||
|
||||
guc->send = intel_guc_send_nop;
|
||||
guc->handler = intel_guc_to_host_event_handler_nop;
|
||||
}
|
||||
|
||||
static void guc_stop_communication(struct intel_guc *guc)
|
||||
{
|
||||
intel_guc_ct_stop(&guc->ct);
|
||||
|
||||
__guc_stop_communication(guc);
|
||||
|
||||
DRM_INFO("GuC communication stopped\n");
|
||||
}
|
||||
|
||||
static void guc_disable_communication(struct intel_guc *guc)
|
||||
{
|
||||
__guc_stop_communication(guc);
|
||||
|
||||
intel_guc_ct_disable(&guc->ct);
|
||||
|
||||
|
@ -537,7 +541,9 @@ void intel_uc_fini_hw(struct intel_uc *uc)
|
|||
if (intel_uc_supports_guc_submission(uc))
|
||||
intel_guc_submission_disable(guc);
|
||||
|
||||
guc_disable_communication(guc);
|
||||
if (guc_communication_enabled(guc))
|
||||
guc_disable_communication(guc);
|
||||
|
||||
__uc_sanitize(uc);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue