aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/i915_gem_execbuffer.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2017-06-28 03:07:15 -0400
committerDave Airlie <airlied@redhat.com>2017-06-28 03:07:15 -0400
commit9ff1beb1d19ffe2b26bf9cd2d33e6073d4f4b5fe (patch)
tree0d154cdf42dfeeb1afa11ee05395f5c16e5fa0f0 /drivers/gpu/drm/i915/i915_gem_execbuffer.c
parent5193c08c7e82248cb6b1e5d672d261c4da6bb47b (diff)
parent611cdf3695a307fdca3ff3779a1e6cca935e2d31 (diff)
Merge tag 'drm-intel-fixes-2017-06-27' of git://anongit.freedesktop.org/git/drm-intel into drm-fixes
Just a few minor fixes. Important one is the execbuf async fix (aka ANDROID_native_sync). There was another patch for a display coherency corner case on APL, but we've random-walked in that space too much, and the cherry-pick looked really invasive. * tag 'drm-intel-fixes-2017-06-27' of git://anongit.freedesktop.org/git/drm-intel: drm/i915: Disable EXEC_OBJECT_ASYNC when doing relocations drm/i915: Hold struct_mutex for per-file stats in debugfs/i915_gem_object drm/i915: Retire the VMA's fence tracker before unbinding
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_execbuffer.c')
-rw-r--r--drivers/gpu/drm/i915/i915_gem_execbuffer.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
index a3e59c8ef27b..9ad13eeed904 100644
--- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
+++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
@@ -546,11 +546,12 @@ repeat:
546} 546}
547 547
548static int 548static int
549i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj, 549i915_gem_execbuffer_relocate_entry(struct i915_vma *vma,
550 struct eb_vmas *eb, 550 struct eb_vmas *eb,
551 struct drm_i915_gem_relocation_entry *reloc, 551 struct drm_i915_gem_relocation_entry *reloc,
552 struct reloc_cache *cache) 552 struct reloc_cache *cache)
553{ 553{
554 struct drm_i915_gem_object *obj = vma->obj;
554 struct drm_i915_private *dev_priv = to_i915(obj->base.dev); 555 struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
555 struct drm_gem_object *target_obj; 556 struct drm_gem_object *target_obj;
556 struct drm_i915_gem_object *target_i915_obj; 557 struct drm_i915_gem_object *target_i915_obj;
@@ -628,6 +629,16 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
628 return -EINVAL; 629 return -EINVAL;
629 } 630 }
630 631
632 /*
633 * If we write into the object, we need to force the synchronisation
634 * barrier, either with an asynchronous clflush or if we executed the
635 * patching using the GPU (though that should be serialised by the
636 * timeline). To be completely sure, and since we are required to
637 * do relocations we are already stalling, disable the user's opt
638 * of our synchronisation.
639 */
640 vma->exec_entry->flags &= ~EXEC_OBJECT_ASYNC;
641
631 ret = relocate_entry(obj, reloc, cache, target_offset); 642 ret = relocate_entry(obj, reloc, cache, target_offset);
632 if (ret) 643 if (ret)
633 return ret; 644 return ret;
@@ -678,7 +689,7 @@ i915_gem_execbuffer_relocate_vma(struct i915_vma *vma,
678 do { 689 do {
679 u64 offset = r->presumed_offset; 690 u64 offset = r->presumed_offset;
680 691
681 ret = i915_gem_execbuffer_relocate_entry(vma->obj, eb, r, &cache); 692 ret = i915_gem_execbuffer_relocate_entry(vma, eb, r, &cache);
682 if (ret) 693 if (ret)
683 goto out; 694 goto out;
684 695
@@ -726,7 +737,7 @@ i915_gem_execbuffer_relocate_vma_slow(struct i915_vma *vma,
726 737
727 reloc_cache_init(&cache, eb->i915); 738 reloc_cache_init(&cache, eb->i915);
728 for (i = 0; i < entry->relocation_count; i++) { 739 for (i = 0; i < entry->relocation_count; i++) {
729 ret = i915_gem_execbuffer_relocate_entry(vma->obj, eb, &relocs[i], &cache); 740 ret = i915_gem_execbuffer_relocate_entry(vma, eb, &relocs[i], &cache);
730 if (ret) 741 if (ret)
731 break; 742 break;
732 } 743 }