to support GTT memory allocation and free.

Signed-off-by: James Zhu <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 89 ++++++++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h |  5 ++
 2 files changed, 94 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
index 1fab953e9a03..4c05483e90d0 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
@@ -3207,3 +3207,92 @@ void amdgpu_vm_print_task_info(struct amdgpu_device 
*adev,
                task_info->process_name, task_info->tgid,
                task_info->task.comm, task_info->task.pid);
 }
+
+int amdgpu_vm_alloc_gtt_mem(struct amdgpu_device *adev, size_t size,
+                               void **mem_obj, uint64_t *gpu_addr,
+                               void **cpu_ptr, bool cp_mqd_gfx9, bool 
is_uswc_mode)
+{
+       struct amdgpu_bo *bo = NULL;
+       struct amdgpu_bo_param bp;
+       int r;
+       void *cpu_ptr_tmp = NULL;
+
+       memset(&bp, 0, sizeof(bp));
+       bp.size = size;
+       bp.byte_align = PAGE_SIZE;
+       bp.domain = AMDGPU_GEM_DOMAIN_GTT;
+       if (is_uswc_mode)
+               bp.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC;
+       else
+               bp.flags = 0;
+       bp.type = ttm_bo_type_kernel;
+       bp.resv = NULL;
+       bp.bo_ptr_size = sizeof(struct amdgpu_bo);
+
+       if (cp_mqd_gfx9)
+               bp.flags |= AMDGPU_GEM_CREATE_CP_MQD_GFX9;
+
+       r = amdgpu_bo_create(adev, &bp, &bo);
+       if (r) {
+               dev_err(adev->dev,
+                       "failed to allocate BO for amdkfd (%d)\n", r);
+               return r;
+       }
+
+       /* map the buffer */
+       r = amdgpu_bo_reserve(bo, true);
+       if (r) {
+               dev_err(adev->dev, "(%d) failed to reserve bo for amdkfd\n", r);
+               goto allocate_mem_reserve_bo_failed;
+       }
+
+       r = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT);
+       if (r) {
+               dev_err(adev->dev, "(%d) failed to pin bo for amdkfd\n", r);
+               goto allocate_mem_pin_bo_failed;
+       }
+
+       r = amdgpu_ttm_alloc_gart(&bo->tbo);
+       if (r) {
+               dev_err(adev->dev, "%p bind failed\n", bo);
+               goto allocate_mem_kmap_bo_failed;
+       }
+
+       r = amdgpu_bo_kmap(bo, &cpu_ptr_tmp);
+       if (r) {
+               dev_err(adev->dev,
+                       "(%d) failed to map bo to kernel for amdkfd\n", r);
+               goto allocate_mem_kmap_bo_failed;
+       }
+
+       *mem_obj = bo;
+       *gpu_addr = amdgpu_bo_gpu_offset(bo);
+       *cpu_ptr = cpu_ptr_tmp;
+
+       amdgpu_bo_unreserve(bo);
+
+       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:
+       amdgpu_bo_unref(&bo);
+
+       return r;
+}
+
+void amdgpu_vm_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj)
+{
+       struct amdgpu_bo **bo = (struct amdgpu_bo **) mem_obj;
+
+       if (!bo || !*bo)
+               return;
+
+       (void)amdgpu_bo_reserve(*bo, true);
+       amdgpu_bo_kunmap(*bo);
+       amdgpu_bo_unpin(*bo);
+       amdgpu_bo_unreserve(*bo);
+       amdgpu_bo_unref(bo);
+}
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
index fe9f759fdbe9..854cfaf0cd42 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
@@ -715,4 +715,9 @@ void amdgpu_vm_print_task_info(struct amdgpu_device *adev,
 #define amdgpu_vm_bo_va_for_each_invalid_mapping(bo_va, mapping) \
                list_for_each_entry(mapping, &(bo_va)->invalids, list)
 
+int amdgpu_vm_alloc_gtt_mem(struct amdgpu_device *adev, size_t size,
+                               void **mem_obj, uint64_t *gpu_addr,
+                               void **cpu_ptr, bool mqd_gfx9, bool 
is_uswc_mode);
+void amdgpu_vm_free_gtt_mem(struct amdgpu_device *adev, void **mem_obj);
+
 #endif
-- 
2.34.1

Reply via email to