summaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorArun Siluvery <arun.siluvery@linux.intel.com>2015-06-19 18:37:11 +0100
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-06-23 14:01:40 +0200
commitc4db7599194248214b343d1ef1a1bc53d6cff187 (patch)
treea1bd1cd6df43bf4bf05949f964077786833737ca /drivers/gpu/drm/i915
parent17ee950df38b649d8431e2f6f7f85282d89f5398 (diff)
downloadtalos-obmc-linux-c4db7599194248214b343d1ef1a1bc53d6cff187.tar.gz
talos-obmc-linux-c4db7599194248214b343d1ef1a1bc53d6cff187.zip
drm/i915/gen8: Re-order init pipe_control in lrc mode
Some of the WA applied using WA batch buffers perform writes to scratch page. In the current flow WA are initialized before scratch obj is allocated. This patch reorders intel_init_pipe_control() to have a valid scratch obj before we initialize WA. v2: Check for valid scratch page before initializing WA as some of them perform writes to it. Cc: Chris Wilson <chris@chris-wilson.co.uk> Cc: Dave Gordon <david.s.gordon@intel.com> Signed-off-by: Michel Thierry <michel.thierry@intel.com> Signed-off-by: Arun Siluvery <arun.siluvery@linux.intel.com> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 9b791a3d47dd..f83d97ea4028 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -1224,6 +1224,12 @@ static int intel_init_workaround_bb(struct intel_engine_cs *ring)
WARN_ON(ring->id != RCS);
+ /* some WA perform writes to scratch page, ensure it is valid */
+ if (ring->scratch.obj == NULL) {
+ DRM_ERROR("scratch page not allocated for %s\n", ring->name);
+ return -EINVAL;
+ }
+
ret = lrc_setup_wa_ctx_obj(ring, PAGE_SIZE);
if (ret) {
DRM_DEBUG_DRIVER("Failed to setup context WA page: %d\n", ret);
@@ -1658,7 +1664,8 @@ static int logical_render_ring_init(struct drm_device *dev)
ring->emit_bb_start = gen8_emit_bb_start;
ring->dev = dev;
- ret = logical_ring_init(dev, ring);
+
+ ret = intel_init_pipe_control(ring);
if (ret)
return ret;
@@ -1673,9 +1680,10 @@ static int logical_render_ring_init(struct drm_device *dev)
ret);
}
- ret = intel_init_pipe_control(ring);
- if (ret)
+ ret = logical_ring_init(dev, ring);
+ if (ret) {
lrc_destroy_wa_ctx_obj(ring);
+ }
return ret;
}
OpenPOWER on IntegriCloud