|
@@ -340,6 +340,86 @@ static int gen8_init_render_ring(struct intel_engine_cs *ring)
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
+static int gen8_emit_flush(struct intel_ringbuffer *ringbuf,
|
|
|
+ u32 invalidate_domains,
|
|
|
+ u32 unused)
|
|
|
+{
|
|
|
+ struct intel_engine_cs *ring = ringbuf->ring;
|
|
|
+ struct drm_device *dev = ring->dev;
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+ uint32_t cmd;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = intel_logical_ring_begin(ringbuf, 4);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ cmd = MI_FLUSH_DW + 1;
|
|
|
+
|
|
|
+ if (ring == &dev_priv->ring[VCS]) {
|
|
|
+ if (invalidate_domains & I915_GEM_GPU_DOMAINS)
|
|
|
+ cmd |= MI_INVALIDATE_TLB | MI_INVALIDATE_BSD |
|
|
|
+ MI_FLUSH_DW_STORE_INDEX |
|
|
|
+ MI_FLUSH_DW_OP_STOREDW;
|
|
|
+ } else {
|
|
|
+ if (invalidate_domains & I915_GEM_DOMAIN_RENDER)
|
|
|
+ cmd |= MI_INVALIDATE_TLB | MI_FLUSH_DW_STORE_INDEX |
|
|
|
+ MI_FLUSH_DW_OP_STOREDW;
|
|
|
+ }
|
|
|
+
|
|
|
+ intel_logical_ring_emit(ringbuf, cmd);
|
|
|
+ intel_logical_ring_emit(ringbuf,
|
|
|
+ I915_GEM_HWS_SCRATCH_ADDR |
|
|
|
+ MI_FLUSH_DW_USE_GTT);
|
|
|
+ intel_logical_ring_emit(ringbuf, 0); /* upper addr */
|
|
|
+ intel_logical_ring_emit(ringbuf, 0); /* value */
|
|
|
+ intel_logical_ring_advance(ringbuf);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int gen8_emit_flush_render(struct intel_ringbuffer *ringbuf,
|
|
|
+ u32 invalidate_domains,
|
|
|
+ u32 flush_domains)
|
|
|
+{
|
|
|
+ struct intel_engine_cs *ring = ringbuf->ring;
|
|
|
+ u32 scratch_addr = ring->scratch.gtt_offset + 2 * CACHELINE_BYTES;
|
|
|
+ u32 flags = 0;
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ flags |= PIPE_CONTROL_CS_STALL;
|
|
|
+
|
|
|
+ if (flush_domains) {
|
|
|
+ flags |= PIPE_CONTROL_RENDER_TARGET_CACHE_FLUSH;
|
|
|
+ flags |= PIPE_CONTROL_DEPTH_CACHE_FLUSH;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (invalidate_domains) {
|
|
|
+ flags |= PIPE_CONTROL_TLB_INVALIDATE;
|
|
|
+ flags |= PIPE_CONTROL_INSTRUCTION_CACHE_INVALIDATE;
|
|
|
+ flags |= PIPE_CONTROL_TEXTURE_CACHE_INVALIDATE;
|
|
|
+ flags |= PIPE_CONTROL_VF_CACHE_INVALIDATE;
|
|
|
+ flags |= PIPE_CONTROL_CONST_CACHE_INVALIDATE;
|
|
|
+ flags |= PIPE_CONTROL_STATE_CACHE_INVALIDATE;
|
|
|
+ flags |= PIPE_CONTROL_QW_WRITE;
|
|
|
+ flags |= PIPE_CONTROL_GLOBAL_GTT_IVB;
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = intel_logical_ring_begin(ringbuf, 6);
|
|
|
+ if (ret)
|
|
|
+ return ret;
|
|
|
+
|
|
|
+ intel_logical_ring_emit(ringbuf, GFX_OP_PIPE_CONTROL(6));
|
|
|
+ intel_logical_ring_emit(ringbuf, flags);
|
|
|
+ intel_logical_ring_emit(ringbuf, scratch_addr);
|
|
|
+ intel_logical_ring_emit(ringbuf, 0);
|
|
|
+ intel_logical_ring_emit(ringbuf, 0);
|
|
|
+ intel_logical_ring_emit(ringbuf, 0);
|
|
|
+ intel_logical_ring_advance(ringbuf);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static u32 gen8_get_seqno(struct intel_engine_cs *ring, bool lazy_coherency)
|
|
|
{
|
|
|
return intel_read_status_page(ring, I915_GEM_HWS_INDEX);
|
|
@@ -451,6 +531,7 @@ static int logical_render_ring_init(struct drm_device *dev)
|
|
|
ring->get_seqno = gen8_get_seqno;
|
|
|
ring->set_seqno = gen8_set_seqno;
|
|
|
ring->emit_request = gen8_emit_request;
|
|
|
+ ring->emit_flush = gen8_emit_flush_render;
|
|
|
|
|
|
return logical_ring_init(dev, ring);
|
|
|
}
|
|
@@ -470,6 +551,7 @@ static int logical_bsd_ring_init(struct drm_device *dev)
|
|
|
ring->get_seqno = gen8_get_seqno;
|
|
|
ring->set_seqno = gen8_set_seqno;
|
|
|
ring->emit_request = gen8_emit_request;
|
|
|
+ ring->emit_flush = gen8_emit_flush;
|
|
|
|
|
|
return logical_ring_init(dev, ring);
|
|
|
}
|
|
@@ -489,6 +571,7 @@ static int logical_bsd2_ring_init(struct drm_device *dev)
|
|
|
ring->get_seqno = gen8_get_seqno;
|
|
|
ring->set_seqno = gen8_set_seqno;
|
|
|
ring->emit_request = gen8_emit_request;
|
|
|
+ ring->emit_flush = gen8_emit_flush;
|
|
|
|
|
|
return logical_ring_init(dev, ring);
|
|
|
}
|
|
@@ -508,6 +591,7 @@ static int logical_blt_ring_init(struct drm_device *dev)
|
|
|
ring->get_seqno = gen8_get_seqno;
|
|
|
ring->set_seqno = gen8_set_seqno;
|
|
|
ring->emit_request = gen8_emit_request;
|
|
|
+ ring->emit_flush = gen8_emit_flush;
|
|
|
|
|
|
return logical_ring_init(dev, ring);
|
|
|
}
|
|
@@ -527,6 +611,7 @@ static int logical_vebox_ring_init(struct drm_device *dev)
|
|
|
ring->get_seqno = gen8_get_seqno;
|
|
|
ring->set_seqno = gen8_set_seqno;
|
|
|
ring->emit_request = gen8_emit_request;
|
|
|
+ ring->emit_flush = gen8_emit_flush;
|
|
|
|
|
|
return logical_ring_init(dev, ring);
|
|
|
}
|