aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2012-07-15 07:34:22 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-07-25 04:39:57 -0400
commitd3373a241bbf034a1ef43e6417e3d0029c8a8145 (patch)
tree8e35bc0fb55b1ef69f53ed3f110fbaab4786b72e /drivers
parent79158103bf20c9ff55204ceb78a5773f422b03be (diff)
drm/i915: Flush the context object from the CPU caches upon switching
The issue is that we stale data in the CPU caches, when we come to swap-out the object, the CPU may short-circuit the reads from those cacheline and so corrupt the context object. Secondary, leaving the context object as being marked in the CPU write domain whilst on the GPU active list is a bad idea and will throw warnings later. Note: Thanks to calling set_to_gtt_domain with write = false and not setting any gpu write domain when putting a context object onto the active list (when we switch away from it) the set_to_gtt_domain call won't block. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Ben Widawsky <ben@bwidawsk.net> [danvet: Added a note to the commit message and a comment in the code to explain the clever non-blocking trick.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers')
-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 18eee8d2522d..65639ad72808 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -374,6 +374,17 @@ static int do_switch(struct drm_i915_gem_object *from_obj,
374 if (ret) 374 if (ret)
375 return ret; 375 return ret;
376 376
377 /* Clear this page out of any CPU caches for coherent swap-in/out. Note
378 * that thanks to write = false in this call and us not setting any gpu
379 * write domains when putting a context object onto the active list
380 * (when switching away from it), this won't block.
381 * XXX: We need a real interface to do this instead of trickery. */
382 ret = i915_gem_object_set_to_gtt_domain(to->obj, false);
383 if (ret) {
384 i915_gem_object_unpin(to->obj);
385 return ret;
386 }
387
377 if (!to->obj->has_global_gtt_mapping) 388 if (!to->obj->has_global_gtt_mapping)
378 i915_gem_gtt_bind_object(to->obj, to->obj->cache_level); 389 i915_gem_gtt_bind_object(to->obj, to->obj->cache_level);
379 390