aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/4101-drm-amd-amdkfd-This-patch-does-not-initialize-kfd-fo.patch
blob: c4a6cdf7dd1a213a21f15b444b50e336cca6a3ca (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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
From 924825f097f4bfa2cae17a6a14a53117a9de3e9b Mon Sep 17 00:00:00 2001
From: kalyan alle <Kalyan.Alle@amd.com>
Date: Sat, 2 Nov 2019 16:30:31 +0530
Subject: [PATCH 4101/4103] drm/amd/amdkfd:This patch does not initialize kfd
 for

only for raven2.

Initializing kfd (rocm) for raven2(Bilby R1000) is causing S3 to fail after very few
iterations(less than 10). With kfd disabled, we could see the S3 getting
passed. This patch disables kfd based on the device id. If the device id
 is 15d8(raven2), kfd does not get initialized. This patch does not have
any impact on the rocm functionality on Bilby V1000.Also it makes sense
to disable kfd/rocm on Bilby R1000 as Rocm is not supported on it.

Signed-off-by: Kalyan Alle <kalyan.alle@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu.h           |  1 +
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c  |  7 +++++
 .../gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  | 10 +++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_device.c    |  4 +++
 drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c       |  1 +
 drivers/gpu/drm/amd/amdkfd/kfd_device.c       | 28 +++++++++++++++++++
 drivers/gpu/drm/amd/amdkfd/kfd_module.c       |  4 +++
 7 files changed, 55 insertions(+)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
index 3e9b286d3f9e..3bb4b7c6a42d 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
@@ -114,6 +114,7 @@ struct amdgpu_mgpu_info
 /*
  * Modules parameters.
  */
+extern int kfd_flag_for_rv2;
 extern int amdgpu_modeset;
 extern int amdgpu_vram_limit;
 extern int amdgpu_vis_vram_limit;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c
index 24d2a623d9f0..4abc39ed8f75 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c
@@ -28,6 +28,7 @@
 #include <linux/slab.h>
 #include <linux/sched/mm.h>
 #include "amdgpu_amdkfd.h"
+#include "amdgpu.h"
 
 static const struct dma_fence_ops amdkfd_fence_ops;
 static atomic_t fence_seq = ATOMIC_INIT(0);
@@ -83,6 +84,9 @@ struct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context,
 #ifdef CONFIG_HSA_AMD
 struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f)
 {
+	if (kfd_flag_for_rv2)
+		return NULL;
+
 	struct amdgpu_amdkfd_fence *fence;
 
 	if (!f)
@@ -161,6 +165,9 @@ static void amdkfd_fence_release(struct dma_fence *f)
  */
 bool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm)
 {
+	if (kfd_flag_for_rv2)
+		return false;
+
 	struct amdgpu_amdkfd_fence *fence = to_amdgpu_amdkfd_fence(f);
 
 	if (!fence)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index 9ffe63377c99..3e13f3e9097a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -32,6 +32,7 @@
 #include "amdgpu_vm.h"
 #include "amdgpu_amdkfd.h"
 #include "amdgpu_dma_buf.h"
+#include "amdgpu.h"
 
 /* BO flag to indicate a KFD userptr BO */
 #define AMDGPU_AMDKFD_USERPTR_BO (1ULL << 63)
@@ -188,6 +189,9 @@ static void unreserve_mem_limit(struct amdgpu_device *adev,
 
 void amdgpu_amdkfd_unreserve_memory_limit(struct amdgpu_bo *bo)
 {
+	if (kfd_flag_for_rv2)
+		return;
+
 	struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev);
 	u32 domain = bo->preferred_domains;
 	bool sg = (bo->preferred_domains == AMDGPU_GEM_DOMAIN_CPU);
@@ -1077,6 +1081,9 @@ int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd,
 void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,
 				    struct amdgpu_vm *vm)
 {
+	if (kfd_flag_for_rv2)
+		return;
+
 	struct amdkfd_process_info *process_info = vm->process_info;
 	struct amdgpu_bo *pd = vm->root.base.bo;
 
@@ -1919,6 +1926,9 @@ int amdgpu_amdkfd_gpuvm_export_dmabuf(struct kgd_dev *kgd, void *vm,
 int amdgpu_amdkfd_evict_userptr(struct kgd_mem *mem,
 				struct mm_struct *mm)
 {
+	if (kfd_flag_for_rv2)
+		return 0;
+
 	struct amdkfd_process_info *process_info = mem->process_info;
 	int invalid, evicted_bos;
 	int r = 0;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index 39ccf6855efb..1b972f531740 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -1624,6 +1624,10 @@ static int amdgpu_device_ip_early_init(struct amdgpu_device *adev)
 	if (amdgpu_discovery && adev->asic_type >= CHIP_NAVI10)
 		amdgpu_discovery_get_gfx_info(adev);
 
+	if ((adev->asic_type == CHIP_RAVEN) &&
+            (adev->pdev->device == 0x15d8))
+		kfd_flag_for_rv2 = 1;
+
 	amdgpu_amdkfd_device_probe(adev);
 
 	if (amdgpu_sriov_vf(adev)) {
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
index 29cf16edbb10..50927cd86cc9 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
@@ -119,6 +119,7 @@ int amdgpu_sched_hw_submission = 2;
 int amdgpu_no_evict = 0;
 int amdgpu_direct_gma_size = 0;
 int amdgpu_ssg_enabled = 0;
+int kfd_flag_for_rv2 = 0;
 uint amdgpu_pcie_gen_cap = 0;
 uint amdgpu_pcie_lane_cap = 0;
 uint amdgpu_cg_mask = 0xffffffff;
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device.c b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
index 24728e70e871..ee9b9a6968bd 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_device.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_device.c
@@ -29,6 +29,7 @@
 #include "cwsr_trap_handler.h"
 #include "kfd_iommu.h"
 #include "amdgpu_amdkfd.h"
+#include "amdgpu.h"
 
 #define MQD_SIZE_ALIGNED 768
 
@@ -491,6 +492,9 @@ static int kfd_resume(struct kfd_dev *kfd);
 struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd,
 	struct pci_dev *pdev, unsigned int asic_type, bool vf)
 {
+	if (kfd_flag_for_rv2)
+		return NULL;
+
 	struct kfd_dev *kfd;
 	const struct kfd_device_info *device_info;
 	const struct kfd2kgd_calls *f2g;
@@ -574,6 +578,9 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
 			 struct drm_device *ddev,
 			 const struct kgd2kfd_shared_resources *gpu_resources)
 {
+	if (kfd_flag_for_rv2)
+		return false;
+
 	unsigned int size;
 
 	kfd->ddev = ddev;
@@ -710,6 +717,9 @@ bool kgd2kfd_device_init(struct kfd_dev *kfd,
 
 void kgd2kfd_device_exit(struct kfd_dev *kfd)
 {
+	if (kfd_flag_for_rv2)
+		return;
+
 	if (kfd->init_complete) {
 		kgd2kfd_suspend(kfd);
 		device_queue_manager_uninit(kfd->dqm);
@@ -727,6 +737,9 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd)
 
 int kgd2kfd_pre_reset(struct kfd_dev *kfd)
 {
+	if (kfd_flag_for_rv2)
+		return 0;
+
 	if (!kfd->init_complete)
 		return 0;
 	kgd2kfd_suspend(kfd);
@@ -746,6 +759,9 @@ int kgd2kfd_pre_reset(struct kfd_dev *kfd)
 
 int kgd2kfd_post_reset(struct kfd_dev *kfd)
 {
+	if (kfd_flag_for_rv2)
+		return 0;
+
 	int ret, count;
 
 	if (!kfd->init_complete)
@@ -772,6 +788,9 @@ bool kfd_is_locked(void)
 #ifdef CONFIG_HSA_AMD
 void kgd2kfd_suspend(struct kfd_dev *kfd)
 {
+	if (kfd_flag_for_rv2)
+		return;
+
 	if (!kfd->init_complete)
 		return;
 
@@ -786,6 +805,9 @@ void kgd2kfd_suspend(struct kfd_dev *kfd)
 
 int kgd2kfd_resume(struct kfd_dev *kfd)
 {
+	if (kfd_flag_for_rv2)
+		return 0;
+
 	int ret, count;
 
 	if (!kfd->init_complete)
@@ -835,6 +857,9 @@ static int kfd_resume(struct kfd_dev *kfd)
 /* This is called directly from KGD at ISR. */
 void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)
 {
+	if (kfd_flag_for_rv2)
+		return;
+
 	uint32_t patched_ihre[KFD_MAX_RING_ENTRY_SIZE];
 	bool is_patched = false;
 	unsigned long flags;
@@ -1130,6 +1155,9 @@ int kfd_gtt_sa_free(struct kfd_dev *kfd, struct kfd_mem_obj *mem_obj)
 
 void kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd)
 {
+	if (kfd_flag_for_rv2)
+		return NULL;
+
 	if (kfd)
 		atomic_inc(&kfd->sram_ecc_flag);
 }
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_module.c b/drivers/gpu/drm/amd/amdkfd/kfd_module.c
index c7b857b542e8..3b6896effdc9 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_module.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_module.c
@@ -24,6 +24,7 @@
 #include <linux/device.h>
 #include "kfd_priv.h"
 #include "amdgpu_amdkfd.h"
+#include "amdgpu.h"
 
 static int kfd_init(void)
 {
@@ -98,6 +99,9 @@ int kgd2kfd_init(void)
 #ifdef CONFIG_HSA_AMD
 void kgd2kfd_exit(void)
 {
+	if (kfd_flag_for_rv2)
+		return NULL;
+
 	kfd_exit();
 }
 #endif
-- 
2.17.1