diff mbox

[v2,7/8] drm/radeon: export reservation_object from dmabuf to ttm

Message ID 541ACC0C.5090501@canonical.com (mailing list archive)
State New, archived
Headers show

Commit Message

Maarten Lankhorst Sept. 18, 2014, 12:11 p.m. UTC
drm/radeon: export reservation_object from dmabuf to ttm

Adds an extra argument to radeon_bo_create, which is only used in radeon_prime.c.

Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>
---
v2:
robj -> resv
fix typo in commit description

Comments

Christian König Sept. 18, 2014, 1:13 p.m. UTC | #1
Am 18.09.2014 um 14:11 schrieb Maarten Lankhorst:
> drm/radeon: export reservation_object from dmabuf to ttm
>
> Adds an extra argument to radeon_bo_create, which is only used in radeon_prime.c.
>
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst@canonical.com>

Reviewed-by: Christian König <christian.koenig@amd.com>

> ---
> v2:
> robj -> resv
> fix typo in commit description
>
> diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
> index 1440b6e9281e..1f8484284b47 100644
> --- a/drivers/gpu/drm/radeon/cik.c
> +++ b/drivers/gpu/drm/radeon/cik.c
> @@ -4690,7 +4690,7 @@ static int cik_mec_init(struct radeon_device *rdev)
>   		r = radeon_bo_create(rdev,
>   				     rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,
>   				     PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
> +				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
>   				     &rdev->mec.hpd_eop_obj);
>   		if (r) {
>   			dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r);
> @@ -4861,7 +4861,7 @@ static int cik_cp_compute_resume(struct radeon_device *rdev)
>   					     sizeof(struct bonaire_mqd),
>   					     PAGE_SIZE, true,
>   					     RADEON_GEM_DOMAIN_GTT, 0, NULL,
> -					     &rdev->ring[idx].mqd_obj);
> +					     NULL, &rdev->ring[idx].mqd_obj);
>   			if (r) {
>   				dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);
>   				return r;
> diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
> index dbca60c7d097..c6ccef6c3596 100644
> --- a/drivers/gpu/drm/radeon/evergreen.c
> +++ b/drivers/gpu/drm/radeon/evergreen.c
> @@ -4023,7 +4023,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
>   		if (rdev->rlc.save_restore_obj == NULL) {
>   			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
>   					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> -					     &rdev->rlc.save_restore_obj);
> +					     NULL, &rdev->rlc.save_restore_obj);
>   			if (r) {
>   				dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
>   				return r;
> @@ -4102,7 +4102,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
>   		if (rdev->rlc.clear_state_obj == NULL) {
>   			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
>   					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> -					     &rdev->rlc.clear_state_obj);
> +					     NULL, &rdev->rlc.clear_state_obj);
>   			if (r) {
>   				dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
>   				sumo_rlc_fini(rdev);
> @@ -4179,7 +4179,7 @@ int sumo_rlc_init(struct radeon_device *rdev)
>   			r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,
>   					     PAGE_SIZE, true,
>   					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> -					     &rdev->rlc.cp_table_obj);
> +					     NULL, &rdev->rlc.cp_table_obj);
>   			if (r) {
>   				dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
>   				sumo_rlc_fini(rdev);
> diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
> index 35c22ee9bc4a..a82eaa81cd07 100644
> --- a/drivers/gpu/drm/radeon/r600.c
> +++ b/drivers/gpu/drm/radeon/r600.c
> @@ -1430,7 +1430,7 @@ int r600_vram_scratch_init(struct radeon_device *rdev)
>   	if (rdev->vram_scratch.robj == NULL) {
>   		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE,
>   				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
> -				     0, NULL, &rdev->vram_scratch.robj);
> +				     0, NULL, NULL, &rdev->vram_scratch.robj);
>   		if (r) {
>   			return r;
>   		}
> @@ -3368,7 +3368,7 @@ int r600_ih_ring_alloc(struct radeon_device *rdev)
>   		r = radeon_bo_create(rdev, rdev->ih.ring_size,
>   				     PAGE_SIZE, true,
>   				     RADEON_GEM_DOMAIN_GTT, 0,
> -				     NULL, &rdev->ih.ring_obj);
> +				     NULL, NULL, &rdev->ih.ring_obj);
>   		if (r) {
>   			DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r);
>   			return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c
> index 1e8855060fc7..9e7f23dd14bd 100644
> --- a/drivers/gpu/drm/radeon/radeon_benchmark.c
> +++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
> @@ -93,7 +93,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
>   	int time;
>   
>   	n = RADEON_BENCHMARK_ITERATIONS;
> -	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, &sobj);
> +	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, NULL, &sobj);
>   	if (r) {
>   		goto out_cleanup;
>   	}
> @@ -105,7 +105,7 @@ static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
>   	if (r) {
>   		goto out_cleanup;
>   	}
> -	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, &dobj);
> +	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, NULL, &dobj);
>   	if (r) {
>   		goto out_cleanup;
>   	}
> diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
> index e84a76e6656a..6fbab1582112 100644
> --- a/drivers/gpu/drm/radeon/radeon_device.c
> +++ b/drivers/gpu/drm/radeon/radeon_device.c
> @@ -430,7 +430,7 @@ int radeon_wb_init(struct radeon_device *rdev)
>   
>   	if (rdev->wb.wb_obj == NULL) {
>   		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
> +				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
>   				     &rdev->wb.wb_obj);
>   		if (r) {
>   			dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
> diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
> index a053a0779aac..84146d5901aa 100644
> --- a/drivers/gpu/drm/radeon/radeon_gart.c
> +++ b/drivers/gpu/drm/radeon/radeon_gart.c
> @@ -128,7 +128,7 @@ int radeon_gart_table_vram_alloc(struct radeon_device *rdev)
>   	if (rdev->gart.robj == NULL) {
>   		r = radeon_bo_create(rdev, rdev->gart.table_size,
>   				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
> -				     0, NULL, &rdev->gart.robj);
> +				     0, NULL, NULL, &rdev->gart.robj);
>   		if (r) {
>   			return r;
>   		}
> diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
> index 4b7c8ec36c2f..c194497aa586 100644
> --- a/drivers/gpu/drm/radeon/radeon_gem.c
> +++ b/drivers/gpu/drm/radeon/radeon_gem.c
> @@ -67,7 +67,7 @@ int radeon_gem_object_create(struct radeon_device *rdev, unsigned long size,
>   
>   retry:
>   	r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain,
> -			     flags, NULL, &robj);
> +			     flags, NULL, NULL, &robj);
>   	if (r) {
>   		if (r != -ERESTARTSYS) {
>   			if (initial_domain == RADEON_GEM_DOMAIN_VRAM) {
> diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
> index 0e82f0223fd4..99a960a4f302 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.c
> +++ b/drivers/gpu/drm/radeon/radeon_object.c
> @@ -167,8 +167,10 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
>   }
>   
>   int radeon_bo_create(struct radeon_device *rdev,
> -		     unsigned long size, int byte_align, bool kernel, u32 domain,
> -		     u32 flags, struct sg_table *sg, struct radeon_bo **bo_ptr)
> +		     unsigned long size, int byte_align, bool kernel,
> +		     u32 domain, u32 flags, struct sg_table *sg,
> +		     struct reservation_object *resv,
> +		     struct radeon_bo **bo_ptr)
>   {
>   	struct radeon_bo *bo;
>   	enum ttm_bo_type type;
> @@ -216,7 +218,7 @@ int radeon_bo_create(struct radeon_device *rdev,
>   	down_read(&rdev->pm.mclk_lock);
>   	r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
>   			&bo->placement, page_align, !kernel, NULL,
> -			acc_size, sg, NULL, &radeon_ttm_bo_destroy);
> +			acc_size, sg, resv, &radeon_ttm_bo_destroy);
>   	up_read(&rdev->pm.mclk_lock);
>   	if (unlikely(r != 0)) {
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
> index 98a47fdf3625..1b8ec7917154 100644
> --- a/drivers/gpu/drm/radeon/radeon_object.h
> +++ b/drivers/gpu/drm/radeon/radeon_object.h
> @@ -126,6 +126,7 @@ extern int radeon_bo_create(struct radeon_device *rdev,
>   			    unsigned long size, int byte_align,
>   			    bool kernel, u32 domain, u32 flags,
>   			    struct sg_table *sg,
> +			    struct reservation_object *resv,
>   			    struct radeon_bo **bo_ptr);
>   extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr);
>   extern void radeon_bo_kunmap(struct radeon_bo *bo);
> diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c
> index 171daf7fc483..f3609c97496b 100644
> --- a/drivers/gpu/drm/radeon/radeon_prime.c
> +++ b/drivers/gpu/drm/radeon/radeon_prime.c
> @@ -61,12 +61,15 @@ struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
>   							struct dma_buf_attachment *attach,
>   							struct sg_table *sg)
>   {
> +	struct reservation_object *resv = attach->dmabuf->resv;
>   	struct radeon_device *rdev = dev->dev_private;
>   	struct radeon_bo *bo;
>   	int ret;
>   
> +	ww_mutex_lock(&resv->lock, NULL);
>   	ret = radeon_bo_create(rdev, attach->dmabuf->size, PAGE_SIZE, false,
> -			       RADEON_GEM_DOMAIN_GTT, 0, sg, &bo);
> +			       RADEON_GEM_DOMAIN_GTT, 0, sg, resv, &bo);
> +	ww_mutex_unlock(&resv->lock);
>   	if (ret)
>   		return ERR_PTR(ret);
>   
> diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
> index 6f2a9bd6bb54..3d17af34afa7 100644
> --- a/drivers/gpu/drm/radeon/radeon_ring.c
> +++ b/drivers/gpu/drm/radeon/radeon_ring.c
> @@ -383,7 +383,7 @@ int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsig
>   	/* Allocate ring buffer */
>   	if (ring->ring_obj == NULL) {
>   		r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_GTT, 0,
> +				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
>   				     NULL, &ring->ring_obj);
>   		if (r) {
>   			dev_err(rdev->dev, "(%d) ring create failed\n", r);
> diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c
> index b84f97c8718c..c507896aca45 100644
> --- a/drivers/gpu/drm/radeon/radeon_sa.c
> +++ b/drivers/gpu/drm/radeon/radeon_sa.c
> @@ -65,7 +65,7 @@ int radeon_sa_bo_manager_init(struct radeon_device *rdev,
>   	}
>   
>   	r = radeon_bo_create(rdev, size, align, true,
> -			     domain, flags, NULL, &sa_manager->bo);
> +			     domain, flags, NULL, NULL, &sa_manager->bo);
>   	if (r) {
>   		dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r);
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c
> index ce943e1a5e51..07b506b41008 100644
> --- a/drivers/gpu/drm/radeon/radeon_test.c
> +++ b/drivers/gpu/drm/radeon/radeon_test.c
> @@ -67,7 +67,7 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
>   	}
>   
>   	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
> -			     0, NULL, &vram_obj);
> +			     0, NULL, NULL, &vram_obj);
>   	if (r) {
>   		DRM_ERROR("Failed to create VRAM object\n");
>   		goto out_cleanup;
> @@ -87,7 +87,8 @@ static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
>   		struct radeon_fence *fence = NULL;
>   
>   		r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_GTT, 0, NULL, gtt_obj + i);
> +				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
> +				     gtt_obj + i);
>   		if (r) {
>   			DRM_ERROR("Failed to create GTT object %d\n", i);
>   			goto out_lclean;
> diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
> index eca2ce60d440..747307ec46da 100644
> --- a/drivers/gpu/drm/radeon/radeon_ttm.c
> +++ b/drivers/gpu/drm/radeon/radeon_ttm.c
> @@ -858,7 +858,7 @@ int radeon_ttm_init(struct radeon_device *rdev)
>   	radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
>   
>   	r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true,
> -			     RADEON_GEM_DOMAIN_VRAM, 0,
> +			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
>   			     NULL, &rdev->stollen_vga_memory);
>   	if (r) {
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
> index ba4f38916026..11b662469253 100644
> --- a/drivers/gpu/drm/radeon/radeon_uvd.c
> +++ b/drivers/gpu/drm/radeon/radeon_uvd.c
> @@ -141,7 +141,8 @@ int radeon_uvd_init(struct radeon_device *rdev)
>   		  RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE +
>   		  RADEON_GPU_PAGE_SIZE;
>   	r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true,
> -			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->uvd.vcpu_bo);
> +			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> +			     NULL, &rdev->uvd.vcpu_bo);
>   	if (r) {
>   		dev_err(rdev->dev, "(%d) failed to allocate UVD bo\n", r);
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_vce.c b/drivers/gpu/drm/radeon/radeon_vce.c
> index c7190aadbd89..9e85757d5599 100644
> --- a/drivers/gpu/drm/radeon/radeon_vce.c
> +++ b/drivers/gpu/drm/radeon/radeon_vce.c
> @@ -126,7 +126,8 @@ int radeon_vce_init(struct radeon_device *rdev)
>   	size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size) +
>   	       RADEON_VCE_STACK_SIZE + RADEON_VCE_HEAP_SIZE;
>   	r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
> -			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->vce.vcpu_bo);
> +			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, NULL,
> +			     &rdev->vce.vcpu_bo);
>   	if (r) {
>   		dev_err(rdev->dev, "(%d) failed to allocate VCE bo\n", r);
>   		return r;
> diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
> index f6e76c18d7eb..683062576a8d 100644
> --- a/drivers/gpu/drm/radeon/radeon_vm.c
> +++ b/drivers/gpu/drm/radeon/radeon_vm.c
> @@ -548,7 +548,8 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
>   
>   		r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,
>   				     RADEON_GPU_PAGE_SIZE, true,
> -				     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &pt);
> +				     RADEON_GEM_DOMAIN_VRAM, 0,
> +				     NULL, NULL, &pt);
>   		if (r)
>   			return r;
>   
> @@ -1127,7 +1128,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
>   
>   	r = radeon_bo_create(rdev, pd_size, align, true,
>   			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
> -			     &vm->page_directory);
> +			     NULL, &vm->page_directory);
>   	if (r)
>   		return r;
>   
>
diff mbox

