On Sun, Aug 24, 2014 at 04:54:22PM +0100, Chris Wilson wrote: > +static int execlists_add_request(struct i915_gem_request *rq) > +{ > + unsigned long flags; > + > + if (intel_engine_stopped(rq->engine)) > + return -EIO; > + > + spin_lock_irqsave(&rq->engine->execlist_lock, flags); > + > + list_add_tail(&rq->engine_list, &rq->engine->pending); > + if (rq->engine->execlists_submitted < 2) > + execlists_submit(rq->engine); > + > + spin_unlock_irqrestore(&rq->engine->execlist_lock, flags); > + > + return 0; > +} > + > +static int execlists_suspend(struct intel_engine_cs *engine) > +{ > + struct drm_i915_private *dev_priv = engine->i915; > + unsigned long flags; > + > + /* disable submitting more requests until resume */ > + spin_lock_irqsave(&engine->execlist_lock, flags); > + engine->execlists_submitted = ~0; > + spin_unlock_irqrestore(&engine->execlist_lock, flags); > + > + I915_WRITE(RING_MODE_GEN7(engine), > + _MASKED_BIT_ENABLE(GFX_REPLAY_MODE) | > + _MASKED_BIT_DISABLE(GFX_RUN_LIST_ENABLE)); > + POSTING_READ(RING_MODE_GEN7(engine)); > + DRM_DEBUG_DRIVER("Execlists disabled for %s\n", engine->name); > + > + return 0; > +} > + > +static int execlists_resume(struct intel_engine_cs *engine) > +{ > + struct drm_i915_private *dev_priv = engine->i915; > + unsigned long flags; > + > + /* XXX */ > + I915_WRITE_IMR(engine, ~(engine->irq_enable_mask | engine->irq_keep_mask)); > + I915_WRITE(RING_HWSTAM(engine->mmio_base), 0xffffffff); > + > + I915_WRITE(RING_MODE_GEN7(engine), > + _MASKED_BIT_DISABLE(GFX_REPLAY_MODE) | > + _MASKED_BIT_ENABLE(GFX_RUN_LIST_ENABLE)); > + POSTING_READ(RING_MODE_GEN7(engine)); > + DRM_DEBUG_DRIVER("Execlists enabled for %s\n", engine->name); > + > + spin_lock_irqsave(&engine->execlist_lock, flags); > + engine->execlists_submitted = 0; > + execlists_submit(engine); > + spin_unlock_irqrestore(&engine->execlist_lock, flags); > + > + return 0; > +} > + > +static int execlists_reset(struct intel_engine_cs *engine) > +{ > + unsigned long flags; > + > + spin_lock_irqsave(&engine->execlist_lock, flags); > + while (!list_empty(&engine->pending)) > + list_move_tail(engine->pending.next, &engine->requests); > + spin_unlock_irqrestore(&engine->execlist_lock, flags); > + > + return 0; > +} > + > +int intel_engine_enable_execlist(struct intel_engine_cs *engine) > +{ > + if (!i915.enable_execlists) > + return 0; > + > + engine->get_ring = execlists_get_ring; > + engine->put_ring = execlists_put_ring; > + engine->add_request = execlists_add_request; > + > + engine->suspend = execlists_suspend; > + engine->resume = execlists_resume; > + engine->reset = execlists_reset; This is missing engine->execlists_submitted = ~O; to suspend add_request until the engine is enabled. -Chris -- Chris Wilson, Intel Open Source Technology Centre _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx