aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amdfalconx86/recipes-graphics/drm/files/0038-amdgpu-reserve-SVM-range-explicitly-by-clients-v3.patch
blob: 34cb4fd3fa99969fffd08c43d8aa085f49a1bead (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
From f639b2e37ecdcc49b4dbaf1dedac51ecabf7e20e Mon Sep 17 00:00:00 2001
From: Jammy Zhou <Jammy.Zhou@amd.com>
Date: Tue, 10 Nov 2015 21:17:22 +0800
Subject: [PATCH 038/117] amdgpu: reserve SVM range explicitly by clients (v3)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The SVM range is only used by OCL 2.0 now, and it shouldn't be
reserved when only other clients are used. With this change:

amdgpu_svm_init() should be called to reserve the SVM range
amdgpu_svm_deinit() should be called to unreserve this range

v3: fix a typo
v2: update the unit test as well

Change-Id: Ia2495c3471a0c71c6b05fd81d84d5acfaf9a0a4c
Signed-off-by: Jammy Zhou <Jammy.Zhou@amd.com>
Reviewed-by: Michel Dänzer <michel.daenzer@amd.com>
---
 amdgpu/amdgpu.h            | 21 +++++++++++++++++++++
 amdgpu/amdgpu_device.c     |  3 ---
 amdgpu/amdgpu_internal.h   |  3 ---
 amdgpu/amdgpu_vamgr.c      |  4 ++--
 tests/amdgpu/basic_tests.c | 14 ++++++++++++++
 5 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/amdgpu/amdgpu.h b/amdgpu/amdgpu.h
index 79314fb..1db47c3 100644
--- a/amdgpu/amdgpu.h
+++ b/amdgpu/amdgpu.h
@@ -1240,6 +1240,27 @@ int amdgpu_bo_va_op(amdgpu_bo_handle bo,
 		    uint32_t ops);
 
 /**
+ * Reserve the virtual address range for SVM support
+ *
+ * \param amdgpu_device_handle
+ *
+ * \return   0 on success\n
+ *          <0 - Negative POSIX Error code
+ *
+*/
+int amdgpu_svm_init(amdgpu_device_handle dev);
+
+/**
+ * Free the virtual address range for SVM support
+ *
+ * \param amdgpu_device_handle
+ *
+ * \return
+ *
+*/
+void amdgpu_svm_deinit(amdgpu_device_handle dev);
+
+/**
  *  Commit SVM allocation in a process
  *
  * \param va_range_handle - \c [in] Handle of SVM allocation
diff --git a/amdgpu/amdgpu_device.c b/amdgpu/amdgpu_device.c
index b1a7182..b517b1a 100644
--- a/amdgpu/amdgpu_device.c
+++ b/amdgpu/amdgpu_device.c
@@ -130,7 +130,6 @@ static int amdgpu_get_auth(int fd, int *auth)
 
 static void amdgpu_device_free_internal(amdgpu_device_handle dev)
 {
-	amdgpu_svm_vamgr_deinit(dev);
 	amdgpu_vamgr_deinit(&dev->vamgr_32);
 	amdgpu_vamgr_deinit(&dev->vamgr);
 	util_hash_table_destroy(dev->bo_flink_names);
@@ -267,8 +266,6 @@ int amdgpu_device_initialize(int fd,
 	amdgpu_vamgr_init(&dev->vamgr_32, start, max,
 			  dev->dev_info.virtual_address_alignment);
 
-	amdgpu_svm_vamgr_init(dev);
-
 	*major_version = dev->major_version;
 	*minor_version = dev->minor_version;
 	*device_handle = dev;
diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h
index caec2a2..3760f94 100644
--- a/amdgpu/amdgpu_internal.h
+++ b/amdgpu/amdgpu_internal.h
@@ -153,9 +153,6 @@ amdgpu_vamgr_find_va(struct amdgpu_bo_va_mgr *mgr, uint64_t size,
 drm_private void
 amdgpu_vamgr_free_va(struct amdgpu_bo_va_mgr *mgr, uint64_t va, uint64_t size);
 
-int amdgpu_svm_vamgr_init(struct amdgpu_device *dev);
-void amdgpu_svm_vamgr_deinit(struct amdgpu_device *dev);
-
 drm_private int amdgpu_query_gpu_info_init(amdgpu_device_handle dev);
 
 drm_private uint64_t amdgpu_cs_calculate_timeout(uint64_t timeout);
diff --git a/amdgpu/amdgpu_vamgr.c b/amdgpu/amdgpu_vamgr.c
index 64a3543..973274d 100644
--- a/amdgpu/amdgpu_vamgr.c
+++ b/amdgpu/amdgpu_vamgr.c
@@ -317,7 +317,7 @@ int amdgpu_va_range_free(amdgpu_va_handle va_range_handle)
  *          <0 - Negative POSIX Error code
  *
  */
-int amdgpu_svm_vamgr_init(struct amdgpu_device *dev)
+int amdgpu_svm_init(amdgpu_device_handle dev)
 {
 	uint64_t start;
 	uint64_t end;
@@ -401,7 +401,7 @@ int amdgpu_svm_vamgr_init(struct amdgpu_device *dev)
 	return ret;
 }
 
-void amdgpu_svm_vamgr_deinit(struct amdgpu_device *dev)
+void amdgpu_svm_deinit(amdgpu_device_handle dev)
 {
 	if (atomic_dec_and_test(&vamgr_svm.refcount)) {
 		/* This is the last device referencing SVM. */
diff --git a/tests/amdgpu/basic_tests.c b/tests/amdgpu/basic_tests.c
index ec68dac..408a432 100644
--- a/tests/amdgpu/basic_tests.c
+++ b/tests/amdgpu/basic_tests.c
@@ -1265,6 +1265,9 @@ static void amdgpu_svm_test(void)
 	uint64_t end;
 	int i;
 
+	r = amdgpu_svm_init(device_handle);
+	CU_ASSERT_EQUAL(r, 0);
+
 	r = amdgpu_va_range_query(device_handle,
 		amdgpu_gpu_va_range_svm, &start, &end);
 	CU_ASSERT_EQUAL(r, 0);
@@ -1299,6 +1302,8 @@ static void amdgpu_svm_test(void)
 		r = amdgpu_va_range_free(va_handle[i]);
 		CU_ASSERT_EQUAL(r, 0);
 	}
+
+	amdgpu_svm_deinit(device_handle);
 }
 
 static void amdgpu_multi_svm_test(void)
@@ -1315,11 +1320,17 @@ static void amdgpu_multi_svm_test(void)
 	device_handles[0] = device_handle;
 	num_devices = amdgpu_num_devices();
 
+	r = amdgpu_svm_init(device_handles[0]);
+	CU_ASSERT_EQUAL(r, 0);
+
 	for (i = 1; i < num_devices; i++)
 		if (drm_amdgpu[i] > 0) {
 			r = amdgpu_device_initialize(drm_amdgpu[i], &major_version,
 					&minor_version, &device_handles[i]);
 			CU_ASSERT_EQUAL(r, 0);
+
+			r = amdgpu_svm_init(device_handles[i]);
+			CU_ASSERT_EQUAL(r, 0);
 		}
 
 	amdgpu_vprintf("\n");
@@ -1362,7 +1373,10 @@ static void amdgpu_multi_svm_test(void)
 
 	for (i = 1; i < num_devices; i++)
 		if (drm_amdgpu[i] > 0) {
+			amdgpu_svm_deinit(device_handles[i]);
 			r = amdgpu_device_deinitialize(device_handles[i]);
 			CU_ASSERT_EQUAL(r, 0);
 		}
+
+	amdgpu_svm_deinit(device_handles[0]);
 }
-- 
2.7.4