aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2017-10-12 06:16:33 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-10-19 15:27:09 -0400
commitc5795c555bbaca51192ffc6164bb85845ecdf717 (patch)
tree49cc73367731d629c7ce063dc4d16f1344ad1a82 /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
parent7fd5e36caec1598c49ef97d3e53cdd89c1da2770 (diff)
drm/amdgpu: minor CS optimization
We only need to loop over all IBs for old UVD/VCE command stream patching. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-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.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index dfd37785563f..52dd78ee8fd0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -853,36 +853,37 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev,
853 struct amdgpu_fpriv *fpriv = p->filp->driver_priv; 853 struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
854 struct amdgpu_vm *vm = &fpriv->vm; 854 struct amdgpu_vm *vm = &fpriv->vm;
855 struct amdgpu_ring *ring = p->job->ring; 855 struct amdgpu_ring *ring = p->job->ring;
856 int i, j, r; 856 int r;
857
858 for (i = 0, j = 0; i < p->nchunks && j < p->job->num_ibs; i++) {
859
860 struct amdgpu_cs_chunk *chunk;
861 struct amdgpu_ib *ib;
862 struct drm_amdgpu_cs_chunk_ib *chunk_ib;
863
864 chunk = &p->chunks[i];
865 ib = &p->job->ibs[j];
866 chunk_ib = (struct drm_amdgpu_cs_chunk_ib *)chunk->kdata;
867 857
868 if (chunk->chunk_id != AMDGPU_CHUNK_ID_IB) 858 /* Only for UVD/VCE VM emulation */
869 continue; 859 if (p->job->ring->funcs->parse_cs) {
860 unsigned i, j;
870 861
871 if (p->job->ring->funcs->parse_cs) { 862 for (i = 0, j = 0; i < p->nchunks && j < p->job->num_ibs; i++) {
863 struct drm_amdgpu_cs_chunk_ib *chunk_ib;
872 struct amdgpu_bo_va_mapping *m; 864 struct amdgpu_bo_va_mapping *m;
873 struct amdgpu_bo *aobj = NULL; 865 struct amdgpu_bo *aobj = NULL;
866 struct amdgpu_cs_chunk *chunk;
867 struct amdgpu_ib *ib;
874 uint64_t offset; 868 uint64_t offset;
875 uint8_t *kptr; 869 uint8_t *kptr;
876 870
871 chunk = &p->chunks[i];
872 ib = &p->job->ibs[j];
873 chunk_ib = chunk->kdata;
874
875 if (chunk->chunk_id != AMDGPU_CHUNK_ID_IB)
876 continue;
877
877 r = amdgpu_cs_find_mapping(p, chunk_ib->va_start, 878 r = amdgpu_cs_find_mapping(p, chunk_ib->va_start,
878 &aobj, &m); 879 &aobj, &m);
879 if (r) { 880 if (r) {
880 DRM_ERROR("IB va_start is invalid\n"); 881 DRM_ERROR("IB va_start is invalid\n");
881 return r; 882 return r;
882 } 883 }
883 884
884 if ((chunk_ib->va_start + chunk_ib->ib_bytes) > 885 if ((chunk_ib->va_start + chunk_ib->ib_bytes) >
885 (m->last + 1) * AMDGPU_GPU_PAGE_SIZE) { 886 (m->last + 1) * AMDGPU_GPU_PAGE_SIZE) {
886 DRM_ERROR("IB va_start+ib_bytes is invalid\n"); 887 DRM_ERROR("IB va_start+ib_bytes is invalid\n");
887 return -EINVAL; 888 return -EINVAL;
888 } 889 }
@@ -899,12 +900,12 @@ static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev,
899 memcpy(ib->ptr, kptr, chunk_ib->ib_bytes); 900 memcpy(ib->ptr, kptr, chunk_ib->ib_bytes);
900 amdgpu_bo_kunmap(aobj); 901 amdgpu_bo_kunmap(aobj);
901 902
902 /* Only for UVD/VCE VM emulation */
903 r = amdgpu_ring_parse_cs(ring, p, j); 903 r = amdgpu_ring_parse_cs(ring, p, j);
904 if (r) 904 if (r)
905 return r; 905 return r;
906
907 j++;
906 } 908 }
907 j++;
908 } 909 }
909 910
910 if (p->job->vm) { 911 if (p->job->vm) {