aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/3181-drm-amdkfd-Use-legacy-mode-to-do-tlb-invalidation.patch
blob: eb616c47c6c0196c3d23488e6bbbd79a06337191 (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
From ffcdc0fed91641f126c98038f96a11310b839ce1 Mon Sep 17 00:00:00 2001
From: Yong Zhao <yong.zhao@amd.com>
Date: Fri, 12 Jan 2018 13:53:29 -0500
Subject: [PATCH 3181/4131] drm/amdkfd: Use legacy mode to do tlb invalidation

After clarifying with UTCL2 team, legacy mode suffices our use cases.
In addition, on Raven there is a HW bug for anything but legacy mode
when MMHUB power gating is enabled. Therefore, we should all use legacy
mode.

Change-Id: Ibc6b80f16b414180e07bc148f18df9fa962b9e0d
Signed-off-by: Yong Zhao <yong.zhao@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
index 8eae0a7..25aa7ce 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v9.c
@@ -920,7 +920,7 @@ static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid)
 {
 	struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
 	uint32_t req = (1 << vmid) |
-		(1 << VM_INVALIDATE_ENG16_REQ__FLUSH_TYPE__SHIFT) | /* light */
+		(0 << VM_INVALIDATE_ENG16_REQ__FLUSH_TYPE__SHIFT) | /* legacy */
 		VM_INVALIDATE_ENG16_REQ__INVALIDATE_L2_PTES_MASK |
 		VM_INVALIDATE_ENG16_REQ__INVALIDATE_L2_PDE0_MASK |
 		VM_INVALIDATE_ENG16_REQ__INVALIDATE_L2_PDE1_MASK |
@@ -929,7 +929,13 @@ static void write_vmid_invalidate_request(struct kgd_dev *kgd, uint8_t vmid)
 
 	spin_lock(&adev->tlb_invalidation_lock);
 
-	/* Use light weight invalidation.
+	/* Use legacy mode tlb invalidation.
+	 *
+	 * Currently on Raven the code below is broken for anything but
+	 * legacy mode due to a MMHUB power gating problem. A workaround
+	 * is for MMHUB to wait until the condition PER_VMID_INVALIDATE_REQ
+	 * == PER_VMID_INVALIDATE_ACK instead of simply waiting for the ack
+	 * bit.
 	 *
 	 * TODO 1: agree on the right set of invalidation registers for
 	 * KFD use. Use the last one for now. Invalidate both GC and
@@ -980,7 +986,7 @@ static int invalidate_tlbs_with_kiq(struct amdgpu_device *adev, uint16_t pasid)
 			PACKET3_INVALIDATE_TLBS_DST_SEL(1) |
 			PACKET3_INVALIDATE_TLBS_ALL_HUB(1) |
 			PACKET3_INVALIDATE_TLBS_PASID(pasid) |
-			PACKET3_INVALIDATE_TLBS_FLUSH_TYPE(2));
+			PACKET3_INVALIDATE_TLBS_FLUSH_TYPE(0)); /* legacy */
 	amdgpu_fence_emit_polling(ring, &seq);
 	amdgpu_ring_commit(ring);
 	spin_unlock(&adev->gfx.kiq.ring_lock);
-- 
2.7.4