aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorshaoyunl <Shaoyun.Liu@amd.com>2017-09-27 00:09:56 -0400
committerOded Gabbay <oded.gabbay@gmail.com>2017-09-27 00:09:56 -0400
commite139cd2a2ff842bd4a5d089b9d251ca62f58ecac (patch)
treeed0d1cd3f936217993e400db36b05fb37f8ee61d
parent36c2d7eb5e99a4d765b1ec241823d563c71b1125 (diff)
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>
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c29
-rw-r--r--drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c2
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 c0685cd64d12..da3b74315acf 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,
622 if (retval) 622 if (retval)
623 return retval; 623 return retval;
624 624
625 q->properties.sdma_queue_id = q->sdma_id % CIK_SDMA_QUEUES_PER_ENGINE; 625 q->properties.sdma_queue_id = q->sdma_id / CIK_SDMA_QUEUES_PER_ENGINE;
626 q->properties.sdma_engine_id = q->sdma_id / CIK_SDMA_ENGINE_NUM; 626 q->properties.sdma_engine_id = q->sdma_id % CIK_SDMA_QUEUES_PER_ENGINE;
627 627
628 pr_debug("SDMA id is: %d\n", q->sdma_id); 628 pr_debug("SDMA id is: %d\n", q->sdma_id);
629 pr_debug("SDMA queue id: %d\n", q->properties.sdma_queue_id); 629 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)
705 dqm->queue_count = dqm->processes_count = 0; 705 dqm->queue_count = dqm->processes_count = 0;
706 dqm->sdma_queue_count = 0; 706 dqm->sdma_queue_count = 0;
707 dqm->active_runlist = false; 707 dqm->active_runlist = false;
708 dqm->sdma_bitmap = (1 << CIK_SDMA_QUEUES) - 1;
708 retval = dqm->ops_asic_specific.initialize(dqm); 709 retval = dqm->ops_asic_specific.initialize(dqm);
709 if (retval) 710 if (retval)
710 mutex_destroy(&dqm->lock); 711 mutex_destroy(&dqm->lock);
@@ -812,14 +813,6 @@ static void destroy_kernel_queue_cpsch(struct device_queue_manager *dqm,
812 mutex_unlock(&dqm->lock); 813 mutex_unlock(&dqm->lock);
813} 814}
814 815
815static void select_sdma_engine_id(struct queue *q)
816{
817 static int sdma_id;
818
819 q->sdma_id = sdma_id;
820 sdma_id = (sdma_id + 1) % 2;
821}
822
823static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q, 816static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,
824 struct qcm_process_device *qpd, int *allocate_vmid) 817 struct qcm_process_device *qpd, int *allocate_vmid)
825{ 818{
@@ -840,9 +833,15 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,
840 goto out; 833 goto out;
841 } 834 }
842 835
843 if (q->properties.type == KFD_QUEUE_TYPE_SDMA) 836 if (q->properties.type == KFD_QUEUE_TYPE_SDMA) {
844 select_sdma_engine_id(q); 837 retval = allocate_sdma_queue(dqm, &q->sdma_id);
845 838 if (retval != 0)
839 goto out;
840 q->properties.sdma_queue_id =
841 q->sdma_id / CIK_SDMA_QUEUES_PER_ENGINE;
842 q->properties.sdma_engine_id =
843 q->sdma_id % CIK_SDMA_QUEUES_PER_ENGINE;
844 }
846 mqd = dqm->ops.get_mqd_manager(dqm, 845 mqd = dqm->ops.get_mqd_manager(dqm,
847 get_mqd_type_from_queue_type(q->properties.type)); 846 get_mqd_type_from_queue_type(q->properties.type));
848 847
@@ -1013,8 +1012,10 @@ static int destroy_queue_cpsch(struct device_queue_manager *dqm,
1013 goto failed; 1012 goto failed;
1014 } 1013 }
1015 1014
1016 if (q->properties.type == KFD_QUEUE_TYPE_SDMA) 1015 if (q->properties.type == KFD_QUEUE_TYPE_SDMA) {
1017 dqm->sdma_queue_count--; 1016 dqm->sdma_queue_count--;
1017 deallocate_sdma_queue(dqm, q->sdma_id);
1018 }
1018 1019
1019 list_del(&q->list); 1020 list_del(&q->list);
1020 qpd->queue_count--; 1021 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 5d1770e577e9..16da8ad02d8b 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,
203 queue_type__mes_map_queues__debug_interface_queue_vi; 203 queue_type__mes_map_queues__debug_interface_queue_vi;
204 break; 204 break;
205 case KFD_QUEUE_TYPE_SDMA: 205 case KFD_QUEUE_TYPE_SDMA:
206 packet->bitfields2.engine_sel = 206 packet->bitfields2.engine_sel = q->properties.sdma_engine_id +
207 engine_sel__mes_map_queues__sdma0_vi; 207 engine_sel__mes_map_queues__sdma0_vi;
208 use_static = false; /* no static queues under SDMA */ 208 use_static = false; /* no static queues under SDMA */
209 break; 209 break;