diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c index 7700dc22f243..3826d5aea0a6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_prime.c | |||
@@ -74,20 +74,36 @@ amdgpu_gem_prime_import_sg_table(struct drm_device *dev, | |||
74 | if (ret) | 74 | if (ret) |
75 | return ERR_PTR(ret); | 75 | return ERR_PTR(ret); |
76 | 76 | ||
77 | bo->prime_shared_count = 1; | ||
77 | return &bo->gem_base; | 78 | return &bo->gem_base; |
78 | } | 79 | } |
79 | 80 | ||
80 | int amdgpu_gem_prime_pin(struct drm_gem_object *obj) | 81 | int amdgpu_gem_prime_pin(struct drm_gem_object *obj) |
81 | { | 82 | { |
82 | struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); | 83 | struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); |
83 | int ret = 0; | 84 | long ret = 0; |
84 | 85 | ||
85 | ret = amdgpu_bo_reserve(bo, false); | 86 | ret = amdgpu_bo_reserve(bo, false); |
86 | if (unlikely(ret != 0)) | 87 | if (unlikely(ret != 0)) |
87 | return ret; | 88 | return ret; |
88 | 89 | ||
90 | /* | ||
91 | * Wait for all shared fences to complete before we switch to future | ||
92 | * use of exclusive fence on this prime shared bo. | ||
93 | */ | ||
94 | ret = reservation_object_wait_timeout_rcu(bo->tbo.resv, true, false, | ||
95 | MAX_SCHEDULE_TIMEOUT); | ||
96 | if (unlikely(ret < 0)) { | ||
97 | DRM_DEBUG_PRIME("Fence wait failed: %li\n", ret); | ||
98 | amdgpu_bo_unreserve(bo); | ||
99 | return ret; | ||
100 | } | ||
101 | |||
89 | /* pin buffer into GTT */ | 102 | /* pin buffer into GTT */ |
90 | ret = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT, NULL); | 103 | ret = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT, NULL); |
104 | if (likely(ret == 0)) | ||
105 | bo->prime_shared_count++; | ||
106 | |||
91 | amdgpu_bo_unreserve(bo); | 107 | amdgpu_bo_unreserve(bo); |
92 | return ret; | 108 | return ret; |
93 | } | 109 | } |
@@ -102,6 +118,8 @@ void amdgpu_gem_prime_unpin(struct drm_gem_object *obj) | |||
102 | return; | 118 | return; |
103 | 119 | ||
104 | amdgpu_bo_unpin(bo); | 120 | amdgpu_bo_unpin(bo); |
121 | if (bo->prime_shared_count) | ||
122 | bo->prime_shared_count--; | ||
105 | amdgpu_bo_unreserve(bo); | 123 | amdgpu_bo_unreserve(bo); |
106 | } | 124 | } |
107 | 125 | ||