[PATCH 03/11] drm/amdgpu: cleanup VM handling in the CS a bit
Alex Deucher
alexdeucher at gmail.com
Wed Aug 22 19:49:08 UTC 2018
On Wed, Aug 22, 2018 at 11:05 AM Christian König
<ckoenig.leichtzumerken at gmail.com> wrote:
>
> Add a helper function for getting the root PD addr and cleanup join the
> two VM related functions and cleanup the function name.
>
> No functional change.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 160 ++++++++++++-------------
> 1 file changed, 74 insertions(+), 86 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> index d42d1c8f78f6..17bf63f93c93 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
> @@ -804,8 +804,9 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error,
> amdgpu_bo_unref(&parser->uf_entry.robj);
> }
>
> -static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
> +static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p)
> {
> + struct amdgpu_ring *ring = to_amdgpu_ring(p->entity->rq->sched);
> struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
> struct amdgpu_device *adev = p->adev;
> struct amdgpu_vm *vm = &fpriv->vm;
> @@ -814,6 +815,71 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
> struct amdgpu_bo *bo;
> int r;
>
> + /* Only for UVD/VCE VM emulation */
> + if (ring->funcs->parse_cs || ring->funcs->patch_cs_in_place) {
> + unsigned i, j;
> +
> + for (i = 0, j = 0; i < p->nchunks && j < p->job->num_ibs; i++) {
> + struct drm_amdgpu_cs_chunk_ib *chunk_ib;
> + struct amdgpu_bo_va_mapping *m;
> + struct amdgpu_bo *aobj = NULL;
> + struct amdgpu_cs_chunk *chunk;
> + uint64_t offset, va_start;
> + struct amdgpu_ib *ib;
> + uint8_t *kptr;
> +
> + chunk = &p->chunks[i];
> + ib = &p->job->ibs[j];
> + chunk_ib = chunk->kdata;
> +
> + if (chunk->chunk_id != AMDGPU_CHUNK_ID_IB)
> + continue;
> +
> + va_start = chunk_ib->va_start & AMDGPU_VA_HOLE_MASK;
> + r = amdgpu_cs_find_mapping(p, va_start, &aobj, &m);
> + if (r) {
> + DRM_ERROR("IB va_start is invalid\n");
> + return r;
> + }
> +
> + if ((va_start + chunk_ib->ib_bytes) >
> + (m->last + 1) * AMDGPU_GPU_PAGE_SIZE) {
> + DRM_ERROR("IB va_start+ib_bytes is invalid\n");
> + return -EINVAL;
> + }
> +
> + /* the IB should be reserved at this point */
> + r = amdgpu_bo_kmap(aobj, (void **)&kptr);
> + if (r) {
> + return r;
> + }
> +
> + offset = m->start * AMDGPU_GPU_PAGE_SIZE;
> + kptr += va_start - offset;
> +
> + if (ring->funcs->parse_cs) {
> + memcpy(ib->ptr, kptr, chunk_ib->ib_bytes);
> + amdgpu_bo_kunmap(aobj);
> +
> + r = amdgpu_ring_parse_cs(ring, p, j);
> + if (r)
> + return r;
> + } else {
> + ib->ptr = (uint32_t *)kptr;
> + r = amdgpu_ring_patch_cs_in_place(ring, p, j);
> + amdgpu_bo_kunmap(aobj);
> + if (r)
> + return r;
> + }
> +
> + j++;
> + }
> + }
> +
> + if (!p->job->vm)
> + return amdgpu_cs_sync_rings(p);
> +
> +
> r = amdgpu_vm_clear_freed(adev, vm, NULL);
> if (r)
> return r;
> @@ -876,6 +942,12 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
> if (r)
> return r;
>
> + r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv);
> + if (r)
> + return r;
> +
> + p->job->vm_pd_addr = amdgpu_bo_gpu_offset(vm->root.base.bo);
> +
> if (amdgpu_vm_debug) {
> /* Invalidate all BOs to test for userspace bugs */
> amdgpu_bo_list_for_each_entry(e, p->bo_list) {
> @@ -887,90 +959,6 @@ static int amdgpu_bo_vm_update_pte(struct amdgpu_cs_parser *p)
> }
> }
>
> - return r;
> -}
> -
> -static int amdgpu_cs_ib_vm_chunk(struct amdgpu_device *adev,
> - struct amdgpu_cs_parser *p)
> -{
> - struct amdgpu_ring *ring = to_amdgpu_ring(p->entity->rq->sched);
> - struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
> - struct amdgpu_vm *vm = &fpriv->vm;
> - int r;
> -
> - /* Only for UVD/VCE VM emulation */
> - if (ring->funcs->parse_cs || ring->funcs->patch_cs_in_place) {
> - unsigned i, j;
> -
> - for (i = 0, j = 0; i < p->nchunks && j < p->job->num_ibs; i++) {
> - struct drm_amdgpu_cs_chunk_ib *chunk_ib;
> - struct amdgpu_bo_va_mapping *m;
> - struct amdgpu_bo *aobj = NULL;
> - struct amdgpu_cs_chunk *chunk;
> - uint64_t offset, va_start;
> - struct amdgpu_ib *ib;
> - uint8_t *kptr;
> -
> - chunk = &p->chunks[i];
> - ib = &p->job->ibs[j];
> - chunk_ib = chunk->kdata;
> -
> - if (chunk->chunk_id != AMDGPU_CHUNK_ID_IB)
> - continue;
> -
> - va_start = chunk_ib->va_start & AMDGPU_VA_HOLE_MASK;
> - r = amdgpu_cs_find_mapping(p, va_start, &aobj, &m);
> - if (r) {
> - DRM_ERROR("IB va_start is invalid\n");
> - return r;
> - }
> -
> - if ((va_start + chunk_ib->ib_bytes) >
> - (m->last + 1) * AMDGPU_GPU_PAGE_SIZE) {
> - DRM_ERROR("IB va_start+ib_bytes is invalid\n");
> - return -EINVAL;
> - }
> -
> - /* the IB should be reserved at this point */
> - r = amdgpu_bo_kmap(aobj, (void **)&kptr);
> - if (r) {
> - return r;
> - }
> -
> - offset = m->start * AMDGPU_GPU_PAGE_SIZE;
> - kptr += va_start - offset;
> -
> - if (ring->funcs->parse_cs) {
> - memcpy(ib->ptr, kptr, chunk_ib->ib_bytes);
> - amdgpu_bo_kunmap(aobj);
> -
> - r = amdgpu_ring_parse_cs(ring, p, j);
> - if (r)
> - return r;
> - } else {
> - ib->ptr = (uint32_t *)kptr;
> - r = amdgpu_ring_patch_cs_in_place(ring, p, j);
> - amdgpu_bo_kunmap(aobj);
> - if (r)
> - return r;
> - }
> -
> - j++;
> - }
> - }
> -
> - if (p->job->vm) {
> - p->job->vm_pd_addr = amdgpu_bo_gpu_offset(vm->root.base.bo);
> -
> - r = amdgpu_bo_vm_update_pte(p);
> - if (r)
> - return r;
> -
> - r = reservation_object_reserve_shared(vm->root.base.bo->tbo.resv);
> - if (r)
> - return r;
> - }
> -
> return amdgpu_cs_sync_rings(p);
> }
>
> @@ -1307,7 +1295,7 @@ int amdgpu_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
> for (i = 0; i < parser.job->num_ibs; i++)
> trace_amdgpu_cs(&parser, i);
>
> - r = amdgpu_cs_ib_vm_chunk(adev, &parser);
> + r = amdgpu_cs_vm_handling(&parser);
> if (r)
> goto out;
>
> --
> 2.17.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list