aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1419-drm-amdgpu-Add-GPUVM-and-Hawaii-to-gfx_v7-KFD-suppor.patch
blob: 42ec9e847d7e750a9b5408eed8367d8a13e75c67 (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
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
From 522fb50ef41ce9f57f6dd2db0ca29dacb0cde6ee Mon Sep 17 00:00:00 2001
From: Felix Kuehling <Felix.Kuehling@amd.com>
Date: Fri, 22 Apr 2016 16:20:36 -0400
Subject: [PATCH 1419/4131] drm/amdgpu: Add GPUVM and Hawaii to gfx_v7 KFD
 support

Change-Id: If328aa3db713b6a2590035c19e22928b5db2d10c
Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c        |   7 +-
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h        |   2 -
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 148 ++++------------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c |   1 -
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c  |   3 +-
 5 files changed, 25 insertions(+), 136 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
index 62e7145..ea5372b 100755
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.c
@@ -67,6 +67,7 @@ bool amdgpu_amdkfd_load_interface(struct amdgpu_device *adev)
 {
 	switch (adev->asic_type) {
 	case CHIP_KAVERI:
+	case CHIP_HAWAII:
 		kfd2kgd = amdgpu_amdkfd_gfx_7_get_functions();
 		break;
 	case CHIP_CARRIZO:
@@ -423,12 +424,6 @@ void get_cu_info(struct kgd_dev *kgd, struct kfd_cu_info *cu_info)
         cu_info->lds_size = acu_info.lds_size;
 }
 
-int map_gtt_bo_to_kernel(struct kgd_dev *kgd,
-                struct kgd_mem *mem, void **kptr)
-{
-        return 0;
-}
-
 int amdgpu_amdkfd_get_dmabuf_info(struct kgd_dev *kgd, int dma_buf_fd,
                                   struct kgd_dev **dma_buf_kgd,
                                   uint64_t *bo_size, void *metadata_buffer,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index 5fa506d..b7b30af 100755
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -108,8 +108,6 @@ uint64_t get_gpu_clock_counter(struct kgd_dev *kgd);
 
 uint32_t get_max_engine_clock_in_mhz(struct kgd_dev *kgd);
 void get_cu_info(struct kgd_dev *kgd, struct kfd_cu_info *cu_info);
-int map_gtt_bo_to_kernel(struct kgd_dev *kgd,
-		struct kgd_mem *mem, void **kptr);
 int amdgpu_amdkfd_get_dmabuf_info(struct kgd_dev *kgd, int dma_buf_fd,
 				  struct kgd_dev **dmabuf_kgd,
 				  uint64_t *bo_size, void *metadata_buffer,
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 9eca46f..1051556 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
@@ -83,21 +83,7 @@ union TCP_WATCH_CNTL_BITS {
 	float f32All;
 };
 
-static int create_process_vm(struct kgd_dev *kgd, void **vm);
-static void destroy_process_vm(struct kgd_dev *kgd, void *vm);
-
-static uint32_t get_process_page_dir(void *vm);
-
 static int open_graphic_handle(struct kgd_dev *kgd, uint64_t va, void *vm, int fd, uint32_t handle, struct kgd_mem **mem);
-static int map_memory_to_gpu(struct kgd_dev *kgd, struct kgd_mem *mem,
-		void *vm);
-static int unmap_memory_from_gpu(struct kgd_dev *kgd, struct kgd_mem *mem,
-		void *vm);
-static int alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va, size_t size,
-		void *vm, struct kgd_mem **mem,
-		uint64_t *offset, void **kptr, struct kfd_process_device *pdd,
-		uint32_t flags);
-static int free_memory_of_gpu(struct kgd_dev *kgd, struct kgd_mem *mem);
 
 static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type);
 
@@ -144,7 +130,6 @@ static int alloc_memory_of_scratch(struct kgd_dev *kgd,
 					 uint64_t va, uint32_t vmid);
 static int write_config_static_mem(struct kgd_dev *kgd, bool swizzle_enable,
 		uint8_t element_size, uint8_t index_stride, uint8_t mtype);
-static int mmap_bo(struct kgd_dev *kgd, struct vm_area_struct *vma);
 static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
 		uint32_t page_table_base);
 
@@ -154,9 +139,9 @@ static const struct kfd2kgd_calls kfd2kgd = {
 	.get_local_mem_info = get_local_mem_info,
 	.get_gpu_clock_counter = get_gpu_clock_counter,
 	.get_max_engine_clock_in_mhz = get_max_engine_clock_in_mhz,
-	.create_process_vm = create_process_vm,
-	.destroy_process_vm = destroy_process_vm,
-	.get_process_page_dir = get_process_page_dir,
+	.create_process_vm = amdgpu_amdkfd_gpuvm_create_process_vm,
+	.destroy_process_vm = amdgpu_amdkfd_gpuvm_destroy_process_vm,
+	.get_process_page_dir = amdgpu_amdkfd_gpuvm_get_process_page_dir,
 	.open_graphic_handle = open_graphic_handle,
 	.program_sh_mem_settings = kgd_program_sh_mem_settings,
 	.set_pasid_vmid_mapping = kgd_set_pasid_vmid_mapping,
@@ -172,22 +157,30 @@ static const struct kfd2kgd_calls kfd2kgd = {
 	.address_watch_execute = kgd_address_watch_execute,
 	.wave_control_execute = kgd_wave_control_execute,
 	.address_watch_get_offset = kgd_address_watch_get_offset,
-	.get_atc_vmid_pasid_mapping_pasid = get_atc_vmid_pasid_mapping_pasid,
-	.get_atc_vmid_pasid_mapping_valid = get_atc_vmid_pasid_mapping_valid,
+	.get_atc_vmid_pasid_mapping_pasid =
+			get_atc_vmid_pasid_mapping_pasid,
+	.get_atc_vmid_pasid_mapping_valid =
+			get_atc_vmid_pasid_mapping_valid,
 	.write_vmid_invalidate_request = write_vmid_invalidate_request,
-	.alloc_memory_of_gpu = alloc_memory_of_gpu,
-	.free_memory_of_gpu = free_memory_of_gpu,
-	.map_memory_to_gpu = map_memory_to_gpu,
-	.unmap_memory_to_gpu = unmap_memory_from_gpu,
+	.alloc_memory_of_gpu = amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu,
+	.free_memory_of_gpu = amdgpu_amdkfd_gpuvm_free_memory_of_gpu,
+	.map_memory_to_gpu = amdgpu_amdkfd_gpuvm_map_memory_to_gpu,
+	.unmap_memory_to_gpu = amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu,
 	.get_fw_version = get_fw_version,
 	.set_num_of_requests = set_num_of_requests,
 	.get_cu_info = get_cu_info,
 	.alloc_memory_of_scratch = alloc_memory_of_scratch,
 	.write_config_static_mem = write_config_static_mem,
-	.mmap_bo = mmap_bo,
-	.map_gtt_bo_to_kernel = map_gtt_bo_to_kernel,
+	.mmap_bo = amdgpu_amdkfd_gpuvm_mmap_bo,
+	.map_gtt_bo_to_kernel = amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel,
 	.set_vm_context_page_table_base = set_vm_context_page_table_base,
+	.get_pdd_from_buffer_object =
+			amdgpu_amdkfd_gpuvm_get_pdd_from_buffer_object,
+	.return_bo_size = amdgpu_amdkfd_gpuvm_return_bo_size,
+	.pin_get_sg_table_bo = amdgpu_amdkfd_gpuvm_pin_get_sg_table,
+	.unpin_put_sg_table_bo = amdgpu_amdkfd_gpuvm_unpin_put_sg_table,
 	.get_dmabuf_info = amdgpu_amdkfd_get_dmabuf_info,
+	.import_dmabuf = amdgpu_amdkfd_gpuvm_import_dmabuf,
 	.get_vm_fault_info = amdgpu_amdkfd_gpuvm_get_vm_fault_info
 };
 
@@ -196,76 +189,6 @@ struct kfd2kgd_calls *amdgpu_amdkfd_gfx_7_get_functions()
 	return (struct kfd2kgd_calls *)&kfd2kgd;
 }
 
-/*
- * Creates a VM context for HSA process
- */
-static int create_process_vm(struct kgd_dev *kgd, void **vm)
-{
-	int ret;
-	struct amdgpu_vm *new_vm;
-	struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
-
-	BUG_ON(kgd == NULL);
-	BUG_ON(vm == NULL);
-
-	new_vm = kzalloc(sizeof(struct amdgpu_vm), GFP_KERNEL);
-	if (new_vm == NULL)
-		return -ENOMEM;
-
-	/* Initialize the VM context, allocate the page directory and zero it */
-	ret = amdgpu_vm_init(adev, new_vm);
-	if (ret != 0) {
-		/* Undo everything related to the new VM context */
-		amdgpu_vm_fini(adev, new_vm);
-		kfree(new_vm);
-		new_vm = NULL;
-	}
-
-	/* Pin the PD directory*/
-	amdgpu_bo_reserve(new_vm->page_directory, true);
-	amdgpu_bo_pin(new_vm->page_directory, AMDGPU_GEM_DOMAIN_VRAM, NULL);
-	amdgpu_bo_unreserve(new_vm->page_directory);
-#if 0
-	new_vm->pd_gpu_addr = amdgpu_bo_gpu_offset(new_vm->page_directory);
-#endif
-	*vm = (void *) new_vm;
-
-	return ret;
-}
-
-/*
- * Destroys a VM context of HSA process
- */
-static void destroy_process_vm(struct kgd_dev *kgd, void *vm)
-{
-	struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
-	struct amdgpu_vm *rvm = (struct amdgpu_vm *) vm;
-
-	BUG_ON(kgd == NULL);
-	BUG_ON(vm == NULL);
-
-	/* Unpin the PD directory*/
-	amdgpu_bo_reserve(rvm->page_directory, true);
-	amdgpu_bo_unpin(rvm->page_directory);
-	amdgpu_bo_unreserve(rvm->page_directory);
-
-	/* Release the VM context */
-	amdgpu_vm_fini(adev, rvm);
-	kfree(vm);
-}
-
-static uint32_t get_process_page_dir(void *vm)
-{
-#if 0
-	struct amdgpu_vm *rvm = (struct amdgpu_vm *) vm;
-
-	BUG_ON(vm == NULL);
-
-	return rvm->pd_gpu_addr >> AMDGPU_GPU_PAGE_SHIFT;
-#endif
-	return 0;
-}
-
 static int open_graphic_handle(struct kgd_dev *kgd, uint64_t va, void *vm,
 				int fd, uint32_t handle, struct kgd_mem **mem)
 {
@@ -386,7 +309,7 @@ static inline uint32_t get_sdma_base_addr(struct cik_sdma_rlc_registers *m)
 
 	retval = m->sdma_engine_id * SDMA1_REGISTER_OFFSET +
 			m->sdma_queue_id * KFD_CIK_SDMA_QUEUE_OFFSET;
-	pr_err("kfd: sdma base address: 0x%x\n", retval);
+	pr_debug("kfd: sdma base address: 0x%x\n", retval);
 
 	return retval;
 }
@@ -543,7 +466,8 @@ static int kgd_hqd_destroy(struct kgd_dev *kgd, uint32_t reset_type,
 
 	while (true) {
 		temp = RREG32(mmCP_HQD_ACTIVE);
-		if (temp & CP_HQD_ACTIVE__ACTIVE__SHIFT)
+		/* FIXME: this looks backwards */
+		if (temp & CP_HQD_ACTIVE__ACTIVE_MASK)
 			break;
 		if (timeout <= 0) {
 			pr_err("kfd: cp queue preemption time out (%dms)\n",
@@ -730,29 +654,6 @@ static int alloc_memory_of_scratch(struct kgd_dev *kgd,
 }
 
 
-static int alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va, size_t size,
-		void *vm, struct kgd_mem **mem, uint64_t *offset,
-		void **kptr, struct kfd_process_device *pdd, uint32_t flags)
-{
-	return -EFAULT;
-}
-
-static int free_memory_of_gpu(struct kgd_dev *kgd, struct kgd_mem *mem)
-{
-	return -EFAULT;
-}
-
-static int map_memory_to_gpu(struct kgd_dev *kgd, struct kgd_mem *mem, void *vm)
-{
-	return -EFAULT;
-}
-
-static int unmap_memory_from_gpu(struct kgd_dev *kgd, struct kgd_mem *mem,
-		void *vm)
-{
-	return -EFAULT;
-}
-
 static uint16_t get_fw_version(struct kgd_dev *kgd, enum kgd_engine_type type)
 {
 	struct amdgpu_device *adev = (struct amdgpu_device *) kgd;
@@ -824,11 +725,6 @@ static void set_num_of_requests(struct kgd_dev *dev, uint8_t num_of_req)
 	WREG32(mmATC_ATS_DEBUG, value);
 }
 
-static int mmap_bo(struct kgd_dev *kgd, struct vm_area_struct *vma)
-{
-	return 0;
-}
-
 static void set_vm_context_page_table_base(struct kgd_dev *kgd, uint32_t vmid,
 			uint32_t page_table_base)
 {
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 41925d3..0c6e3a4 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v8.c
@@ -149,7 +149,6 @@ static const struct kfd2kgd_calls kfd2kgd = {
 	.get_fw_version = get_fw_version,
 	.set_num_of_requests = set_num_of_requests,
 	.get_cu_info = get_cu_info,
-	.set_num_of_requests = set_num_of_requests,
 	.alloc_memory_of_scratch = alloc_memory_of_scratch,
 	.write_config_static_mem = write_config_static_mem,
 	.mmap_bo = amdgpu_amdkfd_gpuvm_mmap_bo,
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index 896b9df..c9f7af6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -333,7 +333,8 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
 	}
 
 	adev = get_amdgpu_device(kgd);
-	byte_align = adev->asic_type != CHIP_FIJI ? VI_BO_SIZE_ALIGN : 1;
+	byte_align = (adev->family == AMDGPU_FAMILY_VI &&
+		      adev->asic_type != CHIP_FIJI) ? VI_BO_SIZE_ALIGN : 1;
 
 	*mem = kzalloc(sizeof(struct kgd_mem), GFP_KERNEL);
 	if (*mem == NULL) {
-- 
2.7.4