drm/amdgpu: Add memory partition mem_id to amdgpu_bo
authorPhilip Yang <Philip.Yang@amd.com>
Thu, 26 Jan 2023 23:25:28 +0000 (18:25 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 14:00:00 +0000 (10:00 -0400)
Add mem_id_plus1 parameter to amdgpu_gem_object_create and pass it to
amdgpu_bo_create. For dGPU mode allocation, mem_id is used by VRAM
manager to get the memory partition fpfn, lpfn from xcp manager. For APU
native mode allocation, mem_id is used to get NUMA node id from xcp
manager, then pass to TTM as numa pool id to alloc memory from the
specific NUMA node. mem_id -1 means for entire VRAM or any NUMA nodes.

Signed-off-by: Philip Yang <Philip.Yang@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.h
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h

index fd395cd..71f1e19 100644 (file)
@@ -290,7 +290,7 @@ create_dmamap_sg_bo(struct amdgpu_device *adev,
 
        ret = amdgpu_gem_object_create(adev, mem->bo->tbo.base.size, 1,
                        AMDGPU_GEM_DOMAIN_CPU, AMDGPU_GEM_CREATE_PREEMPTIBLE | flags,
-                       ttm_bo_type_sg, mem->bo->tbo.base.resv, &gem_obj);
+                       ttm_bo_type_sg, mem->bo->tbo.base.resv, &gem_obj, 0);
 
        amdgpu_bo_unreserve(mem->bo);
 
@@ -1721,7 +1721,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
                        va, (*mem)->aql_queue ? size << 1 : size, domain_string(alloc_domain));
 
        ret = amdgpu_gem_object_create(adev, aligned_size, 1, alloc_domain, alloc_flags,
-                                      bo_type, NULL, &gobj);
+                                      bo_type, NULL, &gobj, 0);
        if (ret) {
                pr_debug("Failed to create BO on domain %s. ret %d\n",
                         domain_string(alloc_domain), ret);
index 6dceaf4..1221059 100644 (file)
@@ -336,7 +336,7 @@ amdgpu_dma_buf_create_obj(struct drm_device *dev, struct dma_buf *dma_buf)
 
        ret = amdgpu_gem_object_create(adev, dma_buf->size, PAGE_SIZE,
                                       AMDGPU_GEM_DOMAIN_CPU, flags,
-                                      ttm_bo_type_sg, resv, &gobj);
+                                      ttm_bo_type_sg, resv, &gobj, 0);
        if (ret)
                goto error;
 
index 863cb66..33ebee1 100644 (file)
@@ -98,7 +98,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
                             int alignment, u32 initial_domain,
                             u64 flags, enum ttm_bo_type type,
                             struct dma_resv *resv,
-                            struct drm_gem_object **obj)
+                            struct drm_gem_object **obj, int8_t mem_id_plus1)
 {
        struct amdgpu_bo *bo;
        struct amdgpu_bo_user *ubo;
@@ -116,6 +116,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
        bp.flags = flags;
        bp.domain = initial_domain;
        bp.bo_ptr_size = sizeof(struct amdgpu_bo);
+       bp.mem_id_plus1 = mem_id_plus1;
 
        r = amdgpu_bo_create_user(adev, &bp, &ubo);
        if (r)
@@ -336,7 +337,7 @@ int amdgpu_gem_create_ioctl(struct drm_device *dev, void *data,
 retry:
        r = amdgpu_gem_object_create(adev, size, args->in.alignment,
                                     initial_domain,
-                                    flags, ttm_bo_type_device, resv, &gobj);
+                                    flags, ttm_bo_type_device, resv, &gobj, 0);
        if (r && r != -ERESTARTSYS) {
                if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) {
                        flags &= ~AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED;
@@ -405,7 +406,7 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void *data,
 
        /* create a gem object to contain this object in */
        r = amdgpu_gem_object_create(adev, args->size, 0, AMDGPU_GEM_DOMAIN_CPU,
-                                    0, ttm_bo_type_device, NULL, &gobj);
+                                    0, ttm_bo_type_device, NULL, &gobj, 0);
        if (r)
                return r;
 
@@ -931,7 +932,7 @@ int amdgpu_mode_dumb_create(struct drm_file *file_priv,
        domain = amdgpu_bo_get_preferred_domain(adev,
                                amdgpu_display_supported_domains(adev, flags));
        r = amdgpu_gem_object_create(adev, args->size, 0, domain, flags,
-                                    ttm_bo_type_device, NULL, &gobj);
+                                    ttm_bo_type_device, NULL, &gobj, 0);
        if (r)
                return -ENOMEM;
 
index 637bf51..646c4fc 100644 (file)
@@ -43,8 +43,7 @@ int amdgpu_gem_object_create(struct amdgpu_device *adev, unsigned long size,
                             int alignment, u32 initial_domain,
                             u64 flags, enum ttm_bo_type type,
                             struct dma_resv *resv,
-                            struct drm_gem_object **obj);
-
+                            struct drm_gem_object **obj, int8_t mem_id_plus1);
 int amdgpu_mode_dumb_create(struct drm_file *file_priv,
                            struct drm_device *dev,
                            struct drm_mode_create_dumb *args);
index 725530e..628632e 100644 (file)
@@ -574,6 +574,9 @@ int amdgpu_bo_create(struct amdgpu_device *adev,
 
        bo->flags = bp->flags;
 
+       /* bo->mem_id -1 means any partition */
+       bo->mem_id = bp->mem_id_plus1 - 1;
+
        if (!amdgpu_bo_support_uswc(bo->flags))
                bo->flags &= ~AMDGPU_GEM_CREATE_CPU_GTT_USWC;
 
index 35b8106..eb24a66 100644 (file)
@@ -56,6 +56,8 @@ struct amdgpu_bo_param {
        bool                            no_wait_gpu;
        struct dma_resv                 *resv;
        void                            (*destroy)(struct ttm_buffer_object *bo);
+       /* memory partition number plus 1, 0 means any partition */
+       int8_t                          mem_id_plus1;
 };
 
 /* bo virtual addresses in a vm */
@@ -108,6 +110,9 @@ struct amdgpu_bo {
        struct mmu_interval_notifier    notifier;
 #endif
        struct kgd_mem                  *kfd_bo;
+
+       /* memory partition number, -1 means any partition */
+       int8_t                          mem_id;
 };
 
 struct amdgpu_bo_user {