diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_gem_execbuffer.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 17 |
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 | ||
| 548 | static int | 548 | static int |
| 549 | i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj, | 549 | i915_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 | } |
