aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2015-06-19 11:31:29 -0400
committerAlex Deucher <alexander.deucher@amd.com>2015-06-29 15:52:49 -0400
commit2b48d323b26c37555df3447e11ab9e962eccdc26 (patch)
tree3a4aa8361cf16fbfeb842158702602848f55b0b6 /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
parent03507c4f2f63d8d98c2455cf4d192589fac553c7 (diff)
drm/amdgpu: add optional dependencies to the CS IOCTL v2
v2: remove unrelated whitespace change, fix C comment Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c59
1 files changed, 58 insertions, 1 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 84ba1d1bf327..d63135bf29c0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -226,6 +226,9 @@ int amdgpu_cs_parser_init(struct amdgpu_cs_parser *p, void *data)
226 } 226 }
227 break; 227 break;
228 228
229 case AMDGPU_CHUNK_ID_DEPENDENCIES:
230 break;
231
229 default: 232 default:
230 r = -EINVAL; 233 r = -EINVAL;
231 goto out; 234 goto out;
@@ -663,6 +666,55 @@ static int amdgpu_cs_ib_fill(struct amdgpu_device *adev,
663 return 0; 666 return 0;
664} 667}
665 668
669static int amdgpu_cs_dependencies(struct amdgpu_device *adev,
670 struct amdgpu_cs_parser *p)
671{
672 struct amdgpu_ib *ib;
673 int i, j, r;
674
675 if (!p->num_ibs)
676 return 0;
677
678 /* Add dependencies to first IB */
679 ib = &p->ibs[0];
680 for (i = 0; i < p->nchunks; ++i) {
681 struct drm_amdgpu_cs_chunk_dep *deps;
682 struct amdgpu_cs_chunk *chunk;
683 unsigned num_deps;
684
685 chunk = &p->chunks[i];
686
687 if (chunk->chunk_id != AMDGPU_CHUNK_ID_DEPENDENCIES)
688 continue;
689
690 deps = (struct drm_amdgpu_cs_chunk_dep *)chunk->kdata;
691 num_deps = chunk->length_dw * 4 /
692 sizeof(struct drm_amdgpu_cs_chunk_dep);
693
694 for (j = 0; j < num_deps; ++j) {
695 struct amdgpu_fence *fence;
696 struct amdgpu_ring *ring;
697
698 r = amdgpu_cs_get_ring(adev, deps[j].ip_type,
699 deps[j].ip_instance,
700 deps[j].ring, &ring);
701 if (r)
702 return r;
703
704 r = amdgpu_fence_recreate(ring, p->filp,
705 deps[j].handle,
706 &fence);
707 if (r)
708 return r;
709
710 amdgpu_sync_fence(&ib->sync, fence);
711 amdgpu_fence_unref(&fence);
712 }
713 }
714
715 return 0;
716}
717
666int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) 718int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
667{ 719{
668 struct amdgpu_device *adev = dev->dev_private; 720 struct amdgpu_device *adev = dev->dev_private;
@@ -697,11 +749,16 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
697 else 749 else
698 DRM_ERROR("Failed to process the buffer list %d!\n", r); 750 DRM_ERROR("Failed to process the buffer list %d!\n", r);
699 } 751 }
700 } else { 752 }
753
754 if (!r) {
701 reserved_buffers = true; 755 reserved_buffers = true;
702 r = amdgpu_cs_ib_fill(adev, &parser); 756 r = amdgpu_cs_ib_fill(adev, &parser);
703 } 757 }
704 758
759 if (!r)
760 r = amdgpu_cs_dependencies(adev, &parser);
761
705 if (r) { 762 if (r) {
706 amdgpu_cs_parser_fini(&parser, r, reserved_buffers); 763 amdgpu_cs_parser_fini(&parser, r, reserved_buffers);
707 up_read(&adev->exclusive_lock); 764 up_read(&adev->exclusive_lock);