Patch

diff --git a/drivers/gpu/drm/radeon/cik.c b/drivers/gpu/drm/radeon/cik.c
index 1440b6e9281e..1f8484284b47 100644
--- a/drivers/gpu/drm/radeon/cik.c
+++ b/drivers/gpu/drm/radeon/cik.c
@@ -4690,7 +4690,7 @@  static int cik_mec_init(struct radeon_device *rdev)
 		r = radeon_bo_create(rdev,
 				     rdev->mec.num_mec *rdev->mec.num_pipe * MEC_HPD_SIZE * 2,
 				     PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
+				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
 				     &rdev->mec.hpd_eop_obj);
 		if (r) {
 			dev_warn(rdev->dev, "(%d) create HDP EOP bo failed\n", r);
@@ -4861,7 +4861,7 @@  static int cik_cp_compute_resume(struct radeon_device *rdev)
 					     sizeof(struct bonaire_mqd),
 					     PAGE_SIZE, true,
 					     RADEON_GEM_DOMAIN_GTT, 0, NULL,
-					     &rdev->ring[idx].mqd_obj);
+					     NULL, &rdev->ring[idx].mqd_obj);
 			if (r) {
 				dev_warn(rdev->dev, "(%d) create MQD bo failed\n", r);
 				return r;
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index dbca60c7d097..c6ccef6c3596 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -4023,7 +4023,7 @@  int sumo_rlc_init(struct radeon_device *rdev)
 		if (rdev->rlc.save_restore_obj == NULL) {
 			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
 					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-					     &rdev->rlc.save_restore_obj);
+					     NULL, &rdev->rlc.save_restore_obj);
 			if (r) {
 				dev_warn(rdev->dev, "(%d) create RLC sr bo failed\n", r);
 				return r;
@@ -4102,7 +4102,7 @@  int sumo_rlc_init(struct radeon_device *rdev)
 		if (rdev->rlc.clear_state_obj == NULL) {
 			r = radeon_bo_create(rdev, dws * 4, PAGE_SIZE, true,
 					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-					     &rdev->rlc.clear_state_obj);
+					     NULL, &rdev->rlc.clear_state_obj);
 			if (r) {
 				dev_warn(rdev->dev, "(%d) create RLC c bo failed\n", r);
 				sumo_rlc_fini(rdev);
@@ -4179,7 +4179,7 @@  int sumo_rlc_init(struct radeon_device *rdev)
 			r = radeon_bo_create(rdev, rdev->rlc.cp_table_size,
 					     PAGE_SIZE, true,
 					     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-					     &rdev->rlc.cp_table_obj);
+					     NULL, &rdev->rlc.cp_table_obj);
 			if (r) {
 				dev_warn(rdev->dev, "(%d) create RLC cp table bo failed\n", r);
 				sumo_rlc_fini(rdev);
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 35c22ee9bc4a..a82eaa81cd07 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -1430,7 +1430,7 @@  int r600_vram_scratch_init(struct radeon_device *rdev)
 	if (rdev->vram_scratch.robj == NULL) {
 		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE,
 				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-				     0, NULL, &rdev->vram_scratch.robj);
+				     0, NULL, NULL, &rdev->vram_scratch.robj);
 		if (r) {
 			return r;
 		}
@@ -3368,7 +3368,7 @@  int r600_ih_ring_alloc(struct radeon_device *rdev)
 		r = radeon_bo_create(rdev, rdev->ih.ring_size,
 				     PAGE_SIZE, true,
 				     RADEON_GEM_DOMAIN_GTT, 0,
-				     NULL, &rdev->ih.ring_obj);
+				     NULL, NULL, &rdev->ih.ring_obj);
 		if (r) {
 			DRM_ERROR("radeon: failed to create ih ring buffer (%d).\n", r);
 			return r;
diff --git a/drivers/gpu/drm/radeon/radeon_benchmark.c b/drivers/gpu/drm/radeon/radeon_benchmark.c
index 1e8855060fc7..9e7f23dd14bd 100644
--- a/drivers/gpu/drm/radeon/radeon_benchmark.c
+++ b/drivers/gpu/drm/radeon/radeon_benchmark.c
@@ -93,7 +93,7 @@  static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
 	int time;
 
 	n = RADEON_BENCHMARK_ITERATIONS;
-	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, &sobj);
+	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, sdomain, 0, NULL, NULL, &sobj);
 	if (r) {
 		goto out_cleanup;
 	}
