aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3288-drm-amdgpu-Fix-TLB-invalidation-for-gfx7-and-gfx8.patch
blob: 3e5acc9354d8de400c99be88d79bf3b0a5f5a3af (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
From 548557b21e061b5b3d2da422903376d2b7591112 Mon Sep 17 00:00:00 2001
From: Oak Zeng <Oak.Zeng@amd.com>
Date: Mon, 22 Jan 2018 15:28:21 -0500
Subject: [PATCH 3288/4131] drm/amdgpu: Fix TLB invalidation for gfx7 and gfx8

Read VM_INVALIDATE_RESPONSE register to make sure TLB invalidation
is complete. However the value of ressponse register is ignored.
Polling and clear bit in response register can cause HW hang. Simply
read the register is enough to guarantee invalidation completion.

Change-Id: I9f58dcc8e8cbdad3359c4181123a66ad00864ec7
Signed-off-by: Oak Zeng <Oak.Zeng@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 2 ++
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
index 3a4e5ed..fcc1add 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
@@ -852,6 +852,7 @@ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
 		if ((tmp & ATC_VMID0_PASID_MAPPING__VALID_MASK) &&
 			(tmp & ATC_VMID0_PASID_MAPPING__PASID_MASK) == pasid) {
 			WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
+			RREG32(mmVM_INVALIDATE_RESPONSE);
 			break;
 		}
 	}
@@ -869,6 +870,7 @@ static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid)
 	}
 
 	WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
+	RREG32(mmVM_INVALIDATE_RESPONSE);
 	return 0;
 }
 
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
index aa23fa3..ea8e948 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
@@ -830,6 +830,7 @@ static int invalidate_tlbs(struct kgd_dev *kgd, uint16_t pasid)
 		if ((tmp & ATC_VMID0_PASID_MAPPING__VALID_MASK) &&
 			(tmp & ATC_VMID0_PASID_MAPPING__PASID_MASK) == pasid) {
 			WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
+			RREG32(mmVM_INVALIDATE_RESPONSE);
 			break;
 		}
 	}
@@ -847,6 +848,7 @@ static int invalidate_tlbs_vmid(struct kgd_dev *kgd, uint16_t vmid)
 	}
 
 	WREG32(mmVM_INVALIDATE_REQUEST, 1 << vmid);
+	RREG32(mmVM_INVALIDATE_RESPONSE);
 	return 0;
 }
 
-- 
2.7.4