[PATCH 1/2] drm/amdgpu: add amdgpu_bo_param
Christian König
ckoenig.leichtzumerken at gmail.com
Mon Apr 16 12:23:51 UTC 2018
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;
More information about the amd-gfx
mailing list