aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2799-drm-amdkfd-Separate-mqd-allocation-and-initializatio.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2799-drm-amdkfd-Separate-mqd-allocation-and-initializatio.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2799-drm-amdkfd-Separate-mqd-allocation-and-initializatio.patch913
1 files changed, 913 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2799-drm-amdkfd-Separate-mqd-allocation-and-initializatio.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2799-drm-amdkfd-Separate-mqd-allocation-and-initializatio.patch
new file mode 100644
index 00000000..2f0e1d6c
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2799-drm-amdkfd-Separate-mqd-allocation-and-initializatio.patch
@@ -0,0 +1,913 @@
+From 9e97000a29ca81a7f734dd65873f8cf1ebf9ed2b Mon Sep 17 00:00:00 2001
+From: Oak Zeng <Oak.Zeng@amd.com>
+Date: Mon, 3 Jun 2019 21:25:52 -0500
+Subject: [PATCH 2799/2940] drm/amdkfd: Separate mqd allocation and
+ initialization
+
+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.
+
+Change-Id: I22a819b3f4dcb6c92ab9cd33396f5343e2571c7b
+Signed-off-by: Oak Zeng <Oak.Zeng@amd.com>
+Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com>
+---
+ .../drm/amd/amdkfd/kfd_device_queue_manager.c | 40 +++++----
+ drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c | 16 ++--
+ drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c | 4 +-
+ drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h | 18 ++--
+ .../gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c | 79 ++++++-----------
+ .../gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c | 78 ++++++----------
+ .../gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c | 88 +++++++------------
+ 7 files changed, 129 insertions(+), 194 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+index 700b34d6caee..e3af46dcc880 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+@@ -345,11 +345,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,
+@@ -359,7 +361,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);
+@@ -381,8 +383,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:
+@@ -476,7 +478,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)) {
+@@ -515,7 +517,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;
+@@ -553,7 +555,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
+@@ -1239,11 +1241,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);
+@@ -1452,8 +1456,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;
+
+@@ -1679,14 +1683,14 @@ static int process_termination_cpsch(struct device_queue_manager *dqm,
+ dqm_unlock(dqm);
+
+ /* 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;
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
+index ed03d622eb08..c26034993354 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
+@@ -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);
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
+index cc04b362f510..d6cf391da591 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.c
+@@ -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);
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
+index 8a2d4aed39e1..10c2ff1ad683 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager.h
+@@ -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.
+ *
+@@ -64,8 +64,11 @@
+ */
+ 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,
+@@ -104,11 +107,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,
+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 ea42dea790f8..9431dc2ca54b 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_cik.c
+@@ -103,9 +103,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;
+@@ -113,22 +110,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));
+
+@@ -171,37 +161,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);
+@@ -230,7 +210,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;
+@@ -267,23 +247,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;
+@@ -308,8 +286,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,
+@@ -356,14 +332,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;
+@@ -390,7 +366,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)
+@@ -429,8 +404,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;
+@@ -442,8 +418,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;
+@@ -455,8 +432,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;
+@@ -468,8 +446,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;
+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 089df51e0f5e..31c045178065 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_v9.c
+@@ -122,9 +122,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.
+@@ -153,21 +150,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));
+
+@@ -216,9 +207,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,
+@@ -233,7 +222,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;
+@@ -298,8 +287,6 @@ static int update_mqd(struct mqd_manager *mm, void *mqd,
+ set_priority(m, q);
+
+ q->is_active = QUEUE_IS_ACTIVE(*q);
+-
+- return 0;
+ }
+
+
+@@ -313,7 +300,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;
+@@ -396,62 +383,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,
+@@ -465,7 +437,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;
+@@ -489,8 +461,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;
+ }
+
+ /*
+@@ -547,8 +517,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;
+@@ -561,8 +532,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;
+@@ -574,8 +546,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;
+@@ -587,8 +560,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;
+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 da9d965bca26..39c9b470e227 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_mqd_manager_vi.c
+@@ -119,9 +119,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;
+@@ -129,21 +126,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));
+
+@@ -198,9 +189,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,
+@@ -216,7 +205,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)
+ {
+@@ -286,21 +275,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,
+@@ -313,7 +300,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);
+@@ -350,61 +337,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,
+@@ -416,7 +386,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;
+@@ -441,8 +411,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;
+ }
+
+ /*
+@@ -499,8 +467,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;
+@@ -513,8 +482,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;
+@@ -526,8 +496,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;
+@@ -539,8 +510,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;
+--
+2.17.1
+