aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c35
1 files changed, 19 insertions, 16 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index e069de8b54e6..8b26c970a3cb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -1044,29 +1044,27 @@ static int amdgpu_cs_process_fence_dep(struct amdgpu_cs_parser *p,
1044 return r; 1044 return r;
1045 } 1045 }
1046 1046
1047 fence = amdgpu_ctx_get_fence(ctx, entity, 1047 fence = amdgpu_ctx_get_fence(ctx, entity, deps[i].handle);
1048 deps[i].handle); 1048 amdgpu_ctx_put(ctx);
1049
1050 if (IS_ERR(fence))
1051 return PTR_ERR(fence);
1052 else if (!fence)
1053 continue;
1049 1054
1050 if (chunk->chunk_id == AMDGPU_CHUNK_ID_SCHEDULED_DEPENDENCIES) { 1055 if (chunk->chunk_id == AMDGPU_CHUNK_ID_SCHEDULED_DEPENDENCIES) {
1051 struct drm_sched_fence *s_fence = to_drm_sched_fence(fence); 1056 struct drm_sched_fence *s_fence;
1052 struct dma_fence *old = fence; 1057 struct dma_fence *old = fence;
1053 1058
1059 s_fence = to_drm_sched_fence(fence);
1054 fence = dma_fence_get(&s_fence->scheduled); 1060 fence = dma_fence_get(&s_fence->scheduled);
1055 dma_fence_put(old); 1061 dma_fence_put(old);
1056 } 1062 }
1057 1063
1058 if (IS_ERR(fence)) { 1064 r = amdgpu_sync_fence(p->adev, &p->job->sync, fence, true);
1059 r = PTR_ERR(fence); 1065 dma_fence_put(fence);
1060 amdgpu_ctx_put(ctx); 1066 if (r)
1061 return r; 1067 return r;
1062 } else if (fence) {
1063 r = amdgpu_sync_fence(p->adev, &p->job->sync, fence,
1064 true);
1065 dma_fence_put(fence);
1066 amdgpu_ctx_put(ctx);
1067 if (r)
1068 return r;
1069 }
1070 } 1068 }
1071 return 0; 1069 return 0;
1072} 1070}
@@ -1145,6 +1143,9 @@ static int amdgpu_cs_process_syncobj_out_dep(struct amdgpu_cs_parser *p,
1145 num_deps = chunk->length_dw * 4 / 1143 num_deps = chunk->length_dw * 4 /
1146 sizeof(struct drm_amdgpu_cs_chunk_sem); 1144 sizeof(struct drm_amdgpu_cs_chunk_sem);
1147 1145
1146 if (p->post_deps)
1147 return -EINVAL;
1148
1148 p->post_deps = kmalloc_array(num_deps, sizeof(*p->post_deps), 1149 p->post_deps = kmalloc_array(num_deps, sizeof(*p->post_deps),
1149 GFP_KERNEL); 1150 GFP_KERNEL);
1150 p->num_post_deps = 0; 1151 p->num_post_deps = 0;
@@ -1168,8 +1169,7 @@ static int amdgpu_cs_process_syncobj_out_dep(struct amdgpu_cs_parser *p,
1168 1169
1169 1170
1170static int amdgpu_cs_process_syncobj_timeline_out_dep(struct amdgpu_cs_parser *p, 1171static int amdgpu_cs_process_syncobj_timeline_out_dep(struct amdgpu_cs_parser *p,
1171 struct amdgpu_cs_chunk 1172 struct amdgpu_cs_chunk *chunk)
1172 *chunk)
1173{ 1173{
1174 struct drm_amdgpu_cs_chunk_syncobj *syncobj_deps; 1174 struct drm_amdgpu_cs_chunk_syncobj *syncobj_deps;
1175 unsigned num_deps; 1175 unsigned num_deps;
@@ -1179,6 +1179,9 @@ static int amdgpu_cs_process_syncobj_timeline_out_dep(struct amdgpu_cs_parser *p
1179 num_deps = chunk->length_dw * 4 / 1179 num_deps = chunk->length_dw * 4 /
1180 sizeof(struct drm_amdgpu_cs_chunk_syncobj); 1180 sizeof(struct drm_amdgpu_cs_chunk_syncobj);
1181 1181
1182 if (p->post_deps)
1183 return -EINVAL;
1184
1182 p->post_deps = kmalloc_array(num_deps, sizeof(*p->post_deps), 1185 p->post_deps = kmalloc_array(num_deps, sizeof(*p->post_deps),
1183 GFP_KERNEL); 1186 GFP_KERNEL);
1184 p->num_post_deps = 0; 1187 p->num_post_deps = 0;