Commit 1cff8cc3 authored by Mika Kuoppala's avatar Mika Kuoppala Committed by Daniel Vetter

drm/i915: Mark elsps submitted when they are pushed to hw

Now when we have requests this deep on call chain, we can mark
the elsp being submitted when it actually is. Remove temp variable
and readjust commenting to more closely fit to the code.

v2: Avoid tmp variable and reduce number of writes (Chris)

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarMika Kuoppala <mika.kuoppala@intel.com>
Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 8ee36152
...@@ -300,31 +300,29 @@ static void execlists_elsp_write(struct drm_i915_gem_request *rq0, ...@@ -300,31 +300,29 @@ static void execlists_elsp_write(struct drm_i915_gem_request *rq0,
struct intel_engine_cs *ring = rq0->ring; struct intel_engine_cs *ring = rq0->ring;
struct drm_device *dev = ring->dev; struct drm_device *dev = ring->dev;
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
uint64_t temp = 0; uint64_t desc[2];
uint32_t desc[4];
/* XXX: You must always write both descriptors in the order below. */ if (rq1) {
if (rq1) desc[1] = execlists_ctx_descriptor(rq1);
temp = execlists_ctx_descriptor(rq1); rq1->elsp_submitted++;
else } else {
temp = 0; desc[1] = 0;
desc[1] = (u32)(temp >> 32); }
desc[0] = (u32)temp;
temp = execlists_ctx_descriptor(rq0); desc[0] = execlists_ctx_descriptor(rq0);
desc[3] = (u32)(temp >> 32); rq0->elsp_submitted++;
desc[2] = (u32)temp;
/* You must always write both descriptors in the order below. */
spin_lock(&dev_priv->uncore.lock); spin_lock(&dev_priv->uncore.lock);
intel_uncore_forcewake_get__locked(dev_priv, FORCEWAKE_ALL); intel_uncore_forcewake_get__locked(dev_priv, FORCEWAKE_ALL);
I915_WRITE_FW(RING_ELSP(ring), desc[1]); I915_WRITE_FW(RING_ELSP(ring), upper_32_bits(desc[1]));
I915_WRITE_FW(RING_ELSP(ring), desc[0]); I915_WRITE_FW(RING_ELSP(ring), lower_32_bits(desc[1]));
I915_WRITE_FW(RING_ELSP(ring), desc[3]);
I915_WRITE_FW(RING_ELSP(ring), upper_32_bits(desc[0]));
/* The context is automatically loaded after the following */ /* The context is automatically loaded after the following */
I915_WRITE_FW(RING_ELSP(ring), desc[2]); I915_WRITE_FW(RING_ELSP(ring), lower_32_bits(desc[0]));
/* ELSP is a wo register, so use another nearby reg for posting instead */ /* ELSP is a wo register, use another nearby reg for posting */
POSTING_READ_FW(RING_EXECLIST_STATUS(ring)); POSTING_READ_FW(RING_EXECLIST_STATUS(ring));
intel_uncore_forcewake_put__locked(dev_priv, FORCEWAKE_ALL); intel_uncore_forcewake_put__locked(dev_priv, FORCEWAKE_ALL);
spin_unlock(&dev_priv->uncore.lock); spin_unlock(&dev_priv->uncore.lock);
...@@ -433,10 +431,6 @@ static void execlists_context_unqueue(struct intel_engine_cs *ring) ...@@ -433,10 +431,6 @@ static void execlists_context_unqueue(struct intel_engine_cs *ring)
WARN_ON(req1 && req1->elsp_submitted); WARN_ON(req1 && req1->elsp_submitted);
execlists_submit_requests(req0, req1); execlists_submit_requests(req0, req1);
req0->elsp_submitted++;
if (req1)
req1->elsp_submitted++;
} }
static bool execlists_check_remove_request(struct intel_engine_cs *ring, static bool execlists_check_remove_request(struct intel_engine_cs *ring,
......
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