diff options
Diffstat (limited to 'drivers/gpu/drm/vc4/vc4_gem.c')
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_gem.c | 41 |
1 files changed, 20 insertions, 21 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c index 39f29e759334..48ce30a6f4b5 100644 --- a/drivers/gpu/drm/vc4/vc4_gem.c +++ b/drivers/gpu/drm/vc4/vc4_gem.c | |||
@@ -71,7 +71,7 @@ vc4_get_hang_state_ioctl(struct drm_device *dev, void *data, | |||
71 | struct vc4_dev *vc4 = to_vc4_dev(dev); | 71 | struct vc4_dev *vc4 = to_vc4_dev(dev); |
72 | unsigned long irqflags; | 72 | unsigned long irqflags; |
73 | u32 i; | 73 | u32 i; |
74 | int ret; | 74 | int ret = 0; |
75 | 75 | ||
76 | spin_lock_irqsave(&vc4->job_lock, irqflags); | 76 | spin_lock_irqsave(&vc4->job_lock, irqflags); |
77 | kernel_state = vc4->hang_state; | 77 | kernel_state = vc4->hang_state; |
@@ -119,9 +119,11 @@ vc4_get_hang_state_ioctl(struct drm_device *dev, void *data, | |||
119 | bo_state[i].size = vc4_bo->base.base.size; | 119 | bo_state[i].size = vc4_bo->base.base.size; |
120 | } | 120 | } |
121 | 121 | ||
122 | ret = copy_to_user((void __user *)(uintptr_t)get_state->bo, | 122 | if (copy_to_user((void __user *)(uintptr_t)get_state->bo, |
123 | bo_state, | 123 | bo_state, |
124 | state->bo_count * sizeof(*bo_state)); | 124 | state->bo_count * sizeof(*bo_state))) |
125 | ret = -EFAULT; | ||
126 | |||
125 | kfree(bo_state); | 127 | kfree(bo_state); |
126 | 128 | ||
127 | err_free: | 129 | err_free: |
@@ -143,7 +145,7 @@ vc4_save_hang_state(struct drm_device *dev) | |||
143 | unsigned long irqflags; | 145 | unsigned long irqflags; |
144 | unsigned int i, unref_list_count; | 146 | unsigned int i, unref_list_count; |
145 | 147 | ||
146 | kernel_state = kcalloc(1, sizeof(*state), GFP_KERNEL); | 148 | kernel_state = kcalloc(1, sizeof(*kernel_state), GFP_KERNEL); |
147 | if (!kernel_state) | 149 | if (!kernel_state) |
148 | return; | 150 | return; |
149 | 151 | ||
@@ -554,34 +556,31 @@ vc4_get_bcl(struct drm_device *dev, struct vc4_exec_info *exec) | |||
554 | exec->shader_state = temp + exec_size; | 556 | exec->shader_state = temp + exec_size; |
555 | exec->shader_state_size = args->shader_rec_count; | 557 | exec->shader_state_size = args->shader_rec_count; |
556 | 558 | ||
557 | ret = copy_from_user(bin, | 559 | if (copy_from_user(bin, |
558 | (void __user *)(uintptr_t)args->bin_cl, | 560 | (void __user *)(uintptr_t)args->bin_cl, |
559 | args->bin_cl_size); | 561 | args->bin_cl_size)) { |
560 | if (ret) { | 562 | ret = -EFAULT; |
561 | DRM_ERROR("Failed to copy in bin cl\n"); | ||
562 | goto fail; | 563 | goto fail; |
563 | } | 564 | } |
564 | 565 | ||
565 | ret = copy_from_user(exec->shader_rec_u, | 566 | if (copy_from_user(exec->shader_rec_u, |
566 | (void __user *)(uintptr_t)args->shader_rec, | 567 | (void __user *)(uintptr_t)args->shader_rec, |
567 | args->shader_rec_size); | 568 | args->shader_rec_size)) { |
568 | if (ret) { | 569 | ret = -EFAULT; |
569 | DRM_ERROR("Failed to copy in shader recs\n"); | ||
570 | goto fail; | 570 | goto fail; |
571 | } | 571 | } |
572 | 572 | ||
573 | ret = copy_from_user(exec->uniforms_u, | 573 | if (copy_from_user(exec->uniforms_u, |
574 | (void __user *)(uintptr_t)args->uniforms, | 574 | (void __user *)(uintptr_t)args->uniforms, |
575 | args->uniforms_size); | 575 | args->uniforms_size)) { |
576 | if (ret) { | 576 | ret = -EFAULT; |
577 | DRM_ERROR("Failed to copy in uniforms cl\n"); | ||
578 | goto fail; | 577 | goto fail; |
579 | } | 578 | } |
580 | 579 | ||
581 | bo = vc4_bo_create(dev, exec_size, true); | 580 | bo = vc4_bo_create(dev, exec_size, true); |
582 | if (!bo) { | 581 | if (!bo) { |
583 | DRM_ERROR("Couldn't allocate BO for binning\n"); | 582 | DRM_ERROR("Couldn't allocate BO for binning\n"); |
584 | ret = PTR_ERR(exec->exec_bo); | 583 | ret = -ENOMEM; |
585 | goto fail; | 584 | goto fail; |
586 | } | 585 | } |
587 | exec->exec_bo = &bo->base; | 586 | exec->exec_bo = &bo->base; |