mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-06 02:24:14 +08:00
drm/i915/gt: Replace open-coded intel_engine_stop_cs()
In the legacy ringbuffer submission, we still had an open-coded version of intel_engine_stop_cs() with one additional verification step. Transfer that verification to intel_engine_stop_cs() itself, and call it. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20210113204709.15020-1-chris@chris-wilson.co.uk
This commit is contained in:
parent
81746b74c1
commit
64362bc6a9
@ -1054,8 +1054,19 @@ int intel_engine_stop_cs(struct intel_engine_cs *engine)
|
||||
|
||||
ENGINE_TRACE(engine, "\n");
|
||||
if (__intel_engine_stop_cs(engine, 1000, stop_timeout(engine))) {
|
||||
ENGINE_TRACE(engine, "timed out on STOP_RING -> IDLE\n");
|
||||
err = -ETIMEDOUT;
|
||||
ENGINE_TRACE(engine,
|
||||
"timed out on STOP_RING -> IDLE; HEAD:%04x, TAIL:%04x\n",
|
||||
ENGINE_READ_FW(engine, RING_HEAD) & HEAD_ADDR,
|
||||
ENGINE_READ_FW(engine, RING_TAIL) & TAIL_ADDR);
|
||||
|
||||
/*
|
||||
* Sometimes we observe that the idle flag is not
|
||||
* set even though the ring is empty. So double
|
||||
* check before giving up.
|
||||
*/
|
||||
if ((ENGINE_READ_FW(engine, RING_HEAD) & HEAD_ADDR) !=
|
||||
(ENGINE_READ_FW(engine, RING_TAIL) & TAIL_ADDR))
|
||||
err = -ETIMEDOUT;
|
||||
}
|
||||
|
||||
return err;
|
||||
|
@ -159,30 +159,7 @@ static void ring_setup_status_page(struct intel_engine_cs *engine)
|
||||
|
||||
static bool stop_ring(struct intel_engine_cs *engine)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = engine->i915;
|
||||
|
||||
if (INTEL_GEN(dev_priv) > 2) {
|
||||
ENGINE_WRITE(engine,
|
||||
RING_MI_MODE, _MASKED_BIT_ENABLE(STOP_RING));
|
||||
if (intel_wait_for_register(engine->uncore,
|
||||
RING_MI_MODE(engine->mmio_base),
|
||||
MODE_IDLE,
|
||||
MODE_IDLE,
|
||||
1000)) {
|
||||
drm_err(&dev_priv->drm,
|
||||
"%s : timed out trying to stop ring\n",
|
||||
engine->name);
|
||||
|
||||
/*
|
||||
* Sometimes we observe that the idle flag is not
|
||||
* set even though the ring is empty. So double
|
||||
* check before giving up.
|
||||
*/
|
||||
if (ENGINE_READ(engine, RING_HEAD) !=
|
||||
ENGINE_READ(engine, RING_TAIL))
|
||||
return false;
|
||||
}
|
||||
}
|
||||
intel_engine_stop_cs(engine);
|
||||
|
||||
ENGINE_WRITE(engine, RING_HEAD, ENGINE_READ(engine, RING_TAIL));
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user