diff options
| author | Dave Airlie <airlied@redhat.com> | 2021-06-18 12:55:08 +1000 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2021-06-18 12:55:09 +1000 | 
| commit | d472b36efbf8a27dc8a80519db8b5a8caffe42b6 (patch) | |
| tree | 5672afd20a72c589800b819b34f7c391686eda15 /drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | |
| parent | 43ccc7831fc4864b99954914537ec3c819997f41 (diff) | |
| parent | a4b0b97aace09716a635e1a64c7e54e51f4a0f51 (diff) | |
Merge tag 'amd-drm-next-5.14-2021-06-16' of https://gitlab.freedesktop.org/agd5f/linux into drm-next
amd-drm-next-5.14-2021-06-16:
amdgpu:
- Aldebaran fixes
- Expose asic independent throttler status
- BACO fixes for navi1x
- Smartshift fixes
- Misc code cleanups
- RAS fixes for Sienna Cichlid
- Gamma verificaton fixes
- DC LTTPR fixes
- DP AUX timeout handling fixes
- GFX9, 10 powergating fixes
amdkfd:
- TLB flush fixes when using SDMA
- Locking fixes
- SVM fixes
Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210617031719.4013-1-alexander.deucher@amd.com
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_object.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 55 | 
1 files changed, 38 insertions, 17 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c index b7a2070d90af..795fa7445abe 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c @@ -54,29 +54,42 @@  static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo)  { -	struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev);  	struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo); -	struct amdgpu_bo_user *ubo;  	amdgpu_bo_kunmap(bo);  	if (bo->tbo.base.import_attach)  		drm_prime_gem_destroy(&bo->tbo.base, bo->tbo.sg);  	drm_gem_object_release(&bo->tbo.base); +	amdgpu_bo_unref(&bo->parent); +	kvfree(bo); +} + +static void amdgpu_bo_user_destroy(struct ttm_buffer_object *tbo) +{ +	struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo); +	struct amdgpu_bo_user *ubo; + +	ubo = to_amdgpu_bo_user(bo); +	kfree(ubo->metadata); +	amdgpu_bo_destroy(tbo); +} + +static void amdgpu_bo_vm_destroy(struct ttm_buffer_object *tbo) +{ +	struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev); +	struct amdgpu_bo *bo = ttm_to_amdgpu_bo(tbo); +	struct amdgpu_bo_vm *vmbo; + +	vmbo = to_amdgpu_bo_vm(bo);  	/* in case amdgpu_device_recover_vram got NULL of bo->parent */ -	if (!list_empty(&bo->shadow_list)) { +	if (!list_empty(&vmbo->shadow_list)) {  		mutex_lock(&adev->shadow_list_lock); -		list_del_init(&bo->shadow_list); +		list_del_init(&vmbo->shadow_list);  		mutex_unlock(&adev->shadow_list_lock);  	} -	amdgpu_bo_unref(&bo->parent); - -	if (bo->tbo.type != ttm_bo_type_kernel) { -		ubo = to_amdgpu_bo_user(bo); -		kfree(ubo->metadata); -	} -	kvfree(bo); +	amdgpu_bo_destroy(tbo);  }  /** @@ -91,8 +104,11 @@ static void amdgpu_bo_destroy(struct ttm_buffer_object *tbo)   */  bool amdgpu_bo_is_amdgpu_bo(struct ttm_buffer_object *bo)  { -	if (bo->destroy == &amdgpu_bo_destroy) +	if (bo->destroy == &amdgpu_bo_destroy || +	    bo->destroy == &amdgpu_bo_user_destroy || +	    bo->destroy == &amdgpu_bo_vm_destroy)  		return true; +  	return false;  } @@ -545,7 +561,6 @@ int amdgpu_bo_create(struct amdgpu_device *adev,  	if (bo == NULL)  		return -ENOMEM;  	drm_gem_private_object_init(adev_to_drm(adev), &bo->tbo.base, size); -	INIT_LIST_HEAD(&bo->shadow_list);  	bo->vm_bo = NULL;  	bo->preferred_domains = bp->preferred_domain ? bp->preferred_domain :  		bp->domain; @@ -568,9 +583,12 @@ int amdgpu_bo_create(struct amdgpu_device *adev,  	if (bp->type == ttm_bo_type_kernel)  		bo->tbo.priority = 1; +	if (!bp->destroy) +		bp->destroy = &amdgpu_bo_destroy; +  	r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, bp->type,  				 &bo->placement, page_align, &ctx,  NULL, -				 bp->resv, &amdgpu_bo_destroy); +				 bp->resv, bp->destroy);  	if (unlikely(r != 0))  		return r; @@ -634,6 +652,7 @@ int amdgpu_bo_create_user(struct amdgpu_device *adev,  	int r;  	bp->bo_ptr_size = sizeof(struct amdgpu_bo_user); +	bp->destroy = &amdgpu_bo_user_destroy;  	r = amdgpu_bo_create(adev, bp, &bo_ptr);  	if (r)  		return r; @@ -665,11 +684,13 @@ int amdgpu_bo_create_vm(struct amdgpu_device *adev,  	 * num of amdgpu_vm_pt entries.  	 */  	BUG_ON(bp->bo_ptr_size < sizeof(struct amdgpu_bo_vm)); +	bp->destroy = &amdgpu_bo_vm_destroy;  	r = amdgpu_bo_create(adev, bp, &bo_ptr);  	if (r)  		return r;  	*vmbo_ptr = to_amdgpu_bo_vm(bo_ptr); +	INIT_LIST_HEAD(&(*vmbo_ptr)->shadow_list);  	return r;  } @@ -714,12 +735,12 @@ retry:   *   * Insert a BO to the shadow list.   */ -void amdgpu_bo_add_to_shadow_list(struct amdgpu_bo *bo) +void amdgpu_bo_add_to_shadow_list(struct amdgpu_bo_vm *vmbo)  { -	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); +	struct amdgpu_device *adev = amdgpu_ttm_adev(vmbo->bo.tbo.bdev);  	mutex_lock(&adev->shadow_list_lock); -	list_add_tail(&bo->shadow_list, &adev->shadow_list); +	list_add_tail(&vmbo->shadow_list, &adev->shadow_list);  	mutex_unlock(&adev->shadow_list_lock);  }  | 
