[1/2] drm/amdgpu: add amdgpu_bo_param

Submitted by Zhou, David(ChunMing) on April 16, 2018, 11:13 a.m.

Details

Message ID 20180416111305.640-1-david1.zhou@amd.com
State New
Headers show
Series "Series without cover letter" ( rev: 1 ) in AMD X.Org drivers

Not browsing as part of any series.

Commit Message

Zhou, David(ChunMing) April 16, 2018, 11:13 a.m.
Change-Id: Ib2aa98ee37a70f3cb0d61eef1d336e89187554d5
Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 81 +++++++++++++++++-------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_object.h |  9 ++++
 2 files changed, 54 insertions(+), 36 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
index a160ef0332d6..b557b63bb648 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
@@ -341,28 +341,26 @@  static bool amdgpu_bo_validate_size(struct amdgpu_device *adev,
 	return false;
 }
 
-static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
-			       int byte_align, u32 domain,
-			       u64 flags, enum ttm_bo_type type,
-			       struct reservation_object *resv,
+static int amdgpu_bo_do_create(struct amdgpu_device *adev,
+			       struct amdgpu_bo_param *bp,
 			       struct amdgpu_bo **bo_ptr)
 {
 	struct ttm_operation_ctx ctx = {
-		.interruptible = (type != ttm_bo_type_kernel),
+		.interruptible = (bp->type != ttm_bo_type_kernel),
 		.no_wait_gpu = false,
-		.resv = resv,
+		.resv = bp->resv,
 		.flags = TTM_OPT_FLAG_ALLOW_RES_EVICT
 	};
 	struct amdgpu_bo *bo;
-	unsigned long page_align;
+	unsigned long page_align, size = bp->size;
 	size_t acc_size;
 	u32 domains, preferred_domains, allowed_domains;
 	int r;
 
-	page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
+	page_align = roundup(bp->byte_align, PAGE_SIZE) >> PAGE_SHIFT;
 	size = ALIGN(size, PAGE_SIZE);
 
-	if (!amdgpu_bo_validate_size(adev, size, domain))
+	if (!amdgpu_bo_validate_size(adev, size, bp->domain))
 		return -ENOMEM;
 
 	*bo_ptr = NULL;
@@ -370,14 +368,14 @@  static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
 	acc_size = ttm_bo_dma_acc_size(&adev->mman.bdev, size,
 				       sizeof(struct amdgpu_bo));
 
-	preferred_domains = domain & (AMDGPU_GEM_DOMAIN_VRAM |
-				      AMDGPU_GEM_DOMAIN_GTT |
-				      AMDGPU_GEM_DOMAIN_CPU |
-				      AMDGPU_GEM_DOMAIN_GDS |
-				      AMDGPU_GEM_DOMAIN_GWS |
-				      AMDGPU_GEM_DOMAIN_OA);
+	preferred_domains = bp->domain & (AMDGPU_GEM_DOMAIN_VRAM |
+					  AMDGPU_GEM_DOMAIN_GTT |
+					  AMDGPU_GEM_DOMAIN_CPU |
+					  AMDGPU_GEM_DOMAIN_GDS |
+					  AMDGPU_GEM_DOMAIN_GWS |
+					  AMDGPU_GEM_DOMAIN_OA);
 	allowed_domains = preferred_domains;
-	if (type != ttm_bo_type_kernel &&
+	if (bp->type != ttm_bo_type_kernel &&
 	    allowed_domains == AMDGPU_GEM_DOMAIN_VRAM)
 		allowed_domains |= AMDGPU_GEM_DOMAIN_GTT;
 	domains = preferred_domains;
@@ -391,7 +389,7 @@  static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
 	bo->preferred_domains = preferred_domains;
 	bo->allowed_domains = allowed_domains;
 
-	bo->flags = flags;
+	bo->flags = bp->flags;
 
 #ifdef CONFIG_X86_32
 	/* XXX: Write-combined CPU mappings of GTT seem broken on 32-bit
@@ -423,13 +421,13 @@  static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
 
 	bo->tbo.bdev = &adev->mman.bdev;
 	amdgpu_ttm_placement_from_domain(bo, domains);
-	r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, type,
+	r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, bp->type,
 				 &bo->placement, page_align, &ctx, acc_size,
-				 NULL, resv, &amdgpu_ttm_bo_destroy);
-	if (unlikely(r && r != -ERESTARTSYS) && type == ttm_bo_type_device &&
-	    !(flags & AMDGPU_GEM_CREATE_NO_FALLBACK)) {
-		if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
-			flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
+				 NULL, bp->resv, &amdgpu_ttm_bo_destroy);
+	if (unlikely(r && r != -ERESTARTSYS) && bp->type == ttm_bo_type_device &&
+	    !(bp->flags & AMDGPU_GEM_CREATE_NO_FALLBACK)) {
+		if (bp->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
+			bp->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
 			goto retry;
 		} else if (domains != allowed_domains) {
 			domains = allowed_domains;
@@ -447,10 +445,10 @@  static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
 	else
 		amdgpu_cs_report_moved_bytes(adev, ctx.bytes_moved, 0);
 
-	if (type == ttm_bo_type_kernel)
+	if (bp->type == ttm_bo_type_kernel)
 		bo->tbo.priority = 1;
 
-	if (flags & AMDGPU_GEM_CREATE_VRAM_CLEARED &&
+	if (bp->flags & AMDGPU_GEM_CREATE_VRAM_CLEARED &&
 	    bo->tbo.mem.placement & TTM_PL_FLAG_VRAM) {
 		struct dma_fence *fence;
 
@@ -463,20 +461,20 @@  static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
 		bo->tbo.moving = dma_fence_get(fence);
 		dma_fence_put(fence);
 	}
-	if (!resv)
+	if (!bp->resv)
 		amdgpu_bo_unreserve(bo);
 	*bo_ptr = bo;
 
 	trace_amdgpu_bo_create(bo);
 
 	/* Treat CPU_ACCESS_REQUIRED only as a hint if given by UMD */
-	if (type == ttm_bo_type_device)
+	if (bp->type == ttm_bo_type_device)
 		bo->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
 
 	return 0;
 
 fail_unreserve:
-	if (!resv)
+	if (!bp->resv)
 		ww_mutex_unlock(&bo->tbo.resv->lock);
 	amdgpu_bo_unref(&bo);
 	return r;
@@ -486,16 +484,21 @@  static int amdgpu_bo_create_shadow(struct amdgpu_device *adev,
 				   unsigned long size, int byte_align,
 				   struct amdgpu_bo *bo)
 {
+	struct amdgpu_bo_param bp = {
+		.size = size,
+		.byte_align = byte_align,
+		.domain = AMDGPU_GEM_DOMAIN_GTT,
+		.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC |
+			AMDGPU_GEM_CREATE_SHADOW,
+		.type = ttm_bo_type_kernel,
+		.resv = bo->tbo.resv
+	};
 	int r;
 
 	if (bo->shadow)
 		return 0;
 
-	r = amdgpu_bo_do_create(adev, size, byte_align, AMDGPU_GEM_DOMAIN_GTT,
-				AMDGPU_GEM_CREATE_CPU_GTT_USWC |
-				AMDGPU_GEM_CREATE_SHADOW,
-				ttm_bo_type_kernel,
-				bo->tbo.resv, &bo->shadow);
+	r = amdgpu_bo_do_create(adev, &bp, &bo->shadow);
 	if (!r) {
 		bo->shadow->parent = amdgpu_bo_ref(bo);
 		mutex_lock(&adev->shadow_list_lock);
@@ -512,11 +515,17 @@  int amdgpu_bo_create(struct amdgpu_device *adev, unsigned long size,
 		     struct reservation_object *resv,
 		     struct amdgpu_bo **bo_ptr)
 {
-	uint64_t parent_flags = flags & ~AMDGPU_GEM_CREATE_SHADOW;
+	struct amdgpu_bo_param bp = {
+		.size = size,
+		.byte_align = byte_align,
+		.domain = domain,
+		.flags = flags & ~AMDGPU_GEM_CREATE_SHADOW,
+		.type = type,
+		.resv = resv
+	};
 	int r;
 
-	r = amdgpu_bo_do_create(adev, size, byte_align, domain,
-				parent_flags, type, resv, bo_ptr);
+	r = amdgpu_bo_do_create(adev, &bp, bo_ptr);
 	if (r)
 		return r;
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
index 1e9fe85abcbb..4bb6f0a8d799 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
@@ -33,6 +33,15 @@ 
 
 #define AMDGPU_BO_INVALID_OFFSET	LONG_MAX
 
+struct amdgpu_bo_param {
+	unsigned long			size;
+	int				byte_align;
+	u32				domain;
+	u64				flags;
+	enum ttm_bo_type		type;
+	struct reservation_object	*resv;
+};
+
 /* bo virtual addresses in a vm */
 struct amdgpu_bo_va_mapping {
 	struct amdgpu_bo_va		*bo_va;

Comments

On Mon, Apr 16, 2018 at 07:13:04PM +0800, Chunming Zhou wrote:
> Change-Id: Ib2aa98ee37a70f3cb0d61eef1d336e89187554d5
> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>

Reviewed-by: Huang Rui <ray.huang@amd.com>

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 81 +++++++++++++++++-------------
>  drivers/gpu/drm/amd/amdgpu/amdgpu_object.h |  9 ++++
>  2 files changed, 54 insertions(+), 36 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index a160ef0332d6..b557b63bb648 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -341,28 +341,26 @@ static bool amdgpu_bo_validate_size(struct amdgpu_device *adev,
>  	return false;
>  }
>  
> -static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
> -			       int byte_align, u32 domain,
> -			       u64 flags, enum ttm_bo_type type,
> -			       struct reservation_object *resv,
> +static int amdgpu_bo_do_create(struct amdgpu_device *adev,
> +			       struct amdgpu_bo_param *bp,
>  			       struct amdgpu_bo **bo_ptr)
>  {
>  	struct ttm_operation_ctx ctx = {
> -		.interruptible = (type != ttm_bo_type_kernel),
> +		.interruptible = (bp->type != ttm_bo_type_kernel),
>  		.no_wait_gpu = false,
> -		.resv = resv,
> +		.resv = bp->resv,
>  		.flags = TTM_OPT_FLAG_ALLOW_RES_EVICT
>  	};
>  	struct amdgpu_bo *bo;
> -	unsigned long page_align;
> +	unsigned long page_align, size = bp->size;
>  	size_t acc_size;
>  	u32 domains, preferred_domains, allowed_domains;
>  	int r;
>  
> -	page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
> +	page_align = roundup(bp->byte_align, PAGE_SIZE) >> PAGE_SHIFT;
>  	size = ALIGN(size, PAGE_SIZE);
>  
> -	if (!amdgpu_bo_validate_size(adev, size, domain))
> +	if (!amdgpu_bo_validate_size(adev, size, bp->domain))
>  		return -ENOMEM;
>  
>  	*bo_ptr = NULL;
> @@ -370,14 +368,14 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
>  	acc_size = ttm_bo_dma_acc_size(&adev->mman.bdev, size,
>  				       sizeof(struct amdgpu_bo));
>  
> -	preferred_domains = domain & (AMDGPU_GEM_DOMAIN_VRAM |
> -				      AMDGPU_GEM_DOMAIN_GTT |
> -				      AMDGPU_GEM_DOMAIN_CPU |
> -				      AMDGPU_GEM_DOMAIN_GDS |
> -				      AMDGPU_GEM_DOMAIN_GWS |
> -				      AMDGPU_GEM_DOMAIN_OA);
> +	preferred_domains = bp->domain & (AMDGPU_GEM_DOMAIN_VRAM |
> +					  AMDGPU_GEM_DOMAIN_GTT |
> +					  AMDGPU_GEM_DOMAIN_CPU |
> +					  AMDGPU_GEM_DOMAIN_GDS |
> +					  AMDGPU_GEM_DOMAIN_GWS |
> +					  AMDGPU_GEM_DOMAIN_OA);
>  	allowed_domains = preferred_domains;
> -	if (type != ttm_bo_type_kernel &&
> +	if (bp->type != ttm_bo_type_kernel &&
>  	    allowed_domains == AMDGPU_GEM_DOMAIN_VRAM)
>  		allowed_domains |= AMDGPU_GEM_DOMAIN_GTT;
>  	domains = preferred_domains;
> @@ -391,7 +389,7 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
>  	bo->preferred_domains = preferred_domains;
>  	bo->allowed_domains = allowed_domains;
>  
> -	bo->flags = flags;
> +	bo->flags = bp->flags;
>  
>  #ifdef CONFIG_X86_32
>  	/* XXX: Write-combined CPU mappings of GTT seem broken on 32-bit
> @@ -423,13 +421,13 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
>  
>  	bo->tbo.bdev = &adev->mman.bdev;
>  	amdgpu_ttm_placement_from_domain(bo, domains);
> -	r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, type,
> +	r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, bp->type,
>  				 &bo->placement, page_align, &ctx, acc_size,
> -				 NULL, resv, &amdgpu_ttm_bo_destroy);
> -	if (unlikely(r && r != -ERESTARTSYS) && type == ttm_bo_type_device &&
> -	    !(flags & AMDGPU_GEM_CREATE_NO_FALLBACK)) {
> -		if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
> -			flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
> +				 NULL, bp->resv, &amdgpu_ttm_bo_destroy);
> +	if (unlikely(r && r != -ERESTARTSYS) && bp->type == ttm_bo_type_device &&
> +	    !(bp->flags & AMDGPU_GEM_CREATE_NO_FALLBACK)) {
> +		if (bp->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
> +			bp->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
>  			goto retry;
>  		} else if (domains != allowed_domains) {
>  			domains = allowed_domains;
> @@ -447,10 +445,10 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
>  	else
>  		amdgpu_cs_report_moved_bytes(adev, ctx.bytes_moved, 0);
>  
> -	if (type == ttm_bo_type_kernel)
> +	if (bp->type == ttm_bo_type_kernel)
>  		bo->tbo.priority = 1;
>  
> -	if (flags & AMDGPU_GEM_CREATE_VRAM_CLEARED &&
> +	if (bp->flags & AMDGPU_GEM_CREATE_VRAM_CLEARED &&
>  	    bo->tbo.mem.placement & TTM_PL_FLAG_VRAM) {
>  		struct dma_fence *fence;
>  
> @@ -463,20 +461,20 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
>  		bo->tbo.moving = dma_fence_get(fence);
>  		dma_fence_put(fence);
>  	}
> -	if (!resv)
> +	if (!bp->resv)
>  		amdgpu_bo_unreserve(bo);
>  	*bo_ptr = bo;
>  
>  	trace_amdgpu_bo_create(bo);
>  
>  	/* Treat CPU_ACCESS_REQUIRED only as a hint if given by UMD */
> -	if (type == ttm_bo_type_device)
> +	if (bp->type == ttm_bo_type_device)
>  		bo->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
>  
>  	return 0;
>  
>  fail_unreserve:
> -	if (!resv)
> +	if (!bp->resv)
>  		ww_mutex_unlock(&bo->tbo.resv->lock);
>  	amdgpu_bo_unref(&bo);
>  	return r;
> @@ -486,16 +484,21 @@ static int amdgpu_bo_create_shadow(struct amdgpu_device *adev,
>  				   unsigned long size, int byte_align,
>  				   struct amdgpu_bo *bo)
>  {
> +	struct amdgpu_bo_param bp = {
> +		.size = size,
> +		.byte_align = byte_align,
> +		.domain = AMDGPU_GEM_DOMAIN_GTT,
> +		.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC |
> +			AMDGPU_GEM_CREATE_SHADOW,
> +		.type = ttm_bo_type_kernel,
> +		.resv = bo->tbo.resv
> +	};
>  	int r;
>  
>  	if (bo->shadow)
>  		return 0;
>  
> -	r = amdgpu_bo_do_create(adev, size, byte_align, AMDGPU_GEM_DOMAIN_GTT,
> -				AMDGPU_GEM_CREATE_CPU_GTT_USWC |
> -				AMDGPU_GEM_CREATE_SHADOW,
> -				ttm_bo_type_kernel,
> -				bo->tbo.resv, &bo->shadow);
> +	r = amdgpu_bo_do_create(adev, &bp, &bo->shadow);
>  	if (!r) {
>  		bo->shadow->parent = amdgpu_bo_ref(bo);
>  		mutex_lock(&adev->shadow_list_lock);
> @@ -512,11 +515,17 @@ int amdgpu_bo_create(struct amdgpu_device *adev, unsigned long size,
>  		     struct reservation_object *resv,
>  		     struct amdgpu_bo **bo_ptr)
>  {
> -	uint64_t parent_flags = flags & ~AMDGPU_GEM_CREATE_SHADOW;
> +	struct amdgpu_bo_param bp = {
> +		.size = size,
> +		.byte_align = byte_align,
> +		.domain = domain,
> +		.flags = flags & ~AMDGPU_GEM_CREATE_SHADOW,
> +		.type = type,
> +		.resv = resv
> +	};
>  	int r;
>  
> -	r = amdgpu_bo_do_create(adev, size, byte_align, domain,
> -				parent_flags, type, resv, bo_ptr);
> +	r = amdgpu_bo_do_create(adev, &bp, bo_ptr);
>  	if (r)
>  		return r;
>  
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> index 1e9fe85abcbb..4bb6f0a8d799 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> @@ -33,6 +33,15 @@
>  
>  #define AMDGPU_BO_INVALID_OFFSET	LONG_MAX
>  
> +struct amdgpu_bo_param {
> +	unsigned long			size;
> +	int				byte_align;
> +	u32				domain;
> +	u64				flags;
> +	enum ttm_bo_type		type;
> +	struct reservation_object	*resv;
> +};
> +
>  /* bo virtual addresses in a vm */
>  struct amdgpu_bo_va_mapping {
>  	struct amdgpu_bo_va		*bo_va;
> -- 
> 2.14.1
> 
> _______________________________________________
> amd-gfx mailing list
> amd-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
Am 16.04.2018 um 13:13 schrieb Chunming Zhou:
> Change-Id: Ib2aa98ee37a70f3cb0d61eef1d336e89187554d5
> Signed-off-by: Chunming Zhou <david1.zhou@amd.com>

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

> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 81 +++++++++++++++++-------------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_object.h |  9 ++++
>   2 files changed, 54 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> index a160ef0332d6..b557b63bb648 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
> @@ -341,28 +341,26 @@ static bool amdgpu_bo_validate_size(struct amdgpu_device *adev,
>   	return false;
>   }
>   
> -static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
> -			       int byte_align, u32 domain,
> -			       u64 flags, enum ttm_bo_type type,
> -			       struct reservation_object *resv,
> +static int amdgpu_bo_do_create(struct amdgpu_device *adev,
> +			       struct amdgpu_bo_param *bp,
>   			       struct amdgpu_bo **bo_ptr)
>   {
>   	struct ttm_operation_ctx ctx = {
> -		.interruptible = (type != ttm_bo_type_kernel),
> +		.interruptible = (bp->type != ttm_bo_type_kernel),
>   		.no_wait_gpu = false,
> -		.resv = resv,
> +		.resv = bp->resv,
>   		.flags = TTM_OPT_FLAG_ALLOW_RES_EVICT
>   	};
>   	struct amdgpu_bo *bo;
> -	unsigned long page_align;
> +	unsigned long page_align, size = bp->size;
>   	size_t acc_size;
>   	u32 domains, preferred_domains, allowed_domains;
>   	int r;
>   
> -	page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
> +	page_align = roundup(bp->byte_align, PAGE_SIZE) >> PAGE_SHIFT;
>   	size = ALIGN(size, PAGE_SIZE);
>   
> -	if (!amdgpu_bo_validate_size(adev, size, domain))
> +	if (!amdgpu_bo_validate_size(adev, size, bp->domain))
>   		return -ENOMEM;
>   
>   	*bo_ptr = NULL;
> @@ -370,14 +368,14 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
>   	acc_size = ttm_bo_dma_acc_size(&adev->mman.bdev, size,
>   				       sizeof(struct amdgpu_bo));
>   
> -	preferred_domains = domain & (AMDGPU_GEM_DOMAIN_VRAM |
> -				      AMDGPU_GEM_DOMAIN_GTT |
> -				      AMDGPU_GEM_DOMAIN_CPU |
> -				      AMDGPU_GEM_DOMAIN_GDS |
> -				      AMDGPU_GEM_DOMAIN_GWS |
> -				      AMDGPU_GEM_DOMAIN_OA);
> +	preferred_domains = bp->domain & (AMDGPU_GEM_DOMAIN_VRAM |
> +					  AMDGPU_GEM_DOMAIN_GTT |
> +					  AMDGPU_GEM_DOMAIN_CPU |
> +					  AMDGPU_GEM_DOMAIN_GDS |
> +					  AMDGPU_GEM_DOMAIN_GWS |
> +					  AMDGPU_GEM_DOMAIN_OA);
>   	allowed_domains = preferred_domains;
> -	if (type != ttm_bo_type_kernel &&
> +	if (bp->type != ttm_bo_type_kernel &&
>   	    allowed_domains == AMDGPU_GEM_DOMAIN_VRAM)
>   		allowed_domains |= AMDGPU_GEM_DOMAIN_GTT;
>   	domains = preferred_domains;
> @@ -391,7 +389,7 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
>   	bo->preferred_domains = preferred_domains;
>   	bo->allowed_domains = allowed_domains;
>   
> -	bo->flags = flags;
> +	bo->flags = bp->flags;
>   
>   #ifdef CONFIG_X86_32
>   	/* XXX: Write-combined CPU mappings of GTT seem broken on 32-bit
> @@ -423,13 +421,13 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
>   
>   	bo->tbo.bdev = &adev->mman.bdev;
>   	amdgpu_ttm_placement_from_domain(bo, domains);
> -	r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, type,
> +	r = ttm_bo_init_reserved(&adev->mman.bdev, &bo->tbo, size, bp->type,
>   				 &bo->placement, page_align, &ctx, acc_size,
> -				 NULL, resv, &amdgpu_ttm_bo_destroy);
> -	if (unlikely(r && r != -ERESTARTSYS) && type == ttm_bo_type_device &&
> -	    !(flags & AMDGPU_GEM_CREATE_NO_FALLBACK)) {
> -		if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
> -			flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
> +				 NULL, bp->resv, &amdgpu_ttm_bo_destroy);
> +	if (unlikely(r && r != -ERESTARTSYS) && bp->type == ttm_bo_type_device &&
> +	    !(bp->flags & AMDGPU_GEM_CREATE_NO_FALLBACK)) {
> +		if (bp->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
> +			bp->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
>   			goto retry;
>   		} else if (domains != allowed_domains) {
>   			domains = allowed_domains;
> @@ -447,10 +445,10 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
>   	else
>   		amdgpu_cs_report_moved_bytes(adev, ctx.bytes_moved, 0);
>   
> -	if (type == ttm_bo_type_kernel)
> +	if (bp->type == ttm_bo_type_kernel)
>   		bo->tbo.priority = 1;
>   
> -	if (flags & AMDGPU_GEM_CREATE_VRAM_CLEARED &&
> +	if (bp->flags & AMDGPU_GEM_CREATE_VRAM_CLEARED &&
>   	    bo->tbo.mem.placement & TTM_PL_FLAG_VRAM) {
>   		struct dma_fence *fence;
>   
> @@ -463,20 +461,20 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev, unsigned long size,
>   		bo->tbo.moving = dma_fence_get(fence);
>   		dma_fence_put(fence);
>   	}
> -	if (!resv)
> +	if (!bp->resv)
>   		amdgpu_bo_unreserve(bo);
>   	*bo_ptr = bo;
>   
>   	trace_amdgpu_bo_create(bo);
>   
>   	/* Treat CPU_ACCESS_REQUIRED only as a hint if given by UMD */
> -	if (type == ttm_bo_type_device)
> +	if (bp->type == ttm_bo_type_device)
>   		bo->flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
>   
>   	return 0;
>   
>   fail_unreserve:
> -	if (!resv)
> +	if (!bp->resv)
>   		ww_mutex_unlock(&bo->tbo.resv->lock);
>   	amdgpu_bo_unref(&bo);
>   	return r;
> @@ -486,16 +484,21 @@ static int amdgpu_bo_create_shadow(struct amdgpu_device *adev,
>   				   unsigned long size, int byte_align,
>   				   struct amdgpu_bo *bo)
>   {
> +	struct amdgpu_bo_param bp = {
> +		.size = size,
> +		.byte_align = byte_align,
> +		.domain = AMDGPU_GEM_DOMAIN_GTT,
> +		.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC |
> +			AMDGPU_GEM_CREATE_SHADOW,
> +		.type = ttm_bo_type_kernel,
> +		.resv = bo->tbo.resv
> +	};
>   	int r;
>   
>   	if (bo->shadow)
>   		return 0;
>   
> -	r = amdgpu_bo_do_create(adev, size, byte_align, AMDGPU_GEM_DOMAIN_GTT,
> -				AMDGPU_GEM_CREATE_CPU_GTT_USWC |
> -				AMDGPU_GEM_CREATE_SHADOW,
> -				ttm_bo_type_kernel,
> -				bo->tbo.resv, &bo->shadow);
> +	r = amdgpu_bo_do_create(adev, &bp, &bo->shadow);
>   	if (!r) {
>   		bo->shadow->parent = amdgpu_bo_ref(bo);
>   		mutex_lock(&adev->shadow_list_lock);
> @@ -512,11 +515,17 @@ int amdgpu_bo_create(struct amdgpu_device *adev, unsigned long size,
>   		     struct reservation_object *resv,
>   		     struct amdgpu_bo **bo_ptr)
>   {
> -	uint64_t parent_flags = flags & ~AMDGPU_GEM_CREATE_SHADOW;
> +	struct amdgpu_bo_param bp = {
> +		.size = size,
> +		.byte_align = byte_align,
> +		.domain = domain,
> +		.flags = flags & ~AMDGPU_GEM_CREATE_SHADOW,
> +		.type = type,
> +		.resv = resv
> +	};
>   	int r;
>   
> -	r = amdgpu_bo_do_create(adev, size, byte_align, domain,
> -				parent_flags, type, resv, bo_ptr);
> +	r = amdgpu_bo_do_create(adev, &bp, bo_ptr);
>   	if (r)
>   		return r;
>   
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> index 1e9fe85abcbb..4bb6f0a8d799 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
> @@ -33,6 +33,15 @@
>   
>   #define AMDGPU_BO_INVALID_OFFSET	LONG_MAX
>   
> +struct amdgpu_bo_param {
> +	unsigned long			size;
> +	int				byte_align;
> +	u32				domain;
> +	u64				flags;
> +	enum ttm_bo_type		type;
> +	struct reservation_object	*resv;
> +};
> +
>   /* bo virtual addresses in a vm */
>   struct amdgpu_bo_va_mapping {
>   	struct amdgpu_bo_va		*bo_va;