diff options
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.patch | 913 |
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 + |