Message ID | 1486735904-12729-1-git-send-email-mika.kuoppala@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, Feb 10, 2017 at 04:11:44PM +0200, Mika Kuoppala wrote: > --- a/drivers/gpu/drm/i915/intel_lrc.c > +++ b/drivers/gpu/drm/i915/intel_lrc.c > @@ -347,9 +347,11 @@ static void execlists_submit_ports(struct intel_engine_cs *engine) > u64 desc[2]; > > GEM_BUG_ON(port[0].count > 1); > - if (!port[0].count) > + if (!port[0].count) { > + GEM_BUG_ON(!intel_engine_idle(engine)); Hmm, I actually think i915_gem_mark_busy() is a better starting point for the BUG_ON. Here it looks slightly incongruous. > execlists_context_status_change(port[0].request, > INTEL_CONTEXT_SCHEDULE_IN); > + } > desc[0] = execlists_update_context(port[0].request); > GEM_BUG_ONLY(port[0].context_id = upper_32_bits(desc[0])); > port[0].count++; > diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h > index 896838c..a319df9 100644 > --- a/drivers/gpu/drm/i915/intel_ringbuffer.h > +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h > @@ -603,6 +603,7 @@ bool intel_engine_add_wait(struct intel_engine_cs *engine, > void intel_engine_remove_wait(struct intel_engine_cs *engine, > struct intel_wait *wait); > void intel_engine_enable_signaling(struct drm_i915_gem_request *request); > +bool intel_engine_idle(struct intel_engine_cs *engine); intel_engine_is_idle() idle can be construed as a verb (and we have used it as such in the past, e.g. i915_gpu_idle()), so let's be careful. -Chris
diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c index 69a6416..ba09420 100644 --- a/drivers/gpu/drm/i915/intel_engine_cs.c +++ b/drivers/gpu/drm/i915/intel_engine_cs.c @@ -524,3 +524,13 @@ void intel_engine_get_instdone(struct intel_engine_cs *engine, break; } } + +bool intel_engine_idle(struct intel_engine_cs *engine) +{ + struct drm_i915_private *dev_priv = engine->i915; + + if (INTEL_GEN(engine->i915) > 2) + return I915_READ_MODE(engine) & MODE_IDLE; + + return true; +} diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index b21dbd4..3d909e3 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c @@ -347,9 +347,11 @@ static void execlists_submit_ports(struct intel_engine_cs *engine) u64 desc[2]; GEM_BUG_ON(port[0].count > 1); - if (!port[0].count) + if (!port[0].count) { + GEM_BUG_ON(!intel_engine_idle(engine)); execlists_context_status_change(port[0].request, INTEL_CONTEXT_SCHEDULE_IN); + } desc[0] = execlists_update_context(port[0].request); GEM_BUG_ONLY(port[0].context_id = upper_32_bits(desc[0])); port[0].count++; diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 896838c..a319df9 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h @@ -603,6 +603,7 @@ bool intel_engine_add_wait(struct intel_engine_cs *engine, void intel_engine_remove_wait(struct intel_engine_cs *engine, struct intel_wait *wait); void intel_engine_enable_signaling(struct drm_i915_gem_request *request); +bool intel_engine_idle(struct intel_engine_cs *engine); static inline bool intel_engine_has_waiter(const struct intel_engine_cs *engine) {
Assert for hardware idleness when we assign to execlist port, if for some reason we get off the tracks on sw tracking. Cc: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com> --- drivers/gpu/drm/i915/intel_engine_cs.c | 10 ++++++++++ drivers/gpu/drm/i915/intel_lrc.c | 4 +++- drivers/gpu/drm/i915/intel_ringbuffer.h | 1 + 3 files changed, 14 insertions(+), 1 deletion(-)