diff options
| author | Christian König <christian.koenig@amd.com> | 2015-06-19 11:31:29 -0400 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2015-06-29 15:52:49 -0400 |
| commit | 2b48d323b26c37555df3447e11ab9e962eccdc26 (patch) | |
| tree | 3a4aa8361cf16fbfeb842158702602848f55b0b6 /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |
| parent | 03507c4f2f63d8d98c2455cf4d192589fac553c7 (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.c | 59 |
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 | ||
| 669 | static 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 | |||
| 666 | int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | 718 | int 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); |
