drm/i915/bdw: GEN-specific logical ring emit batchbuffer start
authorOscar Mateo <oscar.mateo@intel.com>
Thu, 24 Jul 2014 16:04:32 +0000 (17:04 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 11 Aug 2014 21:12:34 +0000 (23:12 +0200)
Dispatch_execbuffer's evil twin.

Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
Reviewed-by: Damien Lespiau <damien.lespiau@intel.com>
[danvet: Ditch the check for aliasing ppgtt. It'll break soon and
execlists requires full ppgtt anyway.]
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
drivers/gpu/drm/i915/intel_lrc.c
drivers/gpu/drm/i915/intel_ringbuffer.h

index 009a8b5c088e98d9982b5187f284ccb9498555dd..e0d4ef2a5c30b6d2cac1f9c66fef80db167dbe32 100644 (file)
@@ -360,6 +360,28 @@ static int gen8_init_render_ring(struct intel_engine_cs *ring)
        return ret;
 }
 
+static int gen8_emit_bb_start(struct intel_ringbuffer *ringbuf,
+                             u64 offset, unsigned flags)
+{
+       struct intel_engine_cs *ring = ringbuf->ring;
+       struct drm_i915_private *dev_priv = ring->dev->dev_private;
+       bool ppgtt = !(flags & I915_DISPATCH_SECURE);
+       int ret;
+
+       ret = intel_logical_ring_begin(ringbuf, 4);
+       if (ret)
+               return ret;
+
+       /* FIXME(BDW): Address space and security selectors. */
+       intel_logical_ring_emit(ringbuf, MI_BATCH_BUFFER_START_GEN8 | (ppgtt<<8));
+       intel_logical_ring_emit(ringbuf, lower_32_bits(offset));
+       intel_logical_ring_emit(ringbuf, upper_32_bits(offset));
+       intel_logical_ring_emit(ringbuf, MI_NOOP);
+       intel_logical_ring_advance(ringbuf);
+
+       return 0;
+}
+
 static bool gen8_logical_ring_get_irq(struct intel_engine_cs *ring)
 {
        struct drm_device *dev = ring->dev;
@@ -594,6 +616,7 @@ static int logical_render_ring_init(struct drm_device *dev)
        ring->emit_flush = gen8_emit_flush_render;
        ring->irq_get = gen8_logical_ring_get_irq;
        ring->irq_put = gen8_logical_ring_put_irq;
+       ring->emit_bb_start = gen8_emit_bb_start;
 
        return logical_ring_init(dev, ring);
 }
@@ -618,6 +641,7 @@ static int logical_bsd_ring_init(struct drm_device *dev)
        ring->emit_flush = gen8_emit_flush;
        ring->irq_get = gen8_logical_ring_get_irq;
        ring->irq_put = gen8_logical_ring_put_irq;
+       ring->emit_bb_start = gen8_emit_bb_start;
 
        return logical_ring_init(dev, ring);
 }
@@ -642,6 +666,7 @@ static int logical_bsd2_ring_init(struct drm_device *dev)
        ring->emit_flush = gen8_emit_flush;
        ring->irq_get = gen8_logical_ring_get_irq;
        ring->irq_put = gen8_logical_ring_put_irq;
+       ring->emit_bb_start = gen8_emit_bb_start;
 
        return logical_ring_init(dev, ring);
 }
@@ -666,6 +691,7 @@ static int logical_blt_ring_init(struct drm_device *dev)
        ring->emit_flush = gen8_emit_flush;
        ring->irq_get = gen8_logical_ring_get_irq;
        ring->irq_put = gen8_logical_ring_put_irq;
+       ring->emit_bb_start = gen8_emit_bb_start;
 
        return logical_ring_init(dev, ring);
 }
@@ -690,6 +716,7 @@ static int logical_vebox_ring_init(struct drm_device *dev)
        ring->emit_flush = gen8_emit_flush;
        ring->irq_get = gen8_logical_ring_get_irq;
        ring->irq_put = gen8_logical_ring_put_irq;
+       ring->emit_bb_start = gen8_emit_bb_start;
 
        return logical_ring_init(dev, ring);
 }
index cb529ee10c8fde4e7a6fb771a031c185cb72a9e1..24437da91f77d31ae7273a2931051a9c06fef3f8 100644 (file)
@@ -229,6 +229,8 @@ struct  intel_engine_cs {
        int             (*emit_flush)(struct intel_ringbuffer *ringbuf,
                                      u32 invalidate_domains,
                                      u32 flush_domains);
+       int             (*emit_bb_start)(struct intel_ringbuffer *ringbuf,
+                                        u64 offset, unsigned flags);
 
        /**
         * List of objects currently involved in rendering from the