aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem_context.c
diff options
context:
space:
mode:
authorBen Widawsky <ben@bwidawsk.net>2012-06-04 17:42:50 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-06-14 11:36:19 -0400
commit12b0286f49947a6cdc9285032d918466a8c3f5f9 (patch)
tree7fa02ef380f2260b2c5eae769b6ac8c40e7d92b2 /drivers/gpu/drm/i915/i915_gem_context.c
parentcc0f6398225ffd2b890ff83eafe212b1ae863cad (diff)
drm/i915: possibly invalidate TLB before context switch
From http://intellinuxgraphics.org/documentation/SNB/IHD_OS_Vol1_Part3.pdf [DevSNB] If Flush TLB invalidation Mode is enabled it's the driver's responsibility to invalidate the TLBs at least once after the previous context switch after any GTT mappings changed (including new GTT entries). This can be done by a pipelined PIPE_CONTROL with TLB inv bit set immediately before MI_SET_CONTEXT. On GEN7 the invalidation mode is explicitly set, but this appears to be lacking for GEN6. Since I don't know the history on this, I've decided to dynamically read the value at ring init time, and use that value throughout. v2: better comment (daniel) Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_context.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem_context.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index d49d5fc0a592..fb1e1d22572c 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -324,6 +324,17 @@ mi_set_context(struct intel_ring_buffer *ring,
324{ 324{
325 int ret; 325 int ret;
326 326
327 /* w/a: If Flush TLB Invalidation Mode is enabled, driver must do a TLB
328 * invalidation prior to MI_SET_CONTEXT. On GEN6 we don't set the value
329 * explicitly, so we rely on the value at ring init, stored in
330 * itlb_before_ctx_switch.
331 */
332 if (IS_GEN6(ring->dev) && ring->itlb_before_ctx_switch) {
333 ret = ring->flush(ring, 0, 0);
334 if (ret)
335 return ret;
336 }
337
327 ret = intel_ring_begin(ring, 6); 338 ret = intel_ring_begin(ring, 6);
328 if (ret) 339 if (ret)
329 return ret; 340 return ret;