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@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to