diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index 53e6a10fe9f9..cef8360698be 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |||
@@ -698,9 +698,9 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev, | |||
698 | sizeof(struct drm_amdgpu_cs_chunk_dep); | 698 | sizeof(struct drm_amdgpu_cs_chunk_dep); |
699 | 699 | ||
700 | for (j = 0; j < num_deps; ++j) { | 700 | for (j = 0; j < num_deps; ++j) { |
701 | struct amdgpu_fence *fence; | ||
702 | struct amdgpu_ring *ring; | 701 | struct amdgpu_ring *ring; |
703 | struct amdgpu_ctx *ctx; | 702 | struct amdgpu_ctx *ctx; |
703 | struct fence *fence; | ||
704 | 704 | ||
705 | r = amdgpu_cs_get_ring(adev, deps[j].ip_type, | 705 | r = amdgpu_cs_get_ring(adev, deps[j].ip_type, |
706 | deps[j].ip_instance, | 706 | deps[j].ip_instance, |
@@ -712,20 +712,20 @@ static int amdgpu_cs_dependencies(struct amdgpu_device *adev, | |||
712 | if (ctx == NULL) | 712 | if (ctx == NULL) |
713 | return -EINVAL; | 713 | return -EINVAL; |
714 | 714 | ||
715 | r = amdgpu_fence_recreate(ring, p->filp, | 715 | fence = amdgpu_ctx_get_fence(ctx, ring, |
716 | deps[j].handle, | 716 | deps[j].handle); |
717 | &fence); | 717 | if (IS_ERR(fence)) { |
718 | if (r) { | 718 | r = PTR_ERR(fence); |
719 | amdgpu_ctx_put(ctx); | 719 | amdgpu_ctx_put(ctx); |
720 | return r; | 720 | return r; |
721 | } | ||
722 | |||
723 | r = amdgpu_sync_fence(adev, &ib->sync, &fence->base); | ||
724 | amdgpu_fence_unref(&fence); | ||
725 | amdgpu_ctx_put(ctx); | ||
726 | 721 | ||
727 | if (r) | 722 | } else if (fence) { |
728 | return r; | 723 | r = amdgpu_sync_fence(adev, &ib->sync, fence); |
724 | fence_put(fence); | ||
725 | amdgpu_ctx_put(ctx); | ||
726 | if (r) | ||
727 | return r; | ||
728 | } | ||
729 | } | 729 | } |
730 | } | 730 | } |
731 | 731 | ||
@@ -773,8 +773,11 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
773 | r = amdgpu_cs_ib_fill(adev, &parser); | 773 | r = amdgpu_cs_ib_fill(adev, &parser); |
774 | } | 774 | } |
775 | 775 | ||
776 | if (!r) | 776 | if (!r) { |
777 | r = amdgpu_cs_dependencies(adev, &parser); | 777 | r = amdgpu_cs_dependencies(adev, &parser); |
778 | if (r) | ||
779 | DRM_ERROR("Failed in the dependencies handling %d!\n", r); | ||
780 | } | ||
778 | 781 | ||
779 | if (r) { | 782 | if (r) { |
780 | amdgpu_cs_parser_fini(&parser, r, reserved_buffers); | 783 | amdgpu_cs_parser_fini(&parser, r, reserved_buffers); |
@@ -791,7 +794,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
791 | goto out; | 794 | goto out; |
792 | } | 795 | } |
793 | 796 | ||
794 | cs->out.handle = parser.ibs[parser.num_ibs - 1].fence->seq; | 797 | cs->out.handle = parser.uf.sequence; |
795 | out: | 798 | out: |
796 | amdgpu_cs_parser_fini(&parser, r, true); | 799 | amdgpu_cs_parser_fini(&parser, r, true); |
797 | up_read(&adev->exclusive_lock); | 800 | up_read(&adev->exclusive_lock); |
@@ -814,30 +817,31 @@ int amdgpu_cs_wait_ioctl(struct drm_device *dev, void *data, | |||
814 | union drm_amdgpu_wait_cs *wait = data; | 817 | union drm_amdgpu_wait_cs *wait = data; |
815 | struct amdgpu_device *adev = dev->dev_private; | 818 | struct amdgpu_device *adev = dev->dev_private; |
816 | unsigned long timeout = amdgpu_gem_timeout(wait->in.timeout); | 819 | unsigned long timeout = amdgpu_gem_timeout(wait->in.timeout); |
817 | struct amdgpu_fence *fence = NULL; | ||
818 | struct amdgpu_ring *ring = NULL; | 820 | struct amdgpu_ring *ring = NULL; |
819 | struct amdgpu_ctx *ctx; | 821 | struct amdgpu_ctx *ctx; |
822 | struct fence *fence; | ||
820 | long r; | 823 | long r; |
821 | 824 | ||
825 | r = amdgpu_cs_get_ring(adev, wait->in.ip_type, wait->in.ip_instance, | ||
826 | wait->in.ring, &ring); | ||
827 | if (r) | ||
828 | return r; | ||
829 | |||
822 | ctx = amdgpu_ctx_get(filp->driver_priv, wait->in.ctx_id); | 830 | ctx = amdgpu_ctx_get(filp->driver_priv, wait->in.ctx_id); |
823 | if (ctx == NULL) | 831 | if (ctx == NULL) |
824 | return -EINVAL; | 832 | return -EINVAL; |
825 | 833 | ||
826 | r = amdgpu_cs_get_ring(adev, wait->in.ip_type, wait->in.ip_instance, | 834 | fence = amdgpu_ctx_get_fence(ctx, ring, wait->in.handle); |
827 | wait->in.ring, &ring); | 835 | if (IS_ERR(fence)) |
828 | if (r) { | 836 | r = PTR_ERR(fence); |
829 | amdgpu_ctx_put(ctx); | ||
830 | return r; | ||
831 | } | ||
832 | 837 | ||
833 | r = amdgpu_fence_recreate(ring, filp, wait->in.handle, &fence); | 838 | else if (fence) { |
834 | if (r) { | 839 | r = fence_wait_timeout(fence, true, timeout); |
835 | amdgpu_ctx_put(ctx); | 840 | fence_put(fence); |
836 | return r; | 841 | |
837 | } | 842 | } else |
843 | r = 1; | ||
838 | 844 | ||
839 | r = fence_wait_timeout(&fence->base, true, timeout); | ||
840 | amdgpu_fence_unref(&fence); | ||
841 | amdgpu_ctx_put(ctx); | 845 | amdgpu_ctx_put(ctx); |
842 | if (r < 0) | 846 | if (r < 0) |
843 | return r; | 847 | return r; |