diff options
| author | Nirmoy Das <nirmoy.das@amd.com> | 2021-04-22 16:54:01 +0200 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2021-04-23 17:18:32 -0400 | 
| commit | adf6f5c51ea14121e2302fb1b0ab3a90921ede59 (patch) | |
| tree | 4bbc269b50d74896c75a4aad60968441fcad4889 /drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | |
| parent | 77df5c131d4d3413acf8da259e3cad22426ff90d (diff) | |
drm/amdgpu: create shadow bo using amdgpu_bo_create_shadow()
Shadow BOs are only needed for vm code so call amdgpu_bo_create_shadow()
directly instead of depending on amdgpu_bo_create().
Signed-off-by: Nirmoy Das <nirmoy.das@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 69 | 
1 files changed, 45 insertions, 24 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index 9736aca73733..116b75413a35 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -850,35 +850,60 @@ static int amdgpu_vm_clear_bo(struct amdgpu_device *adev,  }  /** - * amdgpu_vm_bo_param - fill in parameters for PD/PT allocation + * amdgpu_vm_pt_create - create bo for PD/PT   *   * @adev: amdgpu_device pointer   * @vm: requesting vm   * @level: the page table level   * @immediate: use a immediate update - * @bp: resulting BO allocation parameters + * @bo: pointer to the buffer object pointer   */ -static void amdgpu_vm_bo_param(struct amdgpu_device *adev, struct amdgpu_vm *vm, +static int amdgpu_vm_pt_create(struct amdgpu_device *adev, +			       struct amdgpu_vm *vm,  			       int level, bool immediate, -			       struct amdgpu_bo_param *bp) +			       struct amdgpu_bo **bo)  { -	memset(bp, 0, sizeof(*bp)); +	struct amdgpu_bo_param bp; +	int r; -	bp->size = amdgpu_vm_bo_size(adev, level); -	bp->byte_align = AMDGPU_GPU_PAGE_SIZE; -	bp->domain = AMDGPU_GEM_DOMAIN_VRAM; -	bp->domain = amdgpu_bo_get_preferred_pin_domain(adev, bp->domain); -	bp->flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS | +	memset(&bp, 0, sizeof(bp)); + +	bp.size = amdgpu_vm_bo_size(adev, level); +	bp.byte_align = AMDGPU_GPU_PAGE_SIZE; +	bp.domain = AMDGPU_GEM_DOMAIN_VRAM; +	bp.domain = amdgpu_bo_get_preferred_pin_domain(adev, bp.domain); +	bp.flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS |  		AMDGPU_GEM_CREATE_CPU_GTT_USWC; -	bp->bo_ptr_size = sizeof(struct amdgpu_bo); +	bp.bo_ptr_size = sizeof(struct amdgpu_bo);  	if (vm->use_cpu_for_update) -		bp->flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; -	else if (!vm->root.base.bo || vm->root.base.bo->shadow) -		bp->flags |= AMDGPU_GEM_CREATE_SHADOW; -	bp->type = ttm_bo_type_kernel; -	bp->no_wait_gpu = immediate; +		bp.flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; + +	bp.type = ttm_bo_type_kernel; +	bp.no_wait_gpu = immediate;  	if (vm->root.base.bo) -		bp->resv = vm->root.base.bo->tbo.base.resv; +		bp.resv = vm->root.base.bo->tbo.base.resv; + +	r = amdgpu_bo_create(adev, &bp, bo); +	if (r) +		return r; + +	if (vm->is_compute_context && (adev->flags & AMD_IS_APU)) +		return 0; + +	if (!bp.resv) +		WARN_ON(dma_resv_lock((*bo)->tbo.base.resv, +				      NULL)); +	r = amdgpu_bo_create_shadow(adev, bp.size, *bo); + +	if (!bp.resv) +		dma_resv_unlock((*bo)->tbo.base.resv); + +	if (r) { +		amdgpu_bo_unref(bo); +		return r; +	} + +	return 0;  }  /** @@ -901,7 +926,6 @@ static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,  			       bool immediate)  {  	struct amdgpu_vm_pt *entry = cursor->entry; -	struct amdgpu_bo_param bp;  	struct amdgpu_bo *pt;  	int r; @@ -919,9 +943,7 @@ static int amdgpu_vm_alloc_pts(struct amdgpu_device *adev,  	if (entry->base.bo)  		return 0; -	amdgpu_vm_bo_param(adev, vm, cursor->level, immediate, &bp); - -	r = amdgpu_bo_create(adev, &bp, &pt); +	r = amdgpu_vm_pt_create(adev, vm, cursor->level, immediate, &pt);  	if (r)  		return r; @@ -2784,7 +2806,6 @@ long amdgpu_vm_wait_idle(struct amdgpu_vm *vm, long timeout)   */  int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, u32 pasid)  { -	struct amdgpu_bo_param bp;  	struct amdgpu_bo *root;  	int r, i; @@ -2835,8 +2856,8 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, u32 pasid)  	mutex_init(&vm->eviction_lock);  	vm->evicting = false; -	amdgpu_vm_bo_param(adev, vm, adev->vm_manager.root_level, false, &bp); -	r = amdgpu_bo_create(adev, &bp, &root); +	r = amdgpu_vm_pt_create(adev, vm, adev->vm_manager.root_level, +				false, &root);  	if (r)  		goto error_free_delayed; | 
