aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/1137-drm-amdkfd-Reset-waves-when-dequeueing-HQD.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/1137-drm-amdkfd-Reset-waves-when-dequeueing-HQD.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/1137-drm-amdkfd-Reset-waves-when-dequeueing-HQD.patch121
1 files changed, 121 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/1137-drm-amdkfd-Reset-waves-when-dequeueing-HQD.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/1137-drm-amdkfd-Reset-waves-when-dequeueing-HQD.patch
new file mode 100644
index 00000000..e5672515
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/1137-drm-amdkfd-Reset-waves-when-dequeueing-HQD.patch
@@ -0,0 +1,121 @@
+From 07fae574d6f75d35d5ad75fd74dc44a07cb5d238 Mon Sep 17 00:00:00 2001
+From: Yong Zhao <yong.zhao@amd.com>
+Date: Fri, 13 May 2016 19:10:52 -0400
+Subject: [PATCH 1137/4131] drm/amdkfd: Reset waves when dequeueing HQD
+
+In SW scheduler mode, DEQUEUE_REQ bit in CP_HQD_DEQUEUE_REQUEST
+should be set as 2 instead of 1 when dequeueing HQD.
+
+Meanwhile, when uninitializing a kernel queue, the incorrect value
+of a parameter in destoy_mqd() would lead to HQD not dequeued
+properly. It is fixed as well in the commit.
+
+Change-Id: I3d2813099f3a39397727eff1dc677539a99dc59d
+Signed-off-by: Yong Zhao <yong.zhao@amd.com>
+
+ Conflicts:
+ drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+ drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
+---
+ drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c | 4 ++--
+ drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h | 5 ++++-
+ drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c | 2 +-
+ drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c | 2 +-
+ drivers/gpu/drm/amd/amdkfd/kfd_priv.h | 8 --------
+ 5 files changed, 8 insertions(+), 13 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 f92c01b..c8fd16c 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
+@@ -350,7 +350,7 @@ static int destroy_queue_nocpsch(struct device_queue_manager *dqm,
+
+ retval = mqd->destroy_mqd(mqd, q->mqd,
+ KFD_PREEMPT_TYPE_WAVEFRONT_RESET,
+- QUEUE_PREEMPT_DEFAULT_TIMEOUT_MS,
++ KFD_HIQ_TIMEOUT,
+ q->pipe, q->queue);
+
+ if (retval != 0)
+@@ -1392,7 +1392,7 @@ static int process_termination_nocpsch(struct device_queue_manager *dqm,
+ dqm->total_queue_count--;
+ mqd->destroy_mqd(mqd, q->mqd,
+ KFD_PREEMPT_TYPE_WAVEFRONT_RESET,
+- QUEUE_PREEMPT_DEFAULT_TIMEOUT_MS,
++ KFD_HIQ_TIMEOUT,
+ q->pipe, q->queue);
+ mqd->uninit_mqd(mqd, q->mqd, q->mqd_mem_obj);
+ if (list_empty(&qpd->queues_list))
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
+index 22bc0b7..97a739a 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
+@@ -29,7 +29,10 @@
+ #include "kfd_priv.h"
+ #include "kfd_mqd_manager.h"
+
+-#define QUEUE_PREEMPT_DEFAULT_TIMEOUT_MS (9000)
++#define KFD_HIQ_TIMEOUT (500)
++#define KFD_UNMAP_LATENCY_MS (4000)
++#define QUEUE_PREEMPT_DEFAULT_TIMEOUT_MS (2 * KFD_UNMAP_LATENCY_MS + 1000)
++
+ #define KFD_DQM_FIRST_PIPE (0)
+ #define CIK_SDMA_QUEUES (4)
+ #define CIK_SDMA_QUEUES_PER_ENGINE (2)
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
+index fbee118..fc4d8b2 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_kernel_queue.c
+@@ -185,7 +185,7 @@ static void uninitialize(struct kernel_queue *kq)
+ if (kq->queue->properties.type == KFD_QUEUE_TYPE_HIQ)
+ kq->mqd->destroy_mqd(kq->mqd,
+ NULL,
+- false,
++ KFD_PREEMPT_TYPE_WAVEFRONT_RESET,
+ QUEUE_PREEMPT_DEFAULT_TIMEOUT_MS,
+ kq->queue->pipe,
+ kq->queue->queue);
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c
+index 89f6bb1..07b11f2 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_packet_manager.c
+@@ -636,7 +636,7 @@ int pm_send_set_resources(struct packet_manager *pm,
+ packet->bitfields2.queue_type =
+ queue_type__mes_set_resources__hsa_interface_queue_hiq;
+ packet->bitfields2.vmid_mask = res->vmid_mask;
+- packet->bitfields2.unmap_latency = KFD_UNMAP_LATENCY;
++ packet->bitfields2.unmap_latency = KFD_UNMAP_LATENCY_MS / 100;
+ packet->bitfields7.oac_mask = res->oac_mask;
+ packet->bitfields8.gds_heap_base = res->gds_heap_base;
+ packet->bitfields8.gds_heap_size = res->gds_heap_size;
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+index e60f20f..8f9f641 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+@@ -316,11 +316,6 @@ enum kfd_unmap_queues_filter {
+ KFD_UNMAP_QUEUES_FILTER_BY_PASID
+ };
+
+-enum kfd_preempt_type {
+- KFD_PREEMPT_TYPE_WAVEFRONT,
+- KFD_PREEMPT_TYPE_WAVEFRONT_RESET
+-};
+-
+ /**
+ * enum kfd_queue_type
+ *
+@@ -816,11 +811,8 @@ int kgd2kfd_resume_mm(struct kfd_dev *kfd, struct mm_struct *mm);
+
+ /* Packet Manager */
+
+-#define KFD_HIQ_TIMEOUT (500)
+-
+ #define KFD_FENCE_COMPLETED (100)
+ #define KFD_FENCE_INIT (10)
+-#define KFD_UNMAP_LATENCY (40)
+
+ struct packet_manager_firmware;
+
+--
+2.7.4
+