aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1673-drm-amdkfd-Reuse-code-for-mapping-bo-to-kernel-addre.patch
blob: db3bda3882fc69c5742dc3fe4a02391e860e4f3b (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
From f57e953015406393b1d6cc16d4cff02d9376ffcc Mon Sep 17 00:00:00 2001
From: Yong Zhao <Yong.Zhao@amd.com>
Date: Thu, 27 Apr 2017 18:20:30 -0400
Subject: [PATCH 1673/4131] drm/amdkfd: Reuse code for mapping bo to kernel
 address

Change-Id: Ied01fa07ae5e140a791b372311cd23ba7d3e4e78
Signed-off-by: Yong Zhao <Yong.Zhao@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 101 ++++++++++-------------
 1 file changed, 42 insertions(+), 59 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index 9cb51dd..bb1f7a6 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -557,6 +557,40 @@ static int init_user_pages(struct kgd_mem *mem, struct mm_struct *mm,
 	return ret;
 }
 
+static int __map_bo_to_kernel(struct amdgpu_bo *bo, u32 domain, void **kptr)
+{
+	int ret;
+
+	ret = amdgpu_bo_reserve(bo, true);
+	if (ret) {
+		pr_err("Failed to reserve bo. ret %d\n", ret);
+		return ret;
+	}
+
+	ret = amdgpu_bo_pin(bo, domain, NULL);
+	if (ret) {
+		pr_err("Failed to pin bo. ret %d\n", ret);
+		goto pin_failed;
+	}
+
+	ret = amdgpu_bo_kmap(bo, kptr);
+	if (ret) {
+		pr_err("Failed to map bo to kernel. ret %d\n", ret);
+		goto kmap_failed;
+	}
+
+	amdgpu_bo_unreserve(bo);
+
+	return ret;
+
+kmap_failed:
+	amdgpu_bo_unpin(bo);
+pin_failed:
+	amdgpu_bo_unreserve(bo);
+
+	return ret;
+}
+
 static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
 		uint64_t size, void *vm, struct kgd_mem **mem,
 		uint64_t *offset, void **kptr,
@@ -644,28 +678,9 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
 		bo->flags |= AMDGPU_AMDKFD_USERPTR_BO;
 
 	if (kptr) {
-		ret = amdgpu_bo_reserve(bo, true);
-		if (ret) {
-			pr_err("Failed to reserve bo. ret %d\n", ret);
-			goto allocate_mem_reserve_bo_failed;
-		}
-
-		ret = amdgpu_bo_pin(bo, domain,
-					NULL);
-		if (ret) {
-			pr_err("Failed to pin bo. ret %d\n", ret);
-			goto allocate_mem_pin_bo_failed;
-		}
-
-		ret = amdgpu_bo_kmap(bo, kptr);
-		if (ret) {
-			pr_err("Failed to map bo to kernel. ret %d\n",
-					ret);
-			goto allocate_mem_kmap_bo_failed;
-		}
-		(*mem)->kptr = *kptr;
-
-		amdgpu_bo_unreserve(bo);
+		ret = __map_bo_to_kernel(bo, domain, kptr);
+		if (ret)
+			goto map_bo_to_kernel_failed;
 	}
 
 	(*mem)->va = va;
@@ -689,12 +704,7 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
 
 	return 0;
 
-allocate_mem_kmap_bo_failed:
-	amdgpu_bo_unpin(bo);
-allocate_mem_pin_bo_failed:
-	amdgpu_bo_unreserve(bo);
-allocate_mem_reserve_bo_failed:
-
+map_bo_to_kernel_failed:
 allocate_init_user_pages_failed:
 	amdgpu_bo_unref(&bo);
 err_bo_create:
@@ -1615,46 +1625,19 @@ int amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(struct kgd_dev *kgd,
 		struct kgd_mem *mem, void **kptr)
 {
 	int ret;
-	struct amdgpu_device *adev;
 	struct amdgpu_bo *bo;
 
-	adev = get_amdgpu_device(kgd);
-
 	mutex_lock(&mem->lock);
 
 	bo = mem->bo;
-	/* map the buffer */
-	ret = amdgpu_bo_reserve(bo, true);
-	if (ret) {
-		pr_err("Failed to reserve bo. ret %d\n", ret);
-		mutex_unlock(&mem->lock);
-		return ret;
-	}
 
-	ret = amdgpu_bo_pin(bo, AMDGPU_GEM_DOMAIN_GTT,
-			NULL);
-	if (ret) {
-		pr_err("Failed to pin bo. ret %d\n", ret);
-		amdgpu_bo_unreserve(bo);
-		mutex_unlock(&mem->lock);
-		return ret;
-	}
-
-	ret = amdgpu_bo_kmap(bo, kptr);
-	if (ret) {
-		pr_err("Failed to map bo to kernel. ret %d\n", ret);
-		amdgpu_bo_unpin(bo);
-		amdgpu_bo_unreserve(bo);
-		mutex_unlock(&mem->lock);
-		return ret;
-	}
-
-	mem->kptr = *kptr;
+	ret = __map_bo_to_kernel(bo, AMDGPU_GEM_DOMAIN_GTT, kptr);
+	if (!ret)
+		mem->kptr = *kptr;
 
-	amdgpu_bo_unreserve(bo);
 	mutex_unlock(&mem->lock);
 
-	return 0;
+	return ret;
 }
 
 static int pin_bo_wo_map(struct kgd_mem *mem)
-- 
2.7.4