diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c | 78 | 
1 files changed, 34 insertions, 44 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c index 23d054526e7c..720011019741 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c @@ -22,6 +22,8 @@   * * Author: Monk.liu@amd.com   */ +#include <drm/drm_exec.h> +  #include "amdgpu.h"  uint64_t amdgpu_csa_vaddr(struct amdgpu_device *adev) @@ -65,31 +67,25 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,  			  struct amdgpu_bo *bo, struct amdgpu_bo_va **bo_va,  			  uint64_t csa_addr, uint32_t size)  { -	struct ww_acquire_ctx ticket; -	struct list_head list; -	struct amdgpu_bo_list_entry pd; -	struct ttm_validate_buffer csa_tv; +	struct drm_exec exec;  	int r; -	INIT_LIST_HEAD(&list); -	INIT_LIST_HEAD(&csa_tv.head); -	csa_tv.bo = &bo->tbo; -	csa_tv.num_shared = 1; - -	list_add(&csa_tv.head, &list); -	amdgpu_vm_get_pd_bo(vm, &list, &pd); - -	r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL); -	if (r) { -		DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r); -		return r; +	drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT); +	drm_exec_until_all_locked(&exec) { +		r = amdgpu_vm_lock_pd(vm, &exec, 0); +		if (likely(!r)) +			r = drm_exec_lock_obj(&exec, &bo->tbo.base); +		drm_exec_retry_on_contention(&exec); +		if (unlikely(r)) { +			DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r); +			goto error; +		}  	}  	*bo_va = amdgpu_vm_bo_add(adev, vm, bo);  	if (!*bo_va) { -		ttm_eu_backoff_reservation(&ticket, &list); -		DRM_ERROR("failed to create bo_va for static CSA\n"); -		return -ENOMEM; +		r = -ENOMEM; +		goto error;  	}  	r = amdgpu_vm_bo_map(adev, *bo_va, csa_addr, 0, size, @@ -99,48 +95,42 @@ int amdgpu_map_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,  	if (r) {  		DRM_ERROR("failed to do bo_map on static CSA, err=%d\n", r);  		amdgpu_vm_bo_del(adev, *bo_va); -		ttm_eu_backoff_reservation(&ticket, &list); -		return r; +		goto error;  	} -	ttm_eu_backoff_reservation(&ticket, &list); -	return 0; +error: +	drm_exec_fini(&exec); +	return r;  }  int amdgpu_unmap_static_csa(struct amdgpu_device *adev, struct amdgpu_vm *vm,  			    struct amdgpu_bo *bo, struct amdgpu_bo_va *bo_va,  			    uint64_t csa_addr)  { -	struct ww_acquire_ctx ticket; -	struct list_head list; -	struct amdgpu_bo_list_entry pd; -	struct ttm_validate_buffer csa_tv; +	struct drm_exec exec;  	int r; -	INIT_LIST_HEAD(&list); -	INIT_LIST_HEAD(&csa_tv.head); -	csa_tv.bo = &bo->tbo; -	csa_tv.num_shared = 1; - -	list_add(&csa_tv.head, &list); -	amdgpu_vm_get_pd_bo(vm, &list, &pd); - -	r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL); -	if (r) { -		DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r); -		return r; +	drm_exec_init(&exec, DRM_EXEC_INTERRUPTIBLE_WAIT); +	drm_exec_until_all_locked(&exec) { +		r = amdgpu_vm_lock_pd(vm, &exec, 0); +		if (likely(!r)) +			r = drm_exec_lock_obj(&exec, &bo->tbo.base); +		drm_exec_retry_on_contention(&exec); +		if (unlikely(r)) { +			DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r); +			goto error; +		}  	}  	r = amdgpu_vm_bo_unmap(adev, bo_va, csa_addr);  	if (r) {  		DRM_ERROR("failed to do bo_unmap on static CSA, err=%d\n", r); -		ttm_eu_backoff_reservation(&ticket, &list); -		return r; +		goto error;  	}  	amdgpu_vm_bo_del(adev, bo_va); -	ttm_eu_backoff_reservation(&ticket, &list); - -	return 0; +error: +	drm_exec_fini(&exec); +	return r;  } | 
