aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1497-drm-amdkfd-Don-t-synchronize-DIQ-after-a-wave-contro.patch
blob: f865bd3c3e61094c5bd430ebc218da4909e5d163 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
From 77401762a9728efb2cba57c74cc9e1ccc8cb3333 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 1497/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