|
@@ -273,6 +273,7 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
|
|
|
{
|
|
|
struct drm_device *dev = obj->base.dev;
|
|
|
struct drm_gem_object *target_obj;
|
|
|
+ struct drm_i915_gem_object *target_i915_obj;
|
|
|
uint32_t target_offset;
|
|
|
int ret = -EINVAL;
|
|
|
|
|
@@ -281,7 +282,8 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
|
|
|
if (unlikely(target_obj == NULL))
|
|
|
return -ENOENT;
|
|
|
|
|
|
- target_offset = to_intel_bo(target_obj)->gtt_offset;
|
|
|
+ target_i915_obj = to_intel_bo(target_obj);
|
|
|
+ target_offset = target_i915_obj->gtt_offset;
|
|
|
|
|
|
/* The target buffer should have appeared before us in the
|
|
|
* exec_object list, so it should have a GTT space bound by now.
|
|
@@ -383,6 +385,16 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
|
|
|
io_mapping_unmap_atomic(reloc_page);
|
|
|
}
|
|
|
|
|
|
+ /* Sandybridge PPGTT errata: We need a global gtt mapping for MI and
|
|
|
+ * pipe_control writes because the gpu doesn't properly redirect them
|
|
|
+ * through the ppgtt for non_secure batchbuffers. */
|
|
|
+ if (unlikely(IS_GEN6(dev) &&
|
|
|
+ reloc->write_domain == I915_GEM_DOMAIN_INSTRUCTION &&
|
|
|
+ !target_i915_obj->has_global_gtt_mapping)) {
|
|
|
+ i915_gem_gtt_bind_object(target_i915_obj,
|
|
|
+ target_i915_obj->cache_level);
|
|
|
+ }
|
|
|
+
|
|
|
/* and update the user's relocation entry */
|
|
|
reloc->presumed_offset = target_offset;
|
|
|
|