diff options
author | Christian König <christian.koenig@amd.com> | 2017-10-12 06:16:33 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-10-19 15:27:09 -0400 |
commit | c5795c555bbaca51192ffc6164bb85845ecdf717 (patch) | |
tree | 49cc73367731d629c7ce063dc4d16f1344ad1a82 /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | |
parent | 7fd5e36caec1598c49ef97d3e53cdd89c1da2770 (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.c | 37 |
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) { |