[PATCH 03/11] drm/amdgpu: cleanup VM handling in the CS a bit

Huang Rui ray.huang at amd.com
Thu Aug 23 07:54:11 UTC 2018


On Wed, Aug 22, 2018 at 05:05:09PM +0200, Christian König 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: Huang Rui <ray.huang 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