aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/1180-drm-amdkfd-Don-t-synchronize-DIQ-after-a-wave-contro.patch
diff options
context:
space:
mode:
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.14.71/1180-drm-amdkfd-Don-t-synchronize-DIQ-after-a-wave-contro.patch')
-rw-r--r--common/recipes-kernel/linux/linux-yocto-4.14.71/1180-drm-amdkfd-Don-t-synchronize-DIQ-after-a-wave-contro.patch81
1 files changed, 81 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.14.71/1180-drm-amdkfd-Don-t-synchronize-DIQ-after-a-wave-contro.patch b/common/recipes-kernel/linux/linux-yocto-4.14.71/1180-drm-amdkfd-Don-t-synchronize-DIQ-after-a-wave-contro.patch
new file mode 100644
index 00000000..899630a3
--- /dev/null
+++ b/common/recipes-kernel/linux/linux-yocto-4.14.71/1180-drm-amdkfd-Don-t-synchronize-DIQ-after-a-wave-contro.patch
@@ -0,0 +1,81 @@
+From d54f375796045fa79a0d287494f331076ed43a98 Mon Sep 17 00:00:00 2001
+From: Felix Kuehling <Felix.Kuehling@amd.com>
+Date: Fri, 12 Aug 2016 19:28:41 -0400
+Subject: [PATCH 1180/4131] drm/amdkfd: Don't synchronize DIQ after a wave
+ control IB
+
+Issuing a release_mem packet on the DIQ can hang the CP if a compute
+queue and the DIQ are running on the same pipe.
+
+Change-Id: Iea60140426bb98e84f15ee7b2010ea4fce5b53be
+Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
+---
+ drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c | 18 ++++++++++++++----
+ 1 file changed, 14 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c b/drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c
+index 4f2311e..74109d0 100644
+--- a/drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c
++++ b/drivers/gpu/drm/amd/amdkfd/kfd_dbgdev.c
+@@ -47,14 +47,16 @@ static void dbgdev_address_watch_disable_nodiq(struct kfd_dev *dev)
+
+ static int dbgdev_diq_submit_ib(struct kfd_dbgdev *dbgdev,
+ unsigned int pasid, uint64_t vmid0_address,
+- uint32_t *packet_buff, size_t size_in_bytes)
++ uint32_t *packet_buff, size_t size_in_bytes,
++ bool sync)
+ {
+ int status = 0;
+ unsigned int *ib_packet_buff = NULL;
+ struct pm4__release_mem *rm_packet;
+ struct pm4__indirect_buffer_pasid *ib_packet;
+ struct kernel_queue *kq = dbgdev->kq;
+- size_t pq_packets_size_in_bytes = sizeof(struct pm4__release_mem) + sizeof(struct pm4__indirect_buffer_pasid);
++ size_t pq_packets_size_in_bytes =
++ sizeof(struct pm4__indirect_buffer_pasid);
+ struct kfd_mem_obj *mem_obj;
+
+ uint64_t *rm_state = NULL;
+@@ -74,6 +76,9 @@ static int dbgdev_diq_submit_ib(struct kfd_dbgdev *dbgdev,
+ * The receive packet buff will be sitting on the Indirect Buffer
+ * and in the PQ we put the IB packet + sync packet(s).
+ */
++ if (sync)
++ pq_packets_size_in_bytes +=
++ sizeof(struct pm4__release_mem);
+ status = kq->ops.acquire_packet_buffer(kq, pq_packets_size_in_bytes / sizeof(uint32_t), &ib_packet_buff);
+ if (status != 0) {
+ pr_debug("Error! kfd: In func %s >> acquire_packet_buffer failed\n", __func__);
+@@ -98,6 +103,11 @@ static int dbgdev_diq_submit_ib(struct kfd_dbgdev *dbgdev,
+
+ ib_packet->bitfields5.pasid = pasid;
+
++ if (!sync) {
++ kq->ops.submit_packet(kq);
++ break;
++ }
++
+ /*
+ * for now we use release mem for GPU-CPU synchronization
+ * Consider WaitRegMem + WriteData as a better alternative
+@@ -491,7 +501,7 @@ static int dbgdev_address_watch_diq(struct kfd_dbgdev *dbgdev,
+ adw_info->process->pasid,
+ mem_obj->gpu_addr,
+ packet_buff_uint,
+- ib_size);
++ ib_size, true);
+
+ if (status != 0) {
+ pr_debug("Error! kfd: In func %s >> failed to submit DIQ packet\n", __func__);
+@@ -707,7 +717,7 @@ static int dbgdev_wave_control_diq(struct kfd_dbgdev *dbgdev,
+ wac_info->process->pasid,
+ mem_obj->gpu_addr,
+ packet_buff_uint,
+- ib_size);
++ ib_size, false);
+
+ if (status != 0)
+ pr_debug("%s\n", " Critical Error ! Submit diq packet failed ");
+--
+2.7.4
+