@@ -480,6 +480,30 @@ static int gen8_init_render_ring(struct intel_engine_cs *ring)
return ret;
}
+static int gen8_emit_bb_start(struct intel_engine_cs *ring,
+ struct intel_context *ctx,
+ u64 offset, unsigned flags)
+{
+ struct drm_i915_private *dev_priv = ring->dev->dev_private;
+ bool ppgtt = dev_priv->mm.aliasing_ppgtt != NULL &&
+ !(flags & I915_DISPATCH_SECURE);
+ struct intel_ringbuffer *ringbuf = logical_ringbuf_get(ring, ctx);
+ int ret;
+
+ ret = intel_logical_ring_begin(ring, ctx, 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;
@@ -746,6 +770,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);
}
@@ -771,6 +796,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);
}
@@ -796,6 +822,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);
}
@@ -821,6 +848,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);
}
@@ -846,6 +874,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);
}
@@ -165,6 +165,9 @@ struct intel_engine_cs {
struct intel_context *ctx,
u32 invalidate_domains,
u32 flush_domains);
+ int (*emit_bb_start)(struct intel_engine_cs *ring,
+ struct intel_context *ctx,
+ u64 offset, unsigned flags);
/**
* List of objects currently involved in rendering from the