aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3361-drm-amdkfd-Improve-multiple-SDMA-queues-support-per-.patch
diff options
context:
space:
mode:
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-.patch106
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
+