@@ -105,7 +105,7 @@  static void radeon_benchmark_move(struct radeon_device *rdev, unsigned size,
 	if (r) {
 		goto out_cleanup;
 	}
-	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, &dobj);
+	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, ddomain, 0, NULL, NULL, &dobj);
 	if (r) {
 		goto out_cleanup;
 	}
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index e84a76e6656a..6fbab1582112 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -430,7 +430,7 @@  int radeon_wb_init(struct radeon_device *rdev)
 
 	if (rdev->wb.wb_obj == NULL) {
 		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
+				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
 				     &rdev->wb.wb_obj);
 		if (r) {
 			dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
index a053a0779aac..84146d5901aa 100644
--- a/drivers/gpu/drm/radeon/radeon_gart.c
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
@@ -128,7 +128,7 @@  int radeon_gart_table_vram_alloc(struct radeon_device *rdev)
 	if (rdev->gart.robj == NULL) {
 		r = radeon_bo_create(rdev, rdev->gart.table_size,
 				     PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-				     0, NULL, &rdev->gart.robj);
+				     0, NULL, NULL, &rdev->gart.robj);
 		if (r) {
 			return r;
 		}
diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
index 4b7c8ec36c2f..c194497aa586 100644
--- a/drivers/gpu/drm/radeon/radeon_gem.c
+++ b/drivers/gpu/drm/radeon/radeon_gem.c
@@ -67,7 +67,7 @@  int radeon_gem_object_create(struct radeon_device *rdev, unsigned long size,
 
 retry:
 	r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain,
-			     flags, NULL, &robj);
+			     flags, NULL, NULL, &robj);
 	if (r) {
 		if (r != -ERESTARTSYS) {
 			if (initial_domain == RADEON_GEM_DOMAIN_VRAM) {
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index 0e82f0223fd4..99a960a4f302 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -167,8 +167,10 @@  void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
 }
 
 int radeon_bo_create(struct radeon_device *rdev,
-		     unsigned long size, int byte_align, bool kernel, u32 domain,
-		     u32 flags, struct sg_table *sg, struct radeon_bo **bo_ptr)
+		     unsigned long size, int byte_align, bool kernel,
+		     u32 domain, u32 flags, struct sg_table *sg,
+		     struct reservation_object *resv,
+		     struct radeon_bo **bo_ptr)
 {
 	struct radeon_bo *bo;
 	enum ttm_bo_type type;
@@ -216,7 +218,7 @@  int radeon_bo_create(struct radeon_device *rdev,
 	down_read(&rdev->pm.mclk_lock);
 	r = ttm_bo_init(&rdev->mman.bdev, &bo->tbo, size, type,
 			&bo->placement, page_align, !kernel, NULL,
-			acc_size, sg, NULL, &radeon_ttm_bo_destroy);
+			acc_size, sg, resv, &radeon_ttm_bo_destroy);
 	up_read(&rdev->pm.mclk_lock);
 	if (unlikely(r != 0)) {
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
index 98a47fdf3625..1b8ec7917154 100644
--- a/drivers/gpu/drm/radeon/radeon_object.h
+++ b/drivers/gpu/drm/radeon/radeon_object.h
@@ -126,6 +126,7 @@  extern int radeon_bo_create(struct radeon_device *rdev,
 			    unsigned long size, int byte_align,
 			    bool kernel, u32 domain, u32 flags,
 			    struct sg_table *sg,
+			    struct reservation_object *resv,
 			    struct radeon_bo **bo_ptr);
 extern int radeon_bo_kmap(struct radeon_bo *bo, void **ptr);
 extern void radeon_bo_kunmap(struct radeon_bo *bo);
diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c
index 171daf7fc483..f3609c97496b 100644
--- a/drivers/gpu/drm/radeon/radeon_prime.c
+++ b/drivers/gpu/drm/radeon/radeon_prime.c
@@ -61,12 +61,15 @@  struct drm_gem_object *radeon_gem_prime_import_sg_table(struct drm_device *dev,
 							struct dma_buf_attachment *attach,
 							struct sg_table *sg)
 {
+	struct reservation_object *resv = attach->dmabuf->resv;
 	struct radeon_device *rdev = dev->dev_private;
 	struct radeon_bo *bo;
 	int ret;
 
+	ww_mutex_lock(&resv->lock, NULL);
 	ret = radeon_bo_create(rdev, attach->dmabuf->size, PAGE_SIZE, false,
-			       RADEON_GEM_DOMAIN_GTT, 0, sg, &bo);
+			       RADEON_GEM_DOMAIN_GTT, 0, sg, resv, &bo);
+	ww_mutex_unlock(&resv->lock);
 	if (ret)
 		return ERR_PTR(ret);
 
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c
index 6f2a9bd6bb54..3d17af34afa7 100644
--- a/drivers/gpu/drm/radeon/radeon_ring.c
+++ b/drivers/gpu/drm/radeon/radeon_ring.c
@@ -383,7 +383,7 @@  int radeon_ring_init(struct radeon_device *rdev, struct radeon_ring *ring, unsig
 	/* Allocate ring buffer */
 	if (ring->ring_obj == NULL) {
 		r = radeon_bo_create(rdev, ring->ring_size, PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_GTT, 0,
+				     RADEON_GEM_DOMAIN_GTT, 0, NULL,
 				     NULL, &ring->ring_obj);
 		if (r) {
 			dev_err(rdev->dev, "(%d) ring create failed\n", r);
diff --git a/drivers/gpu/drm/radeon/radeon_sa.c b/drivers/gpu/drm/radeon/radeon_sa.c
index b84f97c8718c..c507896aca45 100644
--- a/drivers/gpu/drm/radeon/radeon_sa.c
+++ b/drivers/gpu/drm/radeon/radeon_sa.c
@@ -65,7 +65,7 @@  int radeon_sa_bo_manager_init(struct radeon_device *rdev,
 	}
 
 	r = radeon_bo_create(rdev, size, align, true,
-			     domain, flags, NULL, &sa_manager->bo);
+			     domain, flags, NULL, NULL, &sa_manager->bo);
 	if (r) {
 		dev_err(rdev->dev, "(%d) failed to allocate bo for manager\n", r);
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c
index ce943e1a5e51..07b506b41008 100644
--- a/drivers/gpu/drm/radeon/radeon_test.c
+++ b/drivers/gpu/drm/radeon/radeon_test.c
@@ -67,7 +67,7 @@  static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
 	}
 
 	r = radeon_bo_create(rdev, size, PAGE_SIZE, true, RADEON_GEM_DOMAIN_VRAM,
-			     0, NULL, &vram_obj);
+			     0, NULL, NULL, &vram_obj);
 	if (r) {
 		DRM_ERROR("Failed to create VRAM object\n");
 		goto out_cleanup;
@@ -87,7 +87,8 @@  static void radeon_do_test_moves(struct radeon_device *rdev, int flag)
 		struct radeon_fence *fence = NULL;
 
 		r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_GTT, 0, NULL, gtt_obj + i);
+				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
+				     gtt_obj + i);
 		if (r) {
 			DRM_ERROR("Failed to create GTT object %d\n", i);
 			goto out_lclean;
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index eca2ce60d440..747307ec46da 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -858,7 +858,7 @@  int radeon_ttm_init(struct radeon_device *rdev)
 	radeon_ttm_set_active_vram_size(rdev, rdev->mc.visible_vram_size);
 
 	r = radeon_bo_create(rdev, 256 * 1024, PAGE_SIZE, true,
-			     RADEON_GEM_DOMAIN_VRAM, 0,
+			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
 			     NULL, &rdev->stollen_vga_memory);
 	if (r) {
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_uvd.c b/drivers/gpu/drm/radeon/radeon_uvd.c
index ba4f38916026..11b662469253 100644
--- a/drivers/gpu/drm/radeon/radeon_uvd.c
+++ b/drivers/gpu/drm/radeon/radeon_uvd.c
@@ -141,7 +141,8 @@  int radeon_uvd_init(struct radeon_device *rdev)
 		  RADEON_UVD_STACK_SIZE + RADEON_UVD_HEAP_SIZE +
 		  RADEON_GPU_PAGE_SIZE;
 	r = radeon_bo_create(rdev, bo_size, PAGE_SIZE, true,
-			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->uvd.vcpu_bo);
+			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
+			     NULL, &rdev->uvd.vcpu_bo);
 	if (r) {
 		dev_err(rdev->dev, "(%d) failed to allocate UVD bo\n", r);
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_vce.c b/drivers/gpu/drm/radeon/radeon_vce.c
index c7190aadbd89..9e85757d5599 100644
--- a/drivers/gpu/drm/radeon/radeon_vce.c
+++ b/drivers/gpu/drm/radeon/radeon_vce.c
@@ -126,7 +126,8 @@  int radeon_vce_init(struct radeon_device *rdev)
 	size = RADEON_GPU_PAGE_ALIGN(rdev->vce_fw->size) +
 	       RADEON_VCE_STACK_SIZE + RADEON_VCE_HEAP_SIZE;
 	r = radeon_bo_create(rdev, size, PAGE_SIZE, true,
-			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &rdev->vce.vcpu_bo);
+			     RADEON_GEM_DOMAIN_VRAM, 0, NULL, NULL,
+			     &rdev->vce.vcpu_bo);
 	if (r) {
 		dev_err(rdev->dev, "(%d) failed to allocate VCE bo\n", r);
 		return r;
diff --git a/drivers/gpu/drm/radeon/radeon_vm.c b/drivers/gpu/drm/radeon/radeon_vm.c
index f6e76c18d7eb..683062576a8d 100644
--- a/drivers/gpu/drm/radeon/radeon_vm.c
+++ b/drivers/gpu/drm/radeon/radeon_vm.c
@@ -548,7 +548,8 @@  int radeon_vm_bo_set_addr(struct radeon_device *rdev,
 
 		r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,
 				     RADEON_GPU_PAGE_SIZE, true,
-				     RADEON_GEM_DOMAIN_VRAM, 0, NULL, &pt);
+				     RADEON_GEM_DOMAIN_VRAM, 0,
+				     NULL, NULL, &pt);
 		if (r)
 			return r;
 
@@ -1127,7 +1128,7 @@  int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
 
 	r = radeon_bo_create(rdev, pd_size, align, true,
 			     RADEON_GEM_DOMAIN_VRAM, 0, NULL,
-			     &vm->page_directory);
+			     NULL, &vm->page_directory);
 	if (r)
 		return r;