drm/i915/skl: Program the DDB allocation
[deliverable/linux.git] / drivers / gpu / drm / i915 / intel_lrc.c
index bafd38b5703eba00e2ca3c2ffb00fea7840b4638..292beb0fa1dca3ea520fad0b2bf6ce9fb493eff0 100644 (file)
@@ -356,9 +356,9 @@ static int execlists_ctx_write_tail(struct drm_i915_gem_object *ctx_obj, u32 tai
        return 0;
 }
 
-static int execlists_submit_context(struct intel_engine_cs *ring,
-                                   struct intel_context *to0, u32 tail0,
-                                   struct intel_context *to1, u32 tail1)
+static void execlists_submit_contexts(struct intel_engine_cs *ring,
+                                     struct intel_context *to0, u32 tail0,
+                                     struct intel_context *to1, u32 tail1)
 {
        struct drm_i915_gem_object *ctx_obj0;
        struct drm_i915_gem_object *ctx_obj1 = NULL;
@@ -378,8 +378,6 @@ static int execlists_submit_context(struct intel_engine_cs *ring,
        }
 
        execlists_elsp_write(ring, ctx_obj0, ctx_obj1);
-
-       return 0;
 }
 
 static void execlists_context_unqueue(struct intel_engine_cs *ring)
@@ -413,9 +411,9 @@ static void execlists_context_unqueue(struct intel_engine_cs *ring)
 
        WARN_ON(req1 && req1->elsp_submitted);
 
-       WARN_ON(execlists_submit_context(ring, req0->ctx, req0->tail,
-                                        req1 ? req1->ctx : NULL,
-                                        req1 ? req1->tail : 0));
+       execlists_submit_contexts(ring, req0->ctx, req0->tail,
+                                 req1 ? req1->ctx : NULL,
+                                 req1 ? req1->tail : 0);
 
        req0->elsp_submitted++;
        if (req1)
@@ -1063,7 +1061,7 @@ static bool gen8_logical_ring_get_irq(struct intel_engine_cs *ring)
        struct drm_i915_private *dev_priv = dev->dev_private;
        unsigned long flags;
 
-       if (!dev->irq_enabled)
+       if (WARN_ON(!intel_irqs_enabled(dev_priv)))
                return false;
 
        spin_lock_irqsave(&dev_priv->irq_lock, flags);
@@ -1214,11 +1212,13 @@ static int gen8_emit_request(struct intel_ringbuffer *ringbuf)
  */
 void intel_logical_ring_cleanup(struct intel_engine_cs *ring)
 {
-       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       struct drm_i915_private *dev_priv;
 
        if (!intel_ring_initialized(ring))
                return;
 
+       dev_priv = ring->dev->dev_private;
+
        intel_logical_ring_stop(ring);
        WARN_ON((I915_READ_MODE(ring) & MODE_IDLE) == 0);
        ring->preallocated_lazy_request = NULL;
@@ -1649,6 +1649,27 @@ static uint32_t get_lr_context_size(struct intel_engine_cs *ring)
        return ret;
 }
 
+static int lrc_setup_hardware_status_page(struct intel_engine_cs *ring,
+               struct drm_i915_gem_object *default_ctx_obj)
+{
+       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+
+       /* The status page is offset 0 from the default context object
+        * in LRC mode. */
+       ring->status_page.gfx_addr = i915_gem_obj_ggtt_offset(default_ctx_obj);
+       ring->status_page.page_addr =
+                       kmap(sg_page(default_ctx_obj->pages->sgl));
+       if (ring->status_page.page_addr == NULL)
+               return -ENOMEM;
+       ring->status_page.obj = default_ctx_obj;
+
+       I915_WRITE(RING_HWS_PGA(ring->mmio_base),
+                       (u32)ring->status_page.gfx_addr);
+       POSTING_READ(RING_HWS_PGA(ring->mmio_base));
+
+       return 0;
+}
+
 /**
  * intel_lr_context_deferred_create() - create the LRC specific bits of a context
  * @ctx: LR context to create.
@@ -1734,14 +1755,11 @@ int intel_lr_context_deferred_create(struct intel_context *ctx,
        ctx->engine[ring->id].state = ctx_obj;
 
        if (ctx == ring->default_context) {
-               /* The status page is offset 0 from the default context object
-                * in LRC mode. */
-               ring->status_page.gfx_addr = i915_gem_obj_ggtt_offset(ctx_obj);
-               ring->status_page.page_addr =
-                               kmap(sg_page(ctx_obj->pages->sgl));
-               if (ring->status_page.page_addr == NULL)
-                       return -ENOMEM;
-               ring->status_page.obj = ctx_obj;
+               ret = lrc_setup_hardware_status_page(ring, ctx_obj);
+               if (ret) {
+                       DRM_ERROR("Failed to setup hardware status page\n");
+                       goto error;
+               }
        }
 
        if (ring->id == RCS && !ctx->rcs_initialized) {
This page took 0.039484 seconds and 5 git commands to generate.