Commit d75dc57f authored by John Harrison's avatar John Harrison

drm/i915/guc: Don't complain about reset races

It is impossible to seal all race conditions of resets occurring
concurrent to other operations. At least, not without introducing
excesive mutex locking. Instead, don't complain if it occurs. In
particular, don't complain if trying to send a H2G during a reset.
Whatever the H2G was about should get redone once the reset is over.
Signed-off-by: default avatarJohn Harrison <John.C.Harrison@Intel.com>
Signed-off-by: default avatarMatthew Brost <matthew.brost@intel.com>
Reviewed-by: default avatarMatthew Brost <matthew.brost@intel.com>
Signed-off-by: default avatarJohn Harrison <John.C.Harrison@Intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210727002348.97202-17-matthew.brost@intel.com
parent 6de12da1
...@@ -760,7 +760,10 @@ int intel_guc_ct_send(struct intel_guc_ct *ct, const u32 *action, u32 len, ...@@ -760,7 +760,10 @@ int intel_guc_ct_send(struct intel_guc_ct *ct, const u32 *action, u32 len,
int ret; int ret;
if (unlikely(!ct->enabled)) { if (unlikely(!ct->enabled)) {
WARN(1, "Unexpected send: action=%#x\n", *action); struct intel_guc *guc = ct_to_guc(ct);
struct intel_uc *uc = container_of(guc, struct intel_uc, guc);
WARN(!uc->reset_in_progress, "Unexpected send: action=%#x\n", *action);
return -ENODEV; return -ENODEV;
} }
......
...@@ -550,6 +550,8 @@ void intel_uc_reset_prepare(struct intel_uc *uc) ...@@ -550,6 +550,8 @@ void intel_uc_reset_prepare(struct intel_uc *uc)
{ {
struct intel_guc *guc = &uc->guc; struct intel_guc *guc = &uc->guc;
uc->reset_in_progress = true;
/* Nothing to do if GuC isn't supported */ /* Nothing to do if GuC isn't supported */
if (!intel_uc_supports_guc(uc)) if (!intel_uc_supports_guc(uc))
return; return;
...@@ -578,6 +580,8 @@ void intel_uc_reset_finish(struct intel_uc *uc) ...@@ -578,6 +580,8 @@ void intel_uc_reset_finish(struct intel_uc *uc)
{ {
struct intel_guc *guc = &uc->guc; struct intel_guc *guc = &uc->guc;
uc->reset_in_progress = false;
/* Firmware expected to be running when this function is called */ /* Firmware expected to be running when this function is called */
if (intel_guc_is_fw_running(guc) && intel_uc_uses_guc_submission(uc)) if (intel_guc_is_fw_running(guc) && intel_uc_uses_guc_submission(uc))
intel_guc_submission_reset_finish(guc); intel_guc_submission_reset_finish(guc);
......
...@@ -30,6 +30,8 @@ struct intel_uc { ...@@ -30,6 +30,8 @@ struct intel_uc {
/* Snapshot of GuC log from last failed load */ /* Snapshot of GuC log from last failed load */
struct drm_i915_gem_object *load_err_log; struct drm_i915_gem_object *load_err_log;
bool reset_in_progress;
}; };
void intel_uc_init_early(struct intel_uc *uc); void intel_uc_init_early(struct intel_uc *uc);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment