diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3361-drm-amdkfd-Improve-multiple-SDMA-queues-support-per-.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3361-drm-amdkfd-Improve-multiple-SDMA-queues-support-per-.patch | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3361-drm-amdkfd-Improve-multiple-SDMA-queues-support-per-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3361-drm-amdkfd-Improve-multiple-SDMA-queues-support-per-.patch new file mode 100644 index 00000000..39ebcc61 --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3361-drm-amdkfd-Improve-multiple-SDMA-queues-support-per-.patch @@ -0,0 +1,106 @@ +From 85be2ca599a4c9de3a9482f6409d15f23b7f9461 Mon Sep 17 00:00:00 2001 +From: shaoyunl <Shaoyun.Liu@amd.com> +Date: Wed, 27 Sep 2017 00:09:56 -0400 +Subject: [PATCH 3361/4131] drm/amdkfd: Improve multiple SDMA queues support + per process + +HWS does not support over-subscription and the scheduler can not internally +modify the engine. Driver needs to program the correct engine ID. + +Fix the queue and engine selection to create queues on alternating SDMA +engines. This allows concurrent bi-directional DMA transfers in a process +that creates two SDMA queues. + +Signed-off-by: shaoyun liu <shaoyun.liu@amd.com> +Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> +Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com> +--- + .../gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 29 +++++++++++----------- + drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c | 2 +- + 2 files changed, 16 insertions(+), 15 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 c0685cd..da3b743 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +@@ -622,8 +622,8 @@ static int create_sdma_queue_nocpsch(struct device_queue_manager *dqm, + if (retval) + return retval; + +- q->properties.sdma_queue_id = q->sdma_id % CIK_SDMA_QUEUES_PER_ENGINE; +- q->properties.sdma_engine_id = q->sdma_id / CIK_SDMA_ENGINE_NUM; ++ q->properties.sdma_queue_id = q->sdma_id / CIK_SDMA_QUEUES_PER_ENGINE; ++ q->properties.sdma_engine_id = q->sdma_id % CIK_SDMA_QUEUES_PER_ENGINE; + + pr_debug("SDMA id is: %d\n", q->sdma_id); + pr_debug("SDMA queue id: %d\n", q->properties.sdma_queue_id); +@@ -705,6 +705,7 @@ static int initialize_cpsch(struct device_queue_manager *dqm) + dqm->queue_count = dqm->processes_count = 0; + dqm->sdma_queue_count = 0; + dqm->active_runlist = false; ++ dqm->sdma_bitmap = (1 << CIK_SDMA_QUEUES) - 1; + retval = dqm->ops_asic_specific.initialize(dqm); + if (retval) + mutex_destroy(&dqm->lock); +@@ -812,14 +813,6 @@ static void destroy_kernel_queue_cpsch(struct device_queue_manager *dqm, + mutex_unlock(&dqm->lock); + } + +-static void select_sdma_engine_id(struct queue *q) +-{ +- static int sdma_id; +- +- q->sdma_id = sdma_id; +- sdma_id = (sdma_id + 1) % 2; +-} +- + static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, + struct qcm_process_device *qpd, int *allocate_vmid) + { +@@ -840,9 +833,15 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, + goto out; + } + +- if (q->properties.type == KFD_QUEUE_TYPE_SDMA) +- select_sdma_engine_id(q); +- ++ if (q->properties.type == KFD_QUEUE_TYPE_SDMA) { ++ retval = allocate_sdma_queue(dqm, &q->sdma_id); ++ if (retval != 0) ++ goto out; ++ q->properties.sdma_queue_id = ++ q->sdma_id / CIK_SDMA_QUEUES_PER_ENGINE; ++ q->properties.sdma_engine_id = ++ q->sdma_id % CIK_SDMA_QUEUES_PER_ENGINE; ++ } + mqd = dqm->ops.get_mqd_manager(dqm, + get_mqd_type_from_queue_type(q->properties.type)); + +@@ -1013,8 +1012,10 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm, + goto failed; + } + +- if (q->properties.type == KFD_QUEUE_TYPE_SDMA) ++ if (q->properties.type == KFD_QUEUE_TYPE_SDMA) { + dqm->sdma_queue_count--; ++ deallocate_sdma_queue(dqm, q->sdma_id); ++ } + + list_del(&q->list); + qpd->queue_count--; +diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c +index 5d1770e..16da8ad 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c +@@ -203,7 +203,7 @@ static int pm_create_map_queue(struct packet_manager *pm, uint32_t *buffer, + queue_type__mes_map_queues__debug_interface_queue_vi; + break; + case KFD_QUEUE_TYPE_SDMA: +- packet->bitfields2.engine_sel = ++ packet->bitfields2.engine_sel = q->properties.sdma_engine_id + + engine_sel__mes_map_queues__sdma0_vi; + use_static = false; /* no static queues under SDMA */ + break; +-- +2.7.4 + |