Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+15 −21
Original line number Original line Diff line number Diff line
@@ -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)
	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,