From f57e953015406393b1d6cc16d4cff02d9376ffcc Mon Sep 17 00:00:00 2001 From: Yong Zhao Date: Thu, 27 Apr 2017 18:20:30 -0400 Subject: [PATCH 1673/4131] drm/amdkfd: Reuse code for mapping bo to kernel address Change-Id: Ied01fa07ae5e140a791b372311cd23ba7d3e4e78 Signed-off-by: Yong Zhao --- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 101 ++++++++++------------- 1 file changed, 42 insertions(+), 59 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c index 9cb51dd..bb1f7a6 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c @@ -557,6 +557,40 @@ static int init_user_pages(struct kgd_mem *mem, struct mm_struct *mm, return ret; } +static int __map_bo_to_kernel(struct amdgpu_bo *bo, u32 domain, void **kptr) +{ + int ret; + + ret = amdgpu_bo_reserve(bo, true); + if (ret) { + pr_err("Failed to reserve bo. ret %d\n", ret); + return ret; + } + + ret = amdgpu_bo_pin(bo, domain, NULL); + if (ret) { + pr_err("Failed to pin bo. ret %d\n", ret); + goto pin_failed; + } + + ret = amdgpu_bo_kmap(bo, kptr); + if (ret) { + pr_err("Failed to map bo to kernel. ret %d\n", ret); + goto kmap_failed; + } + + amdgpu_bo_unreserve(bo); + + return ret; + +kmap_failed: + amdgpu_bo_unpin(bo); +pin_failed: + amdgpu_bo_unreserve(bo); + + return ret; +} + static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va, uint64_t size, void *vm, struct kgd_mem **mem, uint64_t *offset, void **kptr, @@ -644,28 +678,9 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va, bo->flags |= AMDGPU_AMDKFD_USERPTR_BO; if (kptr) { - ret = amdgpu_bo_reserve(bo, true); - if (ret) { - pr_err("Failed to reserve bo. ret %d\n", ret); - goto allocate_mem_reserve_bo_failed; - } - - ret = amdgpu_bo_pin(bo, domain, - NULL); - if (ret) { - pr_err("Failed to pin bo. ret %d\n", ret); - goto allocate_mem_pin_bo_failed; - } - - ret = amdgpu_bo_kmap(bo, kptr); - if (ret) { - pr_err("Failed to map bo to kernel. ret %d\n", - ret); - goto allocate_mem_kmap_bo_failed; - } - (*mem)->kptr = *kptr; - - amdgpu_bo_unreserve(bo); + ret = __map_bo_to_kernel(bo, domain, kptr); + if (ret) + goto map_bo_to_kernel_failed; } (*mem)->va = va; @@ -689,12 +704,7 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va, return 0; -allocate_mem_kmap_bo_failed: - amdgpu_bo_unpin(bo); -allocate_mem_pin_bo_failed: - amdgpu_bo_unreserve(bo); -allocate_mem_reserve_bo_failed: - +map_bo_to_kernel_failed: allocate_init_user_pages_failed: amdgpu_bo_unref(&bo); err_bo_create: @@ -1615,46 +1625,19 @@ int amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(struct kgd_dev *kgd, struct kgd_mem *mem, void **kptr) { int ret; - struct amdgpu_device *adev; struct amdgpu_bo *bo; - adev = get_amdgpu_device(kgd); - mutex_lock(&mem->lock); bo = mem->bo; - /* map the buffer */ - ret = amdgpu_bo_reserve(bo, true); - if (ret) { - pr_err("Failed to reserve bo. ret %d\n", ret); - mutex_unlock(&mem->lock); - return ret; - } - ret = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT, - NULL); - if (ret) { - pr_err("Failed to pin bo. ret %d\n", ret); - amdgpu_bo_unreserve(bo); - mutex_unlock(&mem->lock); - return ret; - } - - ret = amdgpu_bo_kmap(bo, kptr); - if (ret) { - pr_err("Failed to map bo to kernel. ret %d\n", ret); - amdgpu_bo_unpin(bo); - amdgpu_bo_unreserve(bo); - mutex_unlock(&mem->lock); - return ret; - } - - mem->kptr = *kptr; + ret = __map_bo_to_kernel(bo, AMDGPU_GEM_DOMAIN_GTT, kptr); + if (!ret) + mem->kptr = *kptr; - amdgpu_bo_unreserve(bo); mutex_unlock(&mem->lock); - return 0; + return ret; } static int pin_bo_wo_map(struct kgd_mem *mem) -- 2.7.4