drm/amdkfd: Move non-sdma mqd allocation out of init_mqd
authorOak Zeng <ozeng@amd.com>
Wed, 28 Nov 2018 04:55:50 +0000 (22:55 -0600)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 24 May 2019 17:21:02 +0000 (12:21 -0500)
This is preparation work to introduce more mqd allocation
scheme

Signed-off-by: Oak Zeng <ozeng@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c

index eec131b801b00c29cdbeab382d844883c4d24fe7..a00402077e34a232da8cba735eb3b195f38d78c5 100644 (file)
@@ -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;
index 15274a880ea2c2f8cb2f407a6e621acf08c0b352..8f8166189fd5ceb72bffb52c17135fb767bc6d45 100644 (file)
@@ -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;
 
index c955680364573066d4ff3a7e4d246db39c955dff..7f0b10e46358b79999a53546de6e6a4480bab0ad 100644 (file)
@@ -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;