diff options
Diffstat (limited to 'drivers/gpu/drm/amd')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 21 |
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); |
| 276 | put_bo_list: | 273 | put_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); |
| 280 | free_chunk: | 275 | free_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 | ||
| 386 | static int amdgpu_cs_parser_relocs(struct amdgpu_cs_parser *p) | 381 | static 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) |
