From: Oak Zeng <oz...@amd.com>

This is preparation work to introduce more mqd allocation
scheme

Signed-off-by: Oak Zeng <oz...@amd.com>
Reviewed-by: Felix Kuehling <felix.kuehl...@amd.com>
Signed-off-by: Felix Kuehling <felix.kuehl...@amd.com>
---
 .../gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c  | 20 ++++++--
 .../gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c   | 51 ++++++++++++-------
 .../gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c   | 18 +++++--
 3 files changed, 64 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
index eec131b801b0..a00402077e34 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
@@ -66,6 +66,19 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,
                m->compute_static_thread_mgmt_se3);
 }
 
+static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
+                                       struct queue_properties *q)
+{
+       struct kfd_mem_obj *mqd_mem_obj;
+
+       if (kfd_gtt_sa_allocate(kfd, sizeof(struct cik_mqd),
+                       &mqd_mem_obj))
+               return NULL;
+
+       return mqd_mem_obj;
+}
+
+
 static int init_mqd(struct mqd_manager *mm, void **mqd,
                struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
                struct queue_properties *q)
@@ -73,11 +86,10 @@ static int init_mqd(struct mqd_manager *mm, void **mqd,
        uint64_t addr;
        struct cik_mqd *m;
        int retval;
+       struct kfd_dev *kfd = mm->dev;
 
-       retval = kfd_gtt_sa_allocate(mm->dev, sizeof(struct cik_mqd),
-                                       mqd_mem_obj);
-
-       if (retval != 0)
+       *mqd_mem_obj = allocate_mqd(kfd, q);
+       if (!*mqd_mem_obj)
                return -ENOMEM;
 
        m = (struct cik_mqd *) (*mqd_mem_obj)->cpu_ptr;
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
index 15274a880ea2..8f8166189fd5 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
@@ -67,38 +67,53 @@ static void update_cu_mask(struct mqd_manager *mm, void 
*mqd,
                m->compute_static_thread_mgmt_se3);
 }
 
-static int init_mqd(struct mqd_manager *mm, void **mqd,
-                       struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
-                       struct queue_properties *q)
+static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
+               struct queue_properties *q)
 {
        int retval;
-       uint64_t addr;
-       struct v9_mqd *m;
-       struct kfd_dev *kfd = mm->dev;
+       struct kfd_mem_obj *mqd_mem_obj = NULL;
 
-       *mqd_mem_obj = NULL;
        /* From V9,  for CWSR, the control stack is located on the next page
         * boundary after the mqd, we will use the gtt allocation function
         * instead of sub-allocation function.
         */
        if (kfd->cwsr_enabled && (q->type == KFD_QUEUE_TYPE_COMPUTE)) {
-               *mqd_mem_obj = kzalloc(sizeof(struct kfd_mem_obj), GFP_KERNEL);
-               if (!*mqd_mem_obj)
-                       return -ENOMEM;
+               mqd_mem_obj = kzalloc(sizeof(struct kfd_mem_obj), GFP_NOIO);
+               if (!mqd_mem_obj)
+                       return NULL;
                retval = amdgpu_amdkfd_alloc_gtt_mem(kfd->kgd,
                        ALIGN(q->ctl_stack_size, PAGE_SIZE) +
                                ALIGN(sizeof(struct v9_mqd), PAGE_SIZE),
-                       &((*mqd_mem_obj)->gtt_mem),
-                       &((*mqd_mem_obj)->gpu_addr),
-                       (void *)&((*mqd_mem_obj)->cpu_ptr), true);
-       } else
-               retval = kfd_gtt_sa_allocate(mm->dev, sizeof(struct v9_mqd),
-                               mqd_mem_obj);
+                       &(mqd_mem_obj->gtt_mem),
+                       &(mqd_mem_obj->gpu_addr),
+                       (void *)&(mqd_mem_obj->cpu_ptr), true);
+       } else {
+               retval = kfd_gtt_sa_allocate(kfd, sizeof(struct v9_mqd),
+                               &mqd_mem_obj);
+       }
+
        if (retval) {
-               kfree(*mqd_mem_obj);
-               return -ENOMEM;
+               kfree(mqd_mem_obj);
+               return NULL;
        }
 
+       return mqd_mem_obj;
+
+}
+
+static int init_mqd(struct mqd_manager *mm, void **mqd,
+                       struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
+                       struct queue_properties *q)
+{
+       int retval;
+       uint64_t addr;
+       struct v9_mqd *m;
+       struct kfd_dev *kfd = mm->dev;
+
+       *mqd_mem_obj = allocate_mqd(kfd, q);
+       if (!*mqd_mem_obj)
+               return -ENOMEM;
+
        m = (struct v9_mqd *) (*mqd_mem_obj)->cpu_ptr;
        addr = (*mqd_mem_obj)->gpu_addr;
 
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
index ad9dc9a678f2..3296ffbde6ac 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
@@ -68,6 +68,18 @@ static void update_cu_mask(struct mqd_manager *mm, void *mqd,
                m->compute_static_thread_mgmt_se3);
 }
 
+static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
+                                       struct queue_properties *q)
+{
+       struct kfd_mem_obj *mqd_mem_obj;
+
+       if (kfd_gtt_sa_allocate(kfd, sizeof(struct vi_mqd),
+                       &mqd_mem_obj))
+               return NULL;
+
+       return mqd_mem_obj;
+}
+
 static int init_mqd(struct mqd_manager *mm, void **mqd,
                        struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
                        struct queue_properties *q)
@@ -75,10 +87,10 @@ static int init_mqd(struct mqd_manager *mm, void **mqd,
        int retval;
        uint64_t addr;
        struct vi_mqd *m;
+       struct kfd_dev *kfd = mm->dev;
 
-       retval = kfd_gtt_sa_allocate(mm->dev, sizeof(struct vi_mqd),
-                       mqd_mem_obj);
-       if (retval != 0)
+       *mqd_mem_obj = allocate_mqd(kfd, q);
+       if (!*mqd_mem_obj)
                return -ENOMEM;
 
        m = (struct vi_mqd *) (*mqd_mem_obj)->cpu_ptr;
-- 
2.17.1

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to