drm/i915: Clear stop-engine for a pardoned reset
If we pardon a per-engine reset, we may leave the STOP_RING bit asserted in RING_MI_MODE resulting in the engine hanging. Unconditionally clear it on the per-engine exit path as we know that either we skipped the reset and so need the cancellation, or the reset was successful and the cancellation is a no-op, or there was an error and we will follow up with a full-reset or wedging (both of which will stop the engines again as required). Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107188 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=106560 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20180814171857.24673-1-chris@chris-wilson.co.uk
This commit is contained in:
parent
08ea70a417
commit
a99b32a6ff
@ -2079,6 +2079,7 @@ int i915_reset_engine(struct intel_engine_cs *engine, const char *msg)
|
|||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
intel_engine_cancel_stop_cs(engine);
|
||||||
i915_gem_reset_finish_engine(engine);
|
i915_gem_reset_finish_engine(engine);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -788,6 +788,16 @@ int intel_engine_stop_cs(struct intel_engine_cs *engine)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void intel_engine_cancel_stop_cs(struct intel_engine_cs *engine)
|
||||||
|
{
|
||||||
|
struct drm_i915_private *dev_priv = engine->i915;
|
||||||
|
|
||||||
|
GEM_TRACE("%s\n", engine->name);
|
||||||
|
|
||||||
|
I915_WRITE_FW(RING_MI_MODE(engine->mmio_base),
|
||||||
|
_MASKED_BIT_DISABLE(STOP_RING));
|
||||||
|
}
|
||||||
|
|
||||||
const char *i915_cache_level_str(struct drm_i915_private *i915, int type)
|
const char *i915_cache_level_str(struct drm_i915_private *i915, int type)
|
||||||
{
|
{
|
||||||
switch (type) {
|
switch (type) {
|
||||||
|
@ -906,6 +906,7 @@ int intel_init_blt_ring_buffer(struct intel_engine_cs *engine);
|
|||||||
int intel_init_vebox_ring_buffer(struct intel_engine_cs *engine);
|
int intel_init_vebox_ring_buffer(struct intel_engine_cs *engine);
|
||||||
|
|
||||||
int intel_engine_stop_cs(struct intel_engine_cs *engine);
|
int intel_engine_stop_cs(struct intel_engine_cs *engine);
|
||||||
|
void intel_engine_cancel_stop_cs(struct intel_engine_cs *engine);
|
||||||
|
|
||||||
u64 intel_engine_get_active_head(const struct intel_engine_cs *engine);
|
u64 intel_engine_get_active_head(const struct intel_engine_cs *engine);
|
||||||
u64 intel_engine_get_last_batch_head(const struct intel_engine_cs *engine);
|
u64 intel_engine_get_last_batch_head(const struct intel_engine_cs *engine);
|
||||||
|
Loading…
Reference in New Issue
Block a user