diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index d63135bf29c0..1f040d85ac47 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -669,6 +669,7 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev, | |||
669 | static int amdgpu_cs_dependencies(struct amdgpu_device *adev, | 669 | static int amdgpu_cs_dependencies(struct amdgpu_device *adev, |
670 | struct amdgpu_cs_parser *p) | 670 | struct amdgpu_cs_parser *p) |
671 | { | 671 | { |
672 | struct amdgpu_fpriv *fpriv = p->filp->driver_priv; | ||
672 | struct amdgpu_ib *ib; | 673 | struct amdgpu_ib *ib; |
673 | int i, j, r; | 674 | int i, j, r; |
674 | 675 | ||
@@ -694,6 +695,7 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev, | |||
694 | for (j = 0; j < num_deps; ++j) { | 695 | for (j = 0; j < num_deps; ++j) { |
695 | struct amdgpu_fence *fence; | 696 | struct amdgpu_fence *fence; |
696 | struct amdgpu_ring *ring; | 697 | struct amdgpu_ring *ring; |
698 | struct amdgpu_ctx *ctx; | ||
697 | 699 | ||
698 | r = amdgpu_cs_get_ring(adev, deps[j].ip_type, | 700 | r = amdgpu_cs_get_ring(adev, deps[j].ip_type, |
699 | deps[j].ip_instance, | 701 | deps[j].ip_instance, |
@@ -701,14 +703,21 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev, | |||
701 | if (r) | 703 | if (r) |
702 | return r; | 704 | return r; |
703 | 705 | ||
706 | ctx = amdgpu_ctx_get(fpriv, deps[j].ctx_id); | ||
707 | if (ctx == NULL) | ||
708 | return -EINVAL; | ||
709 | |||
704 | r = amdgpu_fence_recreate(ring, p->filp, | 710 | r = amdgpu_fence_recreate(ring, p->filp, |
705 | deps[j].handle, | 711 | deps[j].handle, |
706 | &fence); | 712 | &fence); |
707 | if (r) | 713 | if (r) { |
714 | amdgpu_ctx_put(ctx); | ||
708 | return r; | 715 | return r; |
716 | } | ||
709 | 717 | ||
710 | amdgpu_sync_fence(&ib->sync, fence); | 718 | amdgpu_sync_fence(&ib->sync, fence); |
711 | amdgpu_fence_unref(&fence); | 719 | amdgpu_fence_unref(&fence); |
720 | amdgpu_ctx_put(ctx); | ||
712 | } | 721 | } |
713 | } | 722 | } |
714 | 723 | ||
@@ -808,12 +817,16 @@ int amdgpu_cs_wait_ioctl(struct drm_device *dev, void *data, | |||
808 | 817 | ||
809 | r = amdgpu_cs_get_ring(adev, wait->in.ip_type, wait->in.ip_instance, | 818 | r = amdgpu_cs_get_ring(adev, wait->in.ip_type, wait->in.ip_instance, |
810 | wait->in.ring, &ring); | 819 | wait->in.ring, &ring); |
811 | if (r) | 820 | if (r) { |
821 | amdgpu_ctx_put(ctx); | ||
812 | return r; | 822 | return r; |
823 | } | ||
813 | 824 | ||
814 | r = amdgpu_fence_recreate(ring, filp, wait->in.handle, &fence); | 825 | r = amdgpu_fence_recreate(ring, filp, wait->in.handle, &fence); |
815 | if (r) | 826 | if (r) { |
827 | amdgpu_ctx_put(ctx); | ||
816 | return r; | 828 | return r; |
829 | } | ||
817 | 830 | ||
818 | r = fence_wait_timeout(&fence->base, true, timeout); | 831 | r = fence_wait_timeout(&fence->base, true, timeout); |
819 | amdgpu_fence_unref(&fence); | 832 | amdgpu_fence_unref(&fence); |