aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c21
1 files changed, 10 insertions, 11 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 03ec5e86d1a1..5986da26a492 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -181,15 +181,12 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
181 goto free_chunk; 181 goto free_chunk;
182 } 182 }
183 183
184 p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle);
185
186 /* get chunks */ 184 /* get chunks */
187 INIT_LIST_HEAD(&p->validated);
188 chunk_array_user = (uint64_t __user *)(unsigned long)(cs->in.chunks); 185 chunk_array_user = (uint64_t __user *)(unsigned long)(cs->in.chunks);
189 if (copy_from_user(chunk_array, chunk_array_user, 186 if (copy_from_user(chunk_array, chunk_array_user,
190 sizeof(uint64_t)*cs->in.num_chunks)) { 187 sizeof(uint64_t)*cs->in.num_chunks)) {
191 ret = -EFAULT; 188 ret = -EFAULT;
192 goto put_bo_list; 189 goto put_ctx;
193 } 190 }
194 191
195 p->nchunks = cs->in.num_chunks; 192 p->nchunks = cs->in.num_chunks;
@@ -197,7 +194,7 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
197 GFP_KERNEL); 194 GFP_KERNEL);
198 if (!p->chunks) { 195 if (!p->chunks) {
199 ret = -ENOMEM; 196 ret = -ENOMEM;
200 goto put_bo_list; 197 goto put_ctx;
201 } 198 }
202 199
203 for (i = 0; i < p->nchunks; i++) { 200 for (i = 0; i < p->nchunks; i++) {
@@ -273,9 +270,7 @@ free_partial_kdata:
273 for (; i >= 0; i--) 270 for (; i >= 0; i--)
274 drm_free_large(p->chunks[i].kdata); 271 drm_free_large(p->chunks[i].kdata);
275 kfree(p->chunks); 272 kfree(p->chunks);
276put_bo_list: 273put_ctx:
277 if (p->bo_list)
278 amdgpu_bo_list_put(p->bo_list);
279 amdgpu_ctx_put(p->ctx); 274 amdgpu_ctx_put(p->ctx);
280free_chunk: 275free_chunk:
281 kfree(chunk_array); 276 kfree(chunk_array);
@@ -383,7 +378,8 @@ int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p,
383 return 0; 378 return 0;
384} 379}
385 380
386static int amdgpu_cs_parser_relocs(struct amdgpu_cs_parser *p) 381static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
382 union drm_amdgpu_cs *cs)
387{ 383{
388 struct amdgpu_fpriv *fpriv = p->filp->driver_priv; 384 struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
389 struct amdgpu_cs_buckets buckets; 385 struct amdgpu_cs_buckets buckets;
@@ -391,12 +387,15 @@ static int amdgpu_cs_parser_relocs(struct amdgpu_cs_parser *p)
391 bool need_mmap_lock = false; 387 bool need_mmap_lock = false;
392 int i, r; 388 int i, r;
393 389
390 INIT_LIST_HEAD(&p->validated);
391
392 p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle);
394 if (p->bo_list) { 393 if (p->bo_list) {
395 need_mmap_lock = p->bo_list->has_userptr; 394 need_mmap_lock = p->bo_list->has_userptr;
396 amdgpu_cs_buckets_init(&buckets); 395 amdgpu_cs_buckets_init(&buckets);
397 for (i = 0; i < p->bo_list->num_entries; i++) 396 for (i = 0; i < p->bo_list->num_entries; i++)
398 amdgpu_cs_buckets_add(&buckets, &p->bo_list->array[i].tv.head, 397 amdgpu_cs_buckets_add(&buckets, &p->bo_list->array[i].tv.head,
399 p->bo_list->array[i].priority); 398 p->bo_list->array[i].priority);
400 399
401 amdgpu_cs_buckets_get_list(&buckets, &p->validated); 400 amdgpu_cs_buckets_get_list(&buckets, &p->validated);
402 } 401 }
@@ -827,7 +826,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
827 r = amdgpu_cs_handle_lockup(adev, r); 826 r = amdgpu_cs_handle_lockup(adev, r);
828 return r; 827 return r;
829 } 828 }
830 r = amdgpu_cs_parser_relocs(&parser); 829 r = amdgpu_cs_parser_bos(&parser, data);
831 if (r == -ENOMEM) 830 if (r == -ENOMEM)
832 DRM_ERROR("Not enough memory for command submission!\n"); 831 DRM_ERROR("Not enough memory for command submission!\n");
833 else if (r && r != -ERESTARTSYS) 832 else if (r && r != -ERESTARTSYS)