Am 16.04.2018 um 13:13 schrieb Chunming Zhou: > Change-Id: Ib2aa98ee37a70f3cb0d61eef1d336e89187554d5 > Signed-off-by: Chunming Zhou <david1.zhou at amd.com> Reviewed-by: Christian König <christian.koenig at 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;