aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichel Thierry <michel.thierry@intel.com>2014-11-11 11:47:33 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2014-11-14 04:29:25 -0500
commit771b9a532483cc45df19823b8dfaa0cecfd45836 (patch)
tree9054c769e5b430c0ac91881399a74662bde092a7
parentc6e8f39db96d63a1b4eda32e7dfeac093edc09ee (diff)
drm/i915: Initialize workarounds in logical ring mode too
Following the legacy ring submission example, update the ring->init_context() hook to support the execlist submission mode. v2: update to use the new workaround macros and cleanup unused code. This takes care of both bdw and chv workarounds. v2.1: Add missing call to init_context() during deferred context creation. v3: Split init_context (emit) in legacy/lrc modes. For lrc, get the ringbuf from the context (Mika/Daniel). v4: Merge init_context interfaces back, the legacy mode only needs the ring, but the lrc mode needs the ring and context (Mika). Issue: VIZ-4092 Issue: GMIN-3475 Change-Id: Ie3d093b2542ab0e2a44b90460533e2f979788d6c Cc: Deepak S <deepak.s@intel.com> Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com> Cc: Daniel Vetter <daniel@ffwll.ch> Signed-off-by: Michel Thierry <michel.thierry@intel.com> Signed-off-by: Arun Siluvery <arun.siluvery@linux.intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com> [danvet: Align function paramater lists properly.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/i915_gem_context.c2
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c47
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c5
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h5
4 files changed, 54 insertions, 5 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 1fb00008623d..d17ff435f276 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -635,7 +635,7 @@ done:
635 635
636 if (uninitialized) { 636 if (uninitialized) {
637 if (ring->init_context) { 637 if (ring->init_context) {
638 ret = ring->init_context(ring); 638 ret = ring->init_context(ring, to);
639 if (ret) 639 if (ret)
640 DRM_ERROR("ring init context: %d\n", ret); 640 DRM_ERROR("ring init context: %d\n", ret);
641 } 641 }
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 6025ac754c37..2a1a71933420 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -989,6 +989,44 @@ int intel_logical_ring_begin(struct intel_ringbuffer *ringbuf, int num_dwords)
989 return 0; 989 return 0;
990} 990}
991 991
992static int intel_logical_ring_workarounds_emit(struct intel_engine_cs *ring,
993 struct intel_context *ctx)
994{
995 int ret, i;
996 struct intel_ringbuffer *ringbuf = ctx->engine[ring->id].ringbuf;
997 struct drm_device *dev = ring->dev;
998 struct drm_i915_private *dev_priv = dev->dev_private;
999 struct i915_workarounds *w = &dev_priv->workarounds;
1000
1001 if (WARN_ON(w->count == 0))
1002 return 0;
1003
1004 ring->gpu_caches_dirty = true;
1005 ret = logical_ring_flush_all_caches(ringbuf);
1006 if (ret)
1007 return ret;
1008
1009 ret = intel_logical_ring_begin(ringbuf, w->count * 2 + 2);
1010 if (ret)
1011 return ret;
1012
1013 intel_logical_ring_emit(ringbuf, MI_LOAD_REGISTER_IMM(w->count));
1014 for (i = 0; i < w->count; i++) {
1015 intel_logical_ring_emit(ringbuf, w->reg[i].addr);
1016 intel_logical_ring_emit(ringbuf, w->reg[i].value);
1017 }
1018 intel_logical_ring_emit(ringbuf, MI_NOOP);
1019
1020 intel_logical_ring_advance(ringbuf);
1021
1022 ring->gpu_caches_dirty = true;
1023 ret = logical_ring_flush_all_caches(ringbuf);
1024 if (ret)
1025 return ret;
1026
1027 return 0;
1028}
1029
992static int gen8_init_common_ring(struct intel_engine_cs *ring) 1030static int gen8_init_common_ring(struct intel_engine_cs *ring)
993{ 1031{
994 struct drm_device *dev = ring->dev; 1032 struct drm_device *dev = ring->dev;
@@ -1032,7 +1070,7 @@ static int gen8_init_render_ring(struct intel_engine_cs *ring)
1032 1070
1033 I915_WRITE(INSTPM, _MASKED_BIT_ENABLE(INSTPM_FORCE_ORDERING)); 1071 I915_WRITE(INSTPM, _MASKED_BIT_ENABLE(INSTPM_FORCE_ORDERING));
1034 1072
1035 return ret; 1073 return init_workarounds_ring(ring);
1036} 1074}
1037 1075
1038static int gen8_emit_bb_start(struct intel_ringbuffer *ringbuf, 1076static int gen8_emit_bb_start(struct intel_ringbuffer *ringbuf,
@@ -1282,6 +1320,7 @@ static int logical_render_ring_init(struct drm_device *dev)
1282 ring->irq_keep_mask |= GT_RENDER_L3_PARITY_ERROR_INTERRUPT; 1320 ring->irq_keep_mask |= GT_RENDER_L3_PARITY_ERROR_INTERRUPT;
1283 1321
1284 ring->init = gen8_init_render_ring; 1322 ring->init = gen8_init_render_ring;
1323 ring->init_context = intel_logical_ring_workarounds_emit;
1285 ring->cleanup = intel_fini_pipe_control; 1324 ring->cleanup = intel_fini_pipe_control;
1286 ring->get_seqno = gen8_get_seqno; 1325 ring->get_seqno = gen8_get_seqno;
1287 ring->set_seqno = gen8_set_seqno; 1326 ring->set_seqno = gen8_set_seqno;
@@ -1763,6 +1802,12 @@ int intel_lr_context_deferred_create(struct intel_context *ctx,
1763 } 1802 }
1764 1803
1765 if (ring->id == RCS && !ctx->rcs_initialized) { 1804 if (ring->id == RCS && !ctx->rcs_initialized) {
1805 if (ring->init_context) {
1806 ret = ring->init_context(ring, ctx);
1807 if (ret)
1808 DRM_ERROR("ring init context: %d\n", ret);
1809 }
1810
1766 ret = intel_lr_context_render_state_init(ring, ctx); 1811 ret = intel_lr_context_render_state_init(ring, ctx);
1767 if (ret) { 1812 if (ret) {
1768 DRM_ERROR("Init render state failed: %d\n", ret); 1813 DRM_ERROR("Init render state failed: %d\n", ret);
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index a09aae70e579..ae092589ea0c 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -665,7 +665,8 @@ err:
665 return ret; 665 return ret;
666} 666}
667 667
668static int intel_ring_workarounds_emit(struct intel_engine_cs *ring) 668static int intel_ring_workarounds_emit(struct intel_engine_cs *ring,
669 struct intel_context *ctx)
669{ 670{
670 int ret, i; 671 int ret, i;
671 struct drm_device *dev = ring->dev; 672 struct drm_device *dev = ring->dev;
@@ -806,7 +807,7 @@ static int chv_init_workarounds(struct intel_engine_cs *ring)
806 return 0; 807 return 0;
807} 808}
808 809
809static int init_workarounds_ring(struct intel_engine_cs *ring) 810int init_workarounds_ring(struct intel_engine_cs *ring)
810{ 811{
811 struct drm_device *dev = ring->dev; 812 struct drm_device *dev = ring->dev;
812 struct drm_i915_private *dev_priv = dev->dev_private; 813 struct drm_i915_private *dev_priv = dev->dev_private;
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 96479c89f4bd..aab2e2f90a74 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -148,7 +148,8 @@ struct intel_engine_cs {
148 148
149 int (*init)(struct intel_engine_cs *ring); 149 int (*init)(struct intel_engine_cs *ring);
150 150
151 int (*init_context)(struct intel_engine_cs *ring); 151 int (*init_context)(struct intel_engine_cs *ring,
152 struct intel_context *ctx);
152 153
153 void (*write_tail)(struct intel_engine_cs *ring, 154 void (*write_tail)(struct intel_engine_cs *ring,
154 u32 value); 155 u32 value);
@@ -424,6 +425,8 @@ int intel_init_vebox_ring_buffer(struct drm_device *dev);
424u64 intel_ring_get_active_head(struct intel_engine_cs *ring); 425u64 intel_ring_get_active_head(struct intel_engine_cs *ring);
425void intel_ring_setup_status_page(struct intel_engine_cs *ring); 426void intel_ring_setup_status_page(struct intel_engine_cs *ring);
426 427
428int init_workarounds_ring(struct intel_engine_cs *ring);
429
427static inline u32 intel_ring_get_tail(struct intel_ringbuffer *ringbuf) 430static inline u32 intel_ring_get_tail(struct intel_ringbuffer *ringbuf)
428{ 431{
429 return ringbuf->tail; 432 return ringbuf->tail;