]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
drm/amdkfd: Separate mqd allocation and initialization
authorOak Zeng <Oak.Zeng@amd.com>
Tue, 4 Jun 2019 02:25:52 +0000 (21:25 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 11 Jun 2019 17:56:59 +0000 (12:56 -0500)
Introduce a new mqd allocation interface and split the original
init_mqd function into two functions: allocate_mqd and init_mqd.
Also renamed uninit_mqd to free_mqd. This is preparation work to
fix a circular lock dependency.

Signed-off-by: Oak Zeng <Oak.Zeng@amd.com>
Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
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 3c042ebdf182d1ed3509f0e93df916ffba451710..e5b3fb9a5ac70b9b1692439deb48b88716e61c19 100644 (file)
@@ -319,11 +319,13 @@ static int create_queue_nocpsch(struct device_queue_manager *dqm,
        if (retval)
                goto out_deallocate_hqd;
 
-       retval = mqd_mgr->init_mqd(mqd_mgr, &q->mqd, &q->mqd_mem_obj,
-                               &q->gart_mqd_addr, &q->properties);
-       if (retval)
+       q->mqd_mem_obj = mqd_mgr->allocate_mqd(mqd_mgr->dev, &q->properties);
+       if (!q->mqd_mem_obj) {
+               retval = -ENOMEM;
                goto out_deallocate_doorbell;
-
+       }
+       mqd_mgr->init_mqd(mqd_mgr, &q->mqd, q->mqd_mem_obj,
+                               &q->gart_mqd_addr, &q->properties);
        if (q->properties.is_active) {
 
                if (WARN(q->process->mm != current->mm,
@@ -333,7 +335,7 @@ static int create_queue_nocpsch(struct device_queue_manager *dqm,
                        retval = mqd_mgr->load_mqd(mqd_mgr, q->mqd, q->pipe,
                                        q->queue, &q->properties, current->mm);
                if (retval)
-                       goto out_uninit_mqd;
+                       goto out_free_mqd;
        }
 
        list_add(&q->list, &qpd->queues_list);
@@ -355,8 +357,8 @@ static int create_queue_nocpsch(struct device_queue_manager *dqm,
                        dqm->total_queue_count);
        goto out_unlock;
 
-out_uninit_mqd:
-       mqd_mgr->uninit_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
+out_free_mqd:
+       mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
 out_deallocate_doorbell:
        deallocate_doorbell(qpd, q);
 out_deallocate_hqd:
@@ -450,7 +452,7 @@ static int destroy_queue_nocpsch_locked(struct device_queue_manager *dqm,
        if (retval == -ETIME)
                qpd->reset_wavefronts = true;
 
-       mqd_mgr->uninit_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
+       mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
 
        list_del(&q->list);
        if (list_empty(&qpd->queues_list)) {
@@ -489,7 +491,7 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm,
 
 static int update_queue(struct device_queue_manager *dqm, struct queue *q)
 {
-       int retval;
+       int retval = 0;
        struct mqd_manager *mqd_mgr;
        struct kfd_process_device *pdd;
        bool prev_active = false;
@@ -527,7 +529,7 @@ static int update_queue(struct device_queue_manager *dqm, struct queue *q)
                }
        }
 
-       retval = mqd_mgr->update_mqd(mqd_mgr, q->mqd, &q->properties);
+       mqd_mgr->update_mqd(mqd_mgr, q->mqd, &q->properties);
 
        /*
         * check active state vs. the previous state and modify
@@ -1160,11 +1162,13 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,
                dqm->asic_ops.init_sdma_vm(dqm, q, qpd);
        q->properties.tba_addr = qpd->tba_addr;
        q->properties.tma_addr = qpd->tma_addr;
-       retval = mqd_mgr->init_mqd(mqd_mgr, &q->mqd, &q->mqd_mem_obj,
-                               &q->gart_mqd_addr, &q->properties);
-       if (retval)
+       q->mqd_mem_obj = mqd_mgr->allocate_mqd(mqd_mgr->dev, &q->properties);
+       if (!q->mqd_mem_obj) {
+               retval = -ENOMEM;
                goto out_deallocate_doorbell;
-
+       }
+       mqd_mgr->init_mqd(mqd_mgr, &q->mqd, q->mqd_mem_obj,
+                               &q->gart_mqd_addr, &q->properties);
        dqm_lock(dqm);
 
        list_add(&q->list, &qpd->queues_list);
@@ -1373,8 +1377,8 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm,
 
        dqm_unlock(dqm);
 
-       /* Do uninit_mqd after dqm_unlock(dqm) to avoid circular locking */
-       mqd_mgr->uninit_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
+       /* Do free_mqd after dqm_unlock(dqm) to avoid circular locking */
+       mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
 
        return retval;
 
@@ -1615,14 +1619,14 @@ static int process_termination_cpsch(struct device_queue_manager *dqm,
                kfd_dec_compute_active(dqm->dev);
 
        /* Lastly, free mqd resources.
-        * Do uninit_mqd() after dqm_unlock to avoid circular locking.
+        * Do free_mqd() after dqm_unlock to avoid circular locking.
         */
        list_for_each_entry_safe(q, next, &qpd->queues_list, list) {
                mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type(
                                q->properties.type)];
                list_del(&q->list);
                qpd->queue_count--;
-               mqd_mgr->uninit_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
+               mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
        }
 
        return retval;
index 1cc03b3ddbb9c708e5a42fc7955eec6ec9aa3be8..229500c8c958c3f675643fdc437fa87dddb8dfa7 100644 (file)
@@ -132,13 +132,14 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev,
        kq->queue->device = dev;
        kq->queue->process = kfd_get_process(current);
 
-       retval = kq->mqd_mgr->init_mqd(kq->mqd_mgr, &kq->queue->mqd,
-                                       &kq->queue->mqd_mem_obj,
+       kq->queue->mqd_mem_obj = kq->mqd_mgr->allocate_mqd(kq->mqd_mgr->dev,
+                                       &kq->queue->properties);
+       if (!kq->queue->mqd_mem_obj)
+               goto err_allocate_mqd;
+       kq->mqd_mgr->init_mqd(kq->mqd_mgr, &kq->queue->mqd,
+                                       kq->queue->mqd_mem_obj,
                                        &kq->queue->gart_mqd_addr,
                                        &kq->queue->properties);
-       if (retval != 0)
-               goto err_init_mqd;
-
        /* assign HIQ to HQD */
        if (type == KFD_QUEUE_TYPE_HIQ) {
                pr_debug("Assigning hiq to hqd\n");
@@ -164,7 +165,8 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev,
 
        return true;
 err_alloc_fence:
-err_init_mqd:
+       kq->mqd_mgr->free_mqd(kq->mqd_mgr, kq->queue->mqd, kq->queue->mqd_mem_obj);
+err_allocate_mqd:
        uninit_queue(kq->queue);
 err_init_queue:
        kfd_gtt_sa_free(dev, kq->wptr_mem);
@@ -193,7 +195,7 @@ static void uninitialize(struct kernel_queue *kq)
        else if (kq->queue->properties.type == KFD_QUEUE_TYPE_DIQ)
                kfd_gtt_sa_free(kq->dev, kq->fence_mem_obj);
 
-       kq->mqd_mgr->uninit_mqd(kq->mqd_mgr, kq->queue->mqd,
+       kq->mqd_mgr->free_mqd(kq->mqd_mgr, kq->queue->mqd,
                                kq->queue->mqd_mem_obj);
 
        kfd_gtt_sa_free(kq->dev, kq->rptr_mem);
index cc04b362f5101d3081275083e79aba1f37434fa5..d6cf391da5914ee2675a52ed1148bc4b8ea8ebac 100644 (file)
@@ -45,7 +45,7 @@ int pipe_priority_map[] = {
        KFD_PIPE_PRIORITY_CS_HIGH
 };
 
-struct kfd_mem_obj *allocate_hiq_mqd(struct kfd_dev *dev)
+struct kfd_mem_obj *allocate_hiq_mqd(struct kfd_dev *dev, struct queue_properties *q)
 {
        struct kfd_mem_obj *mqd_mem_obj = NULL;
 
@@ -86,7 +86,7 @@ struct kfd_mem_obj *allocate_sdma_mqd(struct kfd_dev *dev,
        return mqd_mem_obj;
 }
 
-void uninit_mqd_hiq_sdma(struct mqd_manager *mm, void *mqd,
+void free_mqd_hiq_sdma(struct mqd_manager *mm, void *mqd,
                        struct kfd_mem_obj *mqd_mem_obj)
 {
        WARN_ON(!mqd_mem_obj->gtt_mem);
index 66b8c67e534096c644e6b5921d54fcae14cb1c9a..550b61e810151687ae40d702dd52a69a3b45a647 100644 (file)
@@ -39,7 +39,7 @@
  * @destroy_mqd: Destroys the HQD slot and by that preempt the relevant queue.
  * Used only for no cp scheduling.
  *
- * @uninit_mqd: Releases the mqd buffer from local gpu memory.
+ * @free_mqd: Releases the mqd buffer from local gpu memory.
  *
  * @is_occupied: Checks if the relevant HQD slot is occupied.
  *
  */
 extern int pipe_priority_map[];
 struct mqd_manager {
-       int     (*init_mqd)(struct mqd_manager *mm, void **mqd,
-                       struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
+       struct kfd_mem_obj*     (*allocate_mqd)(struct kfd_dev *kfd,
+               struct queue_properties *q);
+
+       void    (*init_mqd)(struct mqd_manager *mm, void **mqd,
+                       struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
                        struct queue_properties *q);
 
        int     (*load_mqd)(struct mqd_manager *mm, void *mqd,
@@ -73,7 +76,7 @@ struct mqd_manager {
                                struct queue_properties *p,
                                struct mm_struct *mms);
 
-       int     (*update_mqd)(struct mqd_manager *mm, void *mqd,
+       void    (*update_mqd)(struct mqd_manager *mm, void *mqd,
                                struct queue_properties *q);
 
        int     (*destroy_mqd)(struct mqd_manager *mm, void *mqd,
@@ -81,7 +84,7 @@ struct mqd_manager {
                                unsigned int timeout, uint32_t pipe_id,
                                uint32_t queue_id);
 
-       void    (*uninit_mqd)(struct mqd_manager *mm, void *mqd,
+       void    (*free_mqd)(struct mqd_manager *mm, void *mqd,
                                struct kfd_mem_obj *mqd_mem_obj);
 
        bool    (*is_occupied)(struct mqd_manager *mm, void *mqd,
@@ -102,11 +105,12 @@ struct mqd_manager {
        uint32_t mqd_size;
 };
 
-struct kfd_mem_obj *allocate_hiq_mqd(struct kfd_dev *dev);
+struct kfd_mem_obj *allocate_hiq_mqd(struct kfd_dev *dev,
+                               struct queue_properties *q);
 
 struct kfd_mem_obj *allocate_sdma_mqd(struct kfd_dev *dev,
                                        struct queue_properties *q);
-void uninit_mqd_hiq_sdma(struct mqd_manager *mm, void *mqd,
+void free_mqd_hiq_sdma(struct mqd_manager *mm, void *mqd,
                                struct kfd_mem_obj *mqd_mem_obj);
 
 void mqd_symmetrically_map_cu_mask(struct mqd_manager *mm,
index e911438d76b336a251a21e21cba265f8f622a73a..28876aceb14be6b7f24a37ffe733643515965e0b 100644 (file)
@@ -77,9 +77,6 @@ static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
 {
        struct kfd_mem_obj *mqd_mem_obj;
 
-       if (q->type == KFD_QUEUE_TYPE_HIQ)
-               return allocate_hiq_mqd(kfd);
-
        if (kfd_gtt_sa_allocate(kfd, sizeof(struct cik_mqd),
                        &mqd_mem_obj))
                return NULL;
@@ -87,21 +84,15 @@ static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
        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,
+static void init_mqd(struct mqd_manager *mm, void **mqd,
+               struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
                struct queue_properties *q)
 {
        uint64_t addr;
        struct cik_mqd *m;
-       int retval;
-       struct kfd_dev *kfd = mm->dev;
-
-       *mqd_mem_obj = allocate_mqd(kfd, q);
-       if (!*mqd_mem_obj)
-               return -ENOMEM;
 
-       m = (struct cik_mqd *) (*mqd_mem_obj)->cpu_ptr;
-       addr = (*mqd_mem_obj)->gpu_addr;
+       m = (struct cik_mqd *) mqd_mem_obj->cpu_ptr;
+       addr = mqd_mem_obj->gpu_addr;
 
        memset(m, 0, ALIGN(sizeof(struct cik_mqd), 256));
 
@@ -144,37 +135,27 @@ static int init_mqd(struct mqd_manager *mm, void **mqd,
        *mqd = m;
        if (gart_addr)
                *gart_addr = addr;
-       retval = mm->update_mqd(mm, m, q);
-
-       return retval;
+       mm->update_mqd(mm, m, q);
 }
 
-static int init_mqd_sdma(struct mqd_manager *mm, void **mqd,
-                       struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
+static void init_mqd_sdma(struct mqd_manager *mm, void **mqd,
+                       struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
                        struct queue_properties *q)
 {
-       int retval;
        struct cik_sdma_rlc_registers *m;
-       struct kfd_dev *dev = mm->dev;
 
-       *mqd_mem_obj = allocate_sdma_mqd(dev, q);
-       if (!*mqd_mem_obj)
-               return -ENOMEM;
-
-       m = (struct cik_sdma_rlc_registers *) (*mqd_mem_obj)->cpu_ptr;
+       m = (struct cik_sdma_rlc_registers *) mqd_mem_obj->cpu_ptr;
 
        memset(m, 0, sizeof(struct cik_sdma_rlc_registers));
 
        *mqd = m;
        if (gart_addr)
-               *gart_addr = (*mqd_mem_obj)->gpu_addr;
-
-       retval = mm->update_mqd(mm, m, q);
+               *gart_addr = mqd_mem_obj->gpu_addr;
 
-       return retval;
+       mm->update_mqd(mm, m, q);
 }
 
-static void uninit_mqd(struct mqd_manager *mm, void *mqd,
+static void free_mqd(struct mqd_manager *mm, void *mqd,
                        struct kfd_mem_obj *mqd_mem_obj)
 {
        kfd_gtt_sa_free(mm->dev, mqd_mem_obj);
@@ -203,7 +184,7 @@ static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
                                               mms);
 }
 
-static int __update_mqd(struct mqd_manager *mm, void *mqd,
+static void __update_mqd(struct mqd_manager *mm, void *mqd,
                        struct queue_properties *q, unsigned int atc_bit)
 {
        struct cik_mqd *m;
@@ -237,23 +218,21 @@ static int __update_mqd(struct mqd_manager *mm, void *mqd,
        set_priority(m, q);
 
        q->is_active = QUEUE_IS_ACTIVE(*q);
-
-       return 0;
 }
 
-static int update_mqd(struct mqd_manager *mm, void *mqd,
+static void update_mqd(struct mqd_manager *mm, void *mqd,
                        struct queue_properties *q)
 {
-       return __update_mqd(mm, mqd, q, 1);
+       __update_mqd(mm, mqd, q, 1);
 }
 
-static int update_mqd_hawaii(struct mqd_manager *mm, void *mqd,
+static void update_mqd_hawaii(struct mqd_manager *mm, void *mqd,
                        struct queue_properties *q)
 {
-       return __update_mqd(mm, mqd, q, 0);
+       __update_mqd(mm, mqd, q, 0);
 }
 
-static int update_mqd_sdma(struct mqd_manager *mm, void *mqd,
+static void update_mqd_sdma(struct mqd_manager *mm, void *mqd,
                                struct queue_properties *q)
 {
        struct cik_sdma_rlc_registers *m;
@@ -278,8 +257,6 @@ static int update_mqd_sdma(struct mqd_manager *mm, void *mqd,
        m->sdma_queue_id = q->sdma_queue_id;
 
        q->is_active = QUEUE_IS_ACTIVE(*q);
-
-       return 0;
 }
 
 static int destroy_mqd(struct mqd_manager *mm, void *mqd,
@@ -326,14 +303,14 @@ static bool is_occupied_sdma(struct mqd_manager *mm, void *mqd,
  * queues but with different initial values.
  */
 
-static int init_mqd_hiq(struct mqd_manager *mm, void **mqd,
-               struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
+static void init_mqd_hiq(struct mqd_manager *mm, void **mqd,
+               struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
                struct queue_properties *q)
 {
-       return init_mqd(mm, mqd, mqd_mem_obj, gart_addr, q);
+       init_mqd(mm, mqd, mqd_mem_obj, gart_addr, q);
 }
 
-static int update_mqd_hiq(struct mqd_manager *mm, void *mqd,
+static void update_mqd_hiq(struct mqd_manager *mm, void *mqd,
                                struct queue_properties *q)
 {
        struct cik_mqd *m;
@@ -360,7 +337,6 @@ static int update_mqd_hiq(struct mqd_manager *mm, void *mqd,
        q->is_active = QUEUE_IS_ACTIVE(*q);
 
        set_priority(m, q);
-       return 0;
 }
 
 #if defined(CONFIG_DEBUG_FS)
@@ -399,8 +375,9 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,
        switch (type) {
        case KFD_MQD_TYPE_CP:
        case KFD_MQD_TYPE_COMPUTE:
+               mqd->allocate_mqd = allocate_mqd;
                mqd->init_mqd = init_mqd;
-               mqd->uninit_mqd = uninit_mqd;
+               mqd->free_mqd = free_mqd;
                mqd->load_mqd = load_mqd;
                mqd->update_mqd = update_mqd;
                mqd->destroy_mqd = destroy_mqd;
@@ -411,8 +388,9 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,
 #endif
                break;
        case KFD_MQD_TYPE_HIQ:
+               mqd->allocate_mqd = allocate_hiq_mqd;
                mqd->init_mqd = init_mqd_hiq;
-               mqd->uninit_mqd = uninit_mqd_hiq_sdma;
+               mqd->free_mqd = free_mqd_hiq_sdma;
                mqd->load_mqd = load_mqd;
                mqd->update_mqd = update_mqd_hiq;
                mqd->destroy_mqd = destroy_mqd;
@@ -423,8 +401,9 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,
 #endif
                break;
        case KFD_MQD_TYPE_DIQ:
+               mqd->allocate_mqd = allocate_hiq_mqd;
                mqd->init_mqd = init_mqd_hiq;
-               mqd->uninit_mqd = uninit_mqd;
+               mqd->free_mqd = free_mqd;
                mqd->load_mqd = load_mqd;
                mqd->update_mqd = update_mqd_hiq;
                mqd->destroy_mqd = destroy_mqd;
@@ -435,8 +414,9 @@ struct mqd_manager *mqd_manager_init_cik(enum KFD_MQD_TYPE type,
 #endif
                break;
        case KFD_MQD_TYPE_SDMA:
+               mqd->allocate_mqd = allocate_sdma_mqd;
                mqd->init_mqd = init_mqd_sdma;
-               mqd->uninit_mqd = uninit_mqd_hiq_sdma;
+               mqd->free_mqd = free_mqd_hiq_sdma;
                mqd->load_mqd = load_mqd_sdma;
                mqd->update_mqd = update_mqd_sdma;
                mqd->destroy_mqd = destroy_mqd_sdma;
index 818944b52e11905b7852db6ce89ae3c2c8d65571..0c58f91b3ff3c494753f0f49d43765577c2e8b12 100644 (file)
@@ -79,9 +79,6 @@ static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
        int retval;
        struct kfd_mem_obj *mqd_mem_obj = NULL;
 
-       if (q->type == KFD_QUEUE_TYPE_HIQ)
-               return allocate_hiq_mqd(kfd);
-
        /* 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.
@@ -110,21 +107,15 @@ static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
 
 }
 
-static int init_mqd(struct mqd_manager *mm, void **mqd,
-                       struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
+static void 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;
+       m = (struct v9_mqd *) mqd_mem_obj->cpu_ptr;
+       addr = mqd_mem_obj->gpu_addr;
 
        memset(m, 0, sizeof(struct v9_mqd));
 
@@ -173,9 +164,7 @@ static int init_mqd(struct mqd_manager *mm, void **mqd,
        *mqd = m;
        if (gart_addr)
                *gart_addr = addr;
-       retval = mm->update_mqd(mm, m, q);
-
-       return retval;
+       mm->update_mqd(mm, m, q);
 }
 
 static int load_mqd(struct mqd_manager *mm, void *mqd,
@@ -190,7 +179,7 @@ static int load_mqd(struct mqd_manager *mm, void *mqd,
                                          wptr_shift, 0, mms);
 }
 
-static int update_mqd(struct mqd_manager *mm, void *mqd,
+static void update_mqd(struct mqd_manager *mm, void *mqd,
                      struct queue_properties *q)
 {
        struct v9_mqd *m;
@@ -252,8 +241,6 @@ static int update_mqd(struct mqd_manager *mm, void *mqd,
        set_priority(m, q);
 
        q->is_active = QUEUE_IS_ACTIVE(*q);
-
-       return 0;
 }
 
 
@@ -267,7 +254,7 @@ static int destroy_mqd(struct mqd_manager *mm, void *mqd,
                pipe_id, queue_id);
 }
 
-static void uninit_mqd(struct mqd_manager *mm, void *mqd,
+static void free_mqd(struct mqd_manager *mm, void *mqd,
                        struct kfd_mem_obj *mqd_mem_obj)
 {
        struct kfd_dev *kfd = mm->dev;
@@ -311,62 +298,47 @@ static int get_wave_state(struct mqd_manager *mm, void *mqd,
        return 0;
 }
 
-static int init_mqd_hiq(struct mqd_manager *mm, void **mqd,
-                       struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
+static void init_mqd_hiq(struct mqd_manager *mm, void **mqd,
+                       struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
                        struct queue_properties *q)
 {
        struct v9_mqd *m;
-       int retval = init_mqd(mm, mqd, mqd_mem_obj, gart_addr, q);
 
-       if (retval != 0)
-               return retval;
+       init_mqd(mm, mqd, mqd_mem_obj, gart_addr, q);
 
        m = get_mqd(*mqd);
 
        m->cp_hqd_pq_control |= 1 << CP_HQD_PQ_CONTROL__PRIV_STATE__SHIFT |
                        1 << CP_HQD_PQ_CONTROL__KMD_QUEUE__SHIFT;
-
-       return retval;
 }
 
-static int update_mqd_hiq(struct mqd_manager *mm, void *mqd,
+static void update_mqd_hiq(struct mqd_manager *mm, void *mqd,
                        struct queue_properties *q)
 {
        struct v9_mqd *m;
-       int retval = update_mqd(mm, mqd, q);
 
-       if (retval != 0)
-               return retval;
+       update_mqd(mm, mqd, q);
 
        /* TODO: what's the point? update_mqd already does this. */
        m = get_mqd(mqd);
        m->cp_hqd_vmid = q->vmid;
-       return retval;
 }
 
-static int init_mqd_sdma(struct mqd_manager *mm, void **mqd,
-               struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
+static void init_mqd_sdma(struct mqd_manager *mm, void **mqd,
+               struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
                struct queue_properties *q)
 {
-       int retval;
        struct v9_sdma_mqd *m;
-       struct kfd_dev *dev = mm->dev;
-
-       *mqd_mem_obj = allocate_sdma_mqd(dev, q);
-       if (!*mqd_mem_obj)
-               return -ENOMEM;
 
-       m = (struct v9_sdma_mqd *) (*mqd_mem_obj)->cpu_ptr;
+       m = (struct v9_sdma_mqd *) mqd_mem_obj->cpu_ptr;
 
        memset(m, 0, sizeof(struct v9_sdma_mqd));
 
        *mqd = m;
        if (gart_addr)
-               *gart_addr = (*mqd_mem_obj)->gpu_addr;
+               *gart_addr = mqd_mem_obj->gpu_addr;
 
-       retval = mm->update_mqd(mm, m, q);
-
-       return retval;
+       mm->update_mqd(mm, m, q);
 }
 
 static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
@@ -380,7 +352,7 @@ static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
 
 #define SDMA_RLC_DUMMY_DEFAULT 0xf
 
-static int update_mqd_sdma(struct mqd_manager *mm, void *mqd,
+static void update_mqd_sdma(struct mqd_manager *mm, void *mqd,
                struct queue_properties *q)
 {
        struct v9_sdma_mqd *m;
@@ -404,8 +376,6 @@ static int update_mqd_sdma(struct mqd_manager *mm, void *mqd,
        m->sdmax_rlcx_dummy_reg = SDMA_RLC_DUMMY_DEFAULT;
 
        q->is_active = QUEUE_IS_ACTIVE(*q);
-
-       return 0;
 }
 
 /*
@@ -462,8 +432,9 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
        switch (type) {
        case KFD_MQD_TYPE_CP:
        case KFD_MQD_TYPE_COMPUTE:
+               mqd->allocate_mqd = allocate_mqd;
                mqd->init_mqd = init_mqd;
-               mqd->uninit_mqd = uninit_mqd;
+               mqd->free_mqd = free_mqd;
                mqd->load_mqd = load_mqd;
                mqd->update_mqd = update_mqd;
                mqd->destroy_mqd = destroy_mqd;
@@ -475,8 +446,9 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
 #endif
                break;
        case KFD_MQD_TYPE_HIQ:
+               mqd->allocate_mqd = allocate_hiq_mqd;
                mqd->init_mqd = init_mqd_hiq;
-               mqd->uninit_mqd = uninit_mqd_hiq_sdma;
+               mqd->free_mqd = free_mqd_hiq_sdma;
                mqd->load_mqd = load_mqd;
                mqd->update_mqd = update_mqd_hiq;
                mqd->destroy_mqd = destroy_mqd;
@@ -487,8 +459,9 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
 #endif
                break;
        case KFD_MQD_TYPE_DIQ:
+               mqd->allocate_mqd = allocate_hiq_mqd;
                mqd->init_mqd = init_mqd_hiq;
-               mqd->uninit_mqd = uninit_mqd;
+               mqd->free_mqd = free_mqd;
                mqd->load_mqd = load_mqd;
                mqd->update_mqd = update_mqd_hiq;
                mqd->destroy_mqd = destroy_mqd;
@@ -499,8 +472,9 @@ struct mqd_manager *mqd_manager_init_v9(enum KFD_MQD_TYPE type,
 #endif
                break;
        case KFD_MQD_TYPE_SDMA:
+               mqd->allocate_mqd = allocate_sdma_mqd;
                mqd->init_mqd = init_mqd_sdma;
-               mqd->uninit_mqd = uninit_mqd_hiq_sdma;
+               mqd->free_mqd = free_mqd_hiq_sdma;
                mqd->load_mqd = load_mqd_sdma;
                mqd->update_mqd = update_mqd_sdma;
                mqd->destroy_mqd = destroy_mqd_sdma;
index 00e6a59551202fc2450c95ce07f3b313b3d69f91..7d144f56f42159948cd69ee0a4b7000ca512f1d9 100644 (file)
@@ -80,9 +80,6 @@ static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
 {
        struct kfd_mem_obj *mqd_mem_obj;
 
-       if (q->type == KFD_QUEUE_TYPE_HIQ)
-               return allocate_hiq_mqd(kfd);
-
        if (kfd_gtt_sa_allocate(kfd, sizeof(struct vi_mqd),
                        &mqd_mem_obj))
                return NULL;
@@ -90,21 +87,15 @@ static struct kfd_mem_obj *allocate_mqd(struct kfd_dev *kfd,
        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,
+static void 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 vi_mqd *m;
-       struct kfd_dev *kfd = mm->dev;
-
-       *mqd_mem_obj = allocate_mqd(kfd, q);
-       if (!*mqd_mem_obj)
-               return -ENOMEM;
 
-       m = (struct vi_mqd *) (*mqd_mem_obj)->cpu_ptr;
-       addr = (*mqd_mem_obj)->gpu_addr;
+       m = (struct vi_mqd *) mqd_mem_obj->cpu_ptr;
+       addr = mqd_mem_obj->gpu_addr;
 
        memset(m, 0, sizeof(struct vi_mqd));
 
@@ -159,9 +150,7 @@ static int init_mqd(struct mqd_manager *mm, void **mqd,
        *mqd = m;
        if (gart_addr)
                *gart_addr = addr;
-       retval = mm->update_mqd(mm, m, q);
-
-       return retval;
+       mm->update_mqd(mm, m, q);
 }
 
 static int load_mqd(struct mqd_manager *mm, void *mqd,
@@ -177,7 +166,7 @@ static int load_mqd(struct mqd_manager *mm, void *mqd,
                                          wptr_shift, wptr_mask, mms);
 }
 
-static int __update_mqd(struct mqd_manager *mm, void *mqd,
+static void __update_mqd(struct mqd_manager *mm, void *mqd,
                        struct queue_properties *q, unsigned int mtype,
                        unsigned int atc_bit)
 {
@@ -245,21 +234,19 @@ static int __update_mqd(struct mqd_manager *mm, void *mqd,
        set_priority(m, q);
 
        q->is_active = QUEUE_IS_ACTIVE(*q);
-
-       return 0;
 }
 
 
-static int update_mqd(struct mqd_manager *mm, void *mqd,
+static void update_mqd(struct mqd_manager *mm, void *mqd,
                        struct queue_properties *q)
 {
-       return __update_mqd(mm, mqd, q, MTYPE_CC, 1);
+       __update_mqd(mm, mqd, q, MTYPE_CC, 1);
 }
 
-static int update_mqd_tonga(struct mqd_manager *mm, void *mqd,
+static void update_mqd_tonga(struct mqd_manager *mm, void *mqd,
                        struct queue_properties *q)
 {
-       return __update_mqd(mm, mqd, q, MTYPE_UC, 0);
+       __update_mqd(mm, mqd, q, MTYPE_UC, 0);
 }
 
 static int destroy_mqd(struct mqd_manager *mm, void *mqd,
@@ -272,7 +259,7 @@ static int destroy_mqd(struct mqd_manager *mm, void *mqd,
                pipe_id, queue_id);
 }
 
-static void uninit_mqd(struct mqd_manager *mm, void *mqd,
+static void free_mqd(struct mqd_manager *mm, void *mqd,
                        struct kfd_mem_obj *mqd_mem_obj)
 {
        kfd_gtt_sa_free(mm->dev, mqd_mem_obj);
@@ -309,61 +296,44 @@ static int get_wave_state(struct mqd_manager *mm, void *mqd,
        return 0;
 }
 
-static int init_mqd_hiq(struct mqd_manager *mm, void **mqd,
-                       struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
+static void init_mqd_hiq(struct mqd_manager *mm, void **mqd,
+                       struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
                        struct queue_properties *q)
 {
        struct vi_mqd *m;
-       int retval = init_mqd(mm, mqd, mqd_mem_obj, gart_addr, q);
-
-       if (retval != 0)
-               return retval;
+       init_mqd(mm, mqd, mqd_mem_obj, gart_addr, q);
 
        m = get_mqd(*mqd);
 
        m->cp_hqd_pq_control |= 1 << CP_HQD_PQ_CONTROL__PRIV_STATE__SHIFT |
                        1 << CP_HQD_PQ_CONTROL__KMD_QUEUE__SHIFT;
-
-       return retval;
 }
 
-static int update_mqd_hiq(struct mqd_manager *mm, void *mqd,
+static void update_mqd_hiq(struct mqd_manager *mm, void *mqd,
                        struct queue_properties *q)
 {
        struct vi_mqd *m;
-       int retval = __update_mqd(mm, mqd, q, MTYPE_UC, 0);
-
-       if (retval != 0)
-               return retval;
+       __update_mqd(mm, mqd, q, MTYPE_UC, 0);
 
        m = get_mqd(mqd);
        m->cp_hqd_vmid = q->vmid;
-       return retval;
 }
 
-static int init_mqd_sdma(struct mqd_manager *mm, void **mqd,
-               struct kfd_mem_obj **mqd_mem_obj, uint64_t *gart_addr,
+static void init_mqd_sdma(struct mqd_manager *mm, void **mqd,
+               struct kfd_mem_obj *mqd_mem_obj, uint64_t *gart_addr,
                struct queue_properties *q)
 {
-       int retval;
        struct vi_sdma_mqd *m;
-       struct kfd_dev *dev = mm->dev;
-
-       *mqd_mem_obj = allocate_sdma_mqd(dev, q);
-       if (!*mqd_mem_obj)
-               return -ENOMEM;
 
-       m = (struct vi_sdma_mqd *) (*mqd_mem_obj)->cpu_ptr;
+       m = (struct vi_sdma_mqd *) mqd_mem_obj->cpu_ptr;
 
        memset(m, 0, sizeof(struct vi_sdma_mqd));
 
        *mqd = m;
        if (gart_addr)
-               *gart_addr = (*mqd_mem_obj)->gpu_addr;
+               *gart_addr = mqd_mem_obj->gpu_addr;
 
-       retval = mm->update_mqd(mm, m, q);
-
-       return retval;
+       mm->update_mqd(mm, m, q);
 }
 
 static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
@@ -375,7 +345,7 @@ static int load_mqd_sdma(struct mqd_manager *mm, void *mqd,
                                               mms);
 }
 
-static int update_mqd_sdma(struct mqd_manager *mm, void *mqd,
+static void update_mqd_sdma(struct mqd_manager *mm, void *mqd,
                struct queue_properties *q)
 {
        struct vi_sdma_mqd *m;
@@ -400,8 +370,6 @@ static int update_mqd_sdma(struct mqd_manager *mm, void *mqd,
        m->sdma_queue_id = q->sdma_queue_id;
 
        q->is_active = QUEUE_IS_ACTIVE(*q);
-
-       return 0;
 }
 
 /*
@@ -458,8 +426,9 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,
        switch (type) {
        case KFD_MQD_TYPE_CP:
        case KFD_MQD_TYPE_COMPUTE:
+               mqd->allocate_mqd = allocate_mqd;
                mqd->init_mqd = init_mqd;
-               mqd->uninit_mqd = uninit_mqd;
+               mqd->free_mqd = free_mqd;
                mqd->load_mqd = load_mqd;
                mqd->update_mqd = update_mqd;
                mqd->destroy_mqd = destroy_mqd;
@@ -471,8 +440,9 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,
 #endif
                break;
        case KFD_MQD_TYPE_HIQ:
+               mqd->allocate_mqd = allocate_hiq_mqd;
                mqd->init_mqd = init_mqd_hiq;
-               mqd->uninit_mqd = uninit_mqd_hiq_sdma;
+               mqd->free_mqd = free_mqd_hiq_sdma;
                mqd->load_mqd = load_mqd;
                mqd->update_mqd = update_mqd_hiq;
                mqd->destroy_mqd = destroy_mqd;
@@ -483,8 +453,9 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,
 #endif
                break;
        case KFD_MQD_TYPE_DIQ:
+               mqd->allocate_mqd = allocate_hiq_mqd;
                mqd->init_mqd = init_mqd_hiq;
-               mqd->uninit_mqd = uninit_mqd;
+               mqd->free_mqd = free_mqd;
                mqd->load_mqd = load_mqd;
                mqd->update_mqd = update_mqd_hiq;
                mqd->destroy_mqd = destroy_mqd;
@@ -495,8 +466,9 @@ struct mqd_manager *mqd_manager_init_vi(enum KFD_MQD_TYPE type,
 #endif
                break;
        case KFD_MQD_TYPE_SDMA:
+               mqd->allocate_mqd = allocate_sdma_mqd;
                mqd->init_mqd = init_mqd_sdma;
-               mqd->uninit_mqd = uninit_mqd_hiq_sdma;
+               mqd->free_mqd = free_mqd_hiq_sdma;
                mqd->load_mqd = load_mqd_sdma;
                mqd->update_mqd = update_mqd_sdma;
                mqd->destroy_mqd = destroy_mqd_sdma;