Commit bb5db7e1 authored by Chris Wilson's avatar Chris Wilson

drm/i915/execlists: Skip forcewake for ELSP submission

Now that we can read the CSB from the HWSP, we may avoid having to
perform mmio reads entirely and so forgo the rigmarole of the forcewake
dance.

v2: Include forcewake hint for GEM_TRACE readback of mmio. If we don't
hold fw ourselves, the reads may return garbage.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180122100714.15137-1-chris@chris-wilson.co.uk
parent c1beabcf
...@@ -778,6 +778,7 @@ static void execlists_submission_tasklet(unsigned long data) ...@@ -778,6 +778,7 @@ static void execlists_submission_tasklet(unsigned long data)
struct intel_engine_execlists * const execlists = &engine->execlists; struct intel_engine_execlists * const execlists = &engine->execlists;
struct execlist_port * const port = execlists->port; struct execlist_port * const port = execlists->port;
struct drm_i915_private *dev_priv = engine->i915; struct drm_i915_private *dev_priv = engine->i915;
bool fw = false;
/* We can skip acquiring intel_runtime_pm_get() here as it was taken /* We can skip acquiring intel_runtime_pm_get() here as it was taken
* on our behalf by the request (see i915_gem_mark_busy()) and it will * on our behalf by the request (see i915_gem_mark_busy()) and it will
...@@ -788,8 +789,6 @@ static void execlists_submission_tasklet(unsigned long data) ...@@ -788,8 +789,6 @@ static void execlists_submission_tasklet(unsigned long data)
*/ */
GEM_BUG_ON(!dev_priv->gt.awake); GEM_BUG_ON(!dev_priv->gt.awake);
intel_uncore_forcewake_get(dev_priv, execlists->fw_domains);
/* Prefer doing test_and_clear_bit() as a two stage operation to avoid /* Prefer doing test_and_clear_bit() as a two stage operation to avoid
* imposing the cost of a locked atomic transaction when submitting a * imposing the cost of a locked atomic transaction when submitting a
* new request (outside of the context-switch interrupt). * new request (outside of the context-switch interrupt).
...@@ -818,6 +817,12 @@ static void execlists_submission_tasklet(unsigned long data) ...@@ -818,6 +817,12 @@ static void execlists_submission_tasklet(unsigned long data)
*/ */
__clear_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted); __clear_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted);
if (unlikely(execlists->csb_head == -1)) { /* following a reset */ if (unlikely(execlists->csb_head == -1)) { /* following a reset */
if (!fw) {
intel_uncore_forcewake_get(dev_priv,
execlists->fw_domains);
fw = true;
}
head = readl(dev_priv->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_PTR(engine))); head = readl(dev_priv->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_PTR(engine)));
tail = GEN8_CSB_WRITE_PTR(head); tail = GEN8_CSB_WRITE_PTR(head);
head = GEN8_CSB_READ_PTR(head); head = GEN8_CSB_READ_PTR(head);
...@@ -830,10 +835,10 @@ static void execlists_submission_tasklet(unsigned long data) ...@@ -830,10 +835,10 @@ static void execlists_submission_tasklet(unsigned long data)
head = execlists->csb_head; head = execlists->csb_head;
tail = READ_ONCE(buf[write_idx]); tail = READ_ONCE(buf[write_idx]);
} }
GEM_TRACE("%s cs-irq head=%d [%d], tail=%d [%d]\n", GEM_TRACE("%s cs-irq head=%d [%d%s], tail=%d [%d%s]\n",
engine->name, engine->name,
head, GEN8_CSB_READ_PTR(readl(dev_priv->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_PTR(engine)))), head, GEN8_CSB_READ_PTR(readl(dev_priv->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_PTR(engine)))), fw ? "" : "?",
tail, GEN8_CSB_WRITE_PTR(readl(dev_priv->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_PTR(engine))))); tail, GEN8_CSB_WRITE_PTR(readl(dev_priv->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_PTR(engine)))), fw ? "" : "?");
while (head != tail) { while (head != tail) {
struct drm_i915_gem_request *rq; struct drm_i915_gem_request *rq;
...@@ -943,7 +948,8 @@ static void execlists_submission_tasklet(unsigned long data) ...@@ -943,7 +948,8 @@ static void execlists_submission_tasklet(unsigned long data)
if (!execlists_is_active(execlists, EXECLISTS_ACTIVE_PREEMPT)) if (!execlists_is_active(execlists, EXECLISTS_ACTIVE_PREEMPT))
execlists_dequeue(engine); execlists_dequeue(engine);
intel_uncore_forcewake_put(dev_priv, execlists->fw_domains); if (fw)
intel_uncore_forcewake_put(dev_priv, execlists->fw_domains);
} }
static void insert_request(struct intel_engine_cs *engine, static void insert_request(struct intel_engine_cs *engine,
......
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