aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1417-drm-amdgpu-Do-all-BO-and-page-table-pinning-inside-m.patch
blob: 9b4516a5c156da555e5f4ee4a40bb63ba43d0408 (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
From 5c2223bc2432d5e2e4b8e913420094982801830b Mon Sep 17 00:00:00 2001
From: Yong Zhao <yong.zhao@amd.com>
Date: Wed, 27 Apr 2016 19:43:13 -0400
Subject: [PATCH 1417/4131] drm/amdgpu: Do all BO and page table pinning inside
 map_bo_to_gpuvm

Change-Id: Id31a04ccce15a0a15704d6bcb62572a7fa871fdf
Signed-off-by: Yong Zhao <yong.zhao@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 40 +++++++++---------------
 1 file changed, 15 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index db5faee..896b9df 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -623,11 +623,22 @@ static int update_user_pages(struct kgd_mem *mem, struct mm_struct *mm,
 }
 
 static int map_bo_to_gpuvm(struct amdgpu_device *adev, struct amdgpu_bo *bo,
-		struct amdgpu_bo_va *bo_va)
+		struct amdgpu_bo_va *bo_va, uint32_t domain)
 {
 	struct amdgpu_vm *vm;
 	int ret;
 
+	/*
+	 * We need to pin the allocated BO, PD and appropriate PTs and to
+	 * create a mapping of virtual to MC address
+	 */
+	/* Pin BO*/
+	ret = try_pin_bo(bo, false, domain);
+	if (ret != 0) {
+		pr_err("amdkfd: Failed to pin BO\n");
+		return ret;
+	}
+
 	/* Pin PTs */
 	ret = try_pin_pts(bo_va, false);
 	if (ret != 0) {
@@ -685,6 +696,7 @@ static int map_bo_to_gpuvm(struct amdgpu_device *adev, struct amdgpu_bo *bo,
 err_failed_to_pin_pd:
 	unpin_pts(bo_va, vm, false);
 err_failed_to_pin_pts:
+	unpin_bo(bo, false);
 
 	return ret;
 }
@@ -888,18 +900,8 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
 
 			pr_debug("amdkfd: Trying to map VA 0x%llx to vm %p\n",
 					mem->data2.va, vm);
-			/*
-			 * We need to pin the allocated BO, PD and appropriate PTs and to
-			 * create a mapping of virtual to MC address
-			 */
-			/* Pin BO*/
-			ret = try_pin_bo(bo, false, domain);
-			if (ret != 0) {
-				pr_err("amdkfd: Failed to pin BO\n");
-				goto pin_bo_failed;
-			}
 
-			ret = map_bo_to_gpuvm(adev, bo, entry->bo_va);
+			ret = map_bo_to_gpuvm(adev, bo, entry->bo_va, domain);
 			if (ret != 0) {
 				pr_err("amdkfd: Failed to map radeon bo to gpuvm\n");
 				goto map_bo_to_gpuvm_failed;
@@ -917,8 +919,6 @@ int amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
 	return 0;
 
 map_bo_to_gpuvm_failed:
-	unpin_bo(bo, false);
-pin_bo_failed:
 quiesce_failed:
 update_user_pages_failed:
 	if (bo_va_entry_aql)
@@ -1543,20 +1543,10 @@ int amdgpu_amdkfd_gpuvm_restore_mem(struct kgd_mem *mem, struct mm_struct *mm)
 			goto resume_kfd;
 		}
 
-		r = try_pin_bo(mem->data2.bo, false, domain);
-		if (unlikely(r != 0)) {
-			pr_err("Failed to pin BO\n");
-			entry->is_mapped = false;
-			if (ret == 0)
-				ret = r;
-			goto resume_kfd;
-		}
-
-		r = map_bo_to_gpuvm(adev, mem->data2.bo, entry->bo_va);
+		r = map_bo_to_gpuvm(adev, mem->data2.bo, entry->bo_va, domain);
 		if (unlikely(r != 0)) {
 			pr_err("Failed to map BO to gpuvm\n");
 			entry->is_mapped = false;
-			unpin_bo(mem->data2.bo, true);
 			if (ret == 0)
 				ret = r;
 		}
-- 
2.7.4