Skip to content

Commit d431440

Browse files
telfmikuint
authored andcommitted
drm/i915: Generalise common GPU engine reset request/unrequest code
GPU engine reset handshaking is something that is applicable to both full GPU reset and engine reset, which is something that is part of the upcoming TDR per-engine hang recovery patches. Break out the common engine reset request/unrequest code (originally written by Mika Kuoppala) for reuse later in the TDR enablement patch series. v2: correct indentation and drop unused returned value (Mika) v3: We have forcewake during reset so use *_FW reg access (Mika) Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Signed-off-by: Tomas Elf <tomas.elf@intel.com> Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com> Signed-off-by: Arun Siluvery <arun.siluvery@linux.intel.com> [Mika: Fixed format warning] Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1456929984-16323-1-git-send-email-mika.kuoppala@intel.com
1 parent 37f2248 commit d431440

File tree

1 file changed

+36
-20
lines changed

1 file changed

+36
-20
lines changed

drivers/gpu/drm/i915/intel_uncore.c

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1531,13 +1531,40 @@ static int gen6_do_reset(struct drm_device *dev)
15311531
return ret;
15321532
}
15331533

1534-
static int wait_for_register(struct drm_i915_private *dev_priv,
1535-
i915_reg_t reg,
1536-
const u32 mask,
1537-
const u32 value,
1538-
const unsigned long timeout_ms)
1534+
static int wait_for_register_fw(struct drm_i915_private *dev_priv,
1535+
i915_reg_t reg,
1536+
const u32 mask,
1537+
const u32 value,
1538+
const unsigned long timeout_ms)
15391539
{
1540-
return wait_for((I915_READ(reg) & mask) == value, timeout_ms);
1540+
return wait_for((I915_READ_FW(reg) & mask) == value, timeout_ms);
1541+
}
1542+
1543+
static int gen8_request_engine_reset(struct intel_engine_cs *engine)
1544+
{
1545+
int ret;
1546+
struct drm_i915_private *dev_priv = engine->dev->dev_private;
1547+
1548+
I915_WRITE_FW(RING_RESET_CTL(engine->mmio_base),
1549+
_MASKED_BIT_ENABLE(RESET_CTL_REQUEST_RESET));
1550+
1551+
ret = wait_for_register_fw(dev_priv,
1552+
RING_RESET_CTL(engine->mmio_base),
1553+
RESET_CTL_READY_TO_RESET,
1554+
RESET_CTL_READY_TO_RESET,
1555+
700);
1556+
if (ret)
1557+
DRM_ERROR("%s: reset request timeout\n", engine->name);
1558+
1559+
return ret;
1560+
}
1561+
1562+
static void gen8_unrequest_engine_reset(struct intel_engine_cs *engine)
1563+
{
1564+
struct drm_i915_private *dev_priv = engine->dev->dev_private;
1565+
1566+
I915_WRITE_FW(RING_RESET_CTL(engine->mmio_base),
1567+
_MASKED_BIT_DISABLE(RESET_CTL_REQUEST_RESET));
15411568
}
15421569

15431570
static int gen8_do_reset(struct drm_device *dev)
@@ -1546,26 +1573,15 @@ static int gen8_do_reset(struct drm_device *dev)
15461573
struct intel_engine_cs *engine;
15471574
int i;
15481575

1549-
for_each_ring(engine, dev_priv, i) {
1550-
I915_WRITE(RING_RESET_CTL(engine->mmio_base),
1551-
_MASKED_BIT_ENABLE(RESET_CTL_REQUEST_RESET));
1552-
1553-
if (wait_for_register(dev_priv,
1554-
RING_RESET_CTL(engine->mmio_base),
1555-
RESET_CTL_READY_TO_RESET,
1556-
RESET_CTL_READY_TO_RESET,
1557-
700)) {
1558-
DRM_ERROR("%s: reset request timeout\n", engine->name);
1576+
for_each_ring(engine, dev_priv, i)
1577+
if (gen8_request_engine_reset(engine))
15591578
goto not_ready;
1560-
}
1561-
}
15621579

15631580
return gen6_do_reset(dev);
15641581

15651582
not_ready:
15661583
for_each_ring(engine, dev_priv, i)
1567-
I915_WRITE(RING_RESET_CTL(engine->mmio_base),
1568-
_MASKED_BIT_DISABLE(RESET_CTL_REQUEST_RESET));
1584+
gen8_unrequest_engine_reset(engine);
15691585

15701586
return -EIO;
15711587
}

0 commit comments

Comments
 (0)