diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/2748-drm-amdkfd-Fix-sdma-queue-map-issue.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/2748-drm-amdkfd-Fix-sdma-queue-map-issue.patch | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/2748-drm-amdkfd-Fix-sdma-queue-map-issue.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/2748-drm-amdkfd-Fix-sdma-queue-map-issue.patch new file mode 100644 index 00000000..6beea56e --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/2748-drm-amdkfd-Fix-sdma-queue-map-issue.patch @@ -0,0 +1,59 @@ +From e1dd87d6f8de87f0dc4763b0403399761c321b6c Mon Sep 17 00:00:00 2001 +From: Oak Zeng <Oak.Zeng@amd.com> +Date: Fri, 8 Feb 2019 15:44:35 -0600 +Subject: [PATCH 2748/2940] drm/amdkfd: Fix sdma queue map issue + +Previous codes assumes there are two sdma engines. +This is not true e.g., Raven only has 1 SDMA engine. +Fix the issue by using sdma engine number info in +device_info. + +Change-Id: I4d8ee894a8525956cfb11973ffe73631b28266e0 +Signed-off-by: Oak Zeng <Oak.Zeng@amd.com> +--- + .../drm/amd/amdkfd/kfd_device_queue_manager.c | 21 +++++++++++-------- + 1 file changed, 12 insertions(+), 9 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 4ef0017259d5..805bb0f0e591 100644 +--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c ++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c +@@ -1246,12 +1246,17 @@ int amdkfd_fence_wait_timeout(unsigned int *fence_addr, + return 0; + } + +-static int unmap_sdma_queues(struct device_queue_manager *dqm, +- unsigned int sdma_engine) ++static int unmap_sdma_queues(struct device_queue_manager *dqm) + { +- return pm_send_unmap_queue(&dqm->packets, KFD_QUEUE_TYPE_SDMA, +- KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, false, +- sdma_engine); ++ int i, retval = 0; ++ ++ for (i = 0; i < dqm->dev->device_info->num_sdma_engines; i++) { ++ retval = pm_send_unmap_queue(&dqm->packets, KFD_QUEUE_TYPE_SDMA, ++ KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, false, i); ++ if (retval) ++ return retval; ++ } ++ return retval; + } + + /* dqm->lock mutex has to be locked before calling this function */ +@@ -1290,10 +1295,8 @@ static int unmap_queues_cpsch(struct device_queue_manager *dqm, + pr_debug("Before destroying queues, sdma queue count is : %u\n", + dqm->sdma_queue_count); + +- if (dqm->sdma_queue_count > 0) { +- unmap_sdma_queues(dqm, 0); +- unmap_sdma_queues(dqm, 1); +- } ++ if (dqm->sdma_queue_count > 0) ++ unmap_sdma_queues(dqm); + + retval = pm_send_unmap_queue(&dqm->packets, KFD_QUEUE_TYPE_COMPUTE, + filter, filter_param, false, 0); +-- +2.17.1 + |