1 /* wierd use of API tests */
3 /* test1- export buffer from intel, import same fd twice into nouveau,
5 test2 - export buffer from intel, import fd once, close fd, try import again
7 test3 - export buffer from intel, import twice on nouveau, check handle is the same
8 test4 - export handle twice from intel, import into nouveau twice, check handle is the same
17 #include "intel_bufmgr.h"
20 #include "intel_batchbuffer.h"
22 #include "intel_chipset.h"
24 #define BO_SIZE (256*1024)
26 int intel_fd = -1, intel_fd2 = -1, nouveau_fd = -1, nouveau_fd2 = -1;
27 drm_intel_bufmgr *bufmgr;
28 drm_intel_bufmgr *bufmgr2;
29 struct nouveau_device *ndev, *ndev2;
30 struct nouveau_client *nclient, *nclient2;
32 struct intel_batchbuffer *intel_batch;
34 static void find_and_open_devices(void)
42 for (i = 0; i < 9; i++) {
45 sprintf(path, "/sys/class/drm/card%d/device/vendor", i);
49 fl = fopen(path, "r");
53 ret = fgets(vendor_id, 8, fl);
57 venid = strtoul(vendor_id, NULL, 16);
58 sprintf(path, "/dev/dri/card%d", i);
59 if (venid == 0x8086) {
60 intel_fd = open(path, O_RDWR);
62 intel_fd2 = open(path, O_RDWR);
63 igt_assert(intel_fd2);
64 } else if (venid == 0x10de) {
65 nouveau_fd = open(path, O_RDWR);
66 igt_assert(nouveau_fd);
67 nouveau_fd2 = open(path, O_RDWR);
68 igt_assert(nouveau_fd2);
73 static void test_i915_nv_import_twice(void)
75 drm_intel_bo *test_intel_bo;
77 struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
79 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
81 igt_assert(drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd) == 0);
83 igt_assert(nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo) == 0);
84 igt_assert(nouveau_bo_prime_handle_ref(ndev2, prime_fd, &nvbo2) == 0);
87 nouveau_bo_ref(NULL, &nvbo2);
88 nouveau_bo_ref(NULL, &nvbo);
89 drm_intel_bo_unreference(test_intel_bo);
92 static void test_i915_nv_import_twice_check_flink_name(void)
94 drm_intel_bo *test_intel_bo;
96 struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
97 uint32_t flink_name1, flink_name2;
99 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
101 igt_assert(drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd) == 0);
103 igt_assert(nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo) == 0);
104 igt_assert(nouveau_bo_prime_handle_ref(ndev2, prime_fd, &nvbo2) == 0);
107 igt_assert(nouveau_bo_name_get(nvbo, &flink_name1) == 0);
108 igt_assert(nouveau_bo_name_get(nvbo2, &flink_name2) == 0);
110 igt_assert(flink_name1 == flink_name2);
112 nouveau_bo_ref(NULL, &nvbo2);
113 nouveau_bo_ref(NULL, &nvbo);
114 drm_intel_bo_unreference(test_intel_bo);
117 static void test_i915_nv_reimport_twice_check_flink_name(void)
119 drm_intel_bo *test_intel_bo;
121 struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
122 uint32_t flink_name1, flink_name2;
124 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
126 igt_assert(drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd) == 0);
128 igt_assert(nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo) == 0);
130 /* create a new dma-buf */
132 igt_assert(drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd) == 0);
134 igt_assert(nouveau_bo_prime_handle_ref(ndev2, prime_fd, &nvbo2) == 0);
137 igt_assert(nouveau_bo_name_get(nvbo, &flink_name1) == 0);
138 igt_assert(nouveau_bo_name_get(nvbo2, &flink_name2) == 0);
140 igt_assert(flink_name1 == flink_name2);
142 nouveau_bo_ref(NULL, &nvbo2);
143 nouveau_bo_ref(NULL, &nvbo);
144 drm_intel_bo_unreference(test_intel_bo);
147 static void test_nv_i915_import_twice_check_flink_name(void)
149 drm_intel_bo *intel_bo = NULL, *intel_bo2 = NULL;
151 struct nouveau_bo *nvbo = NULL;
152 uint32_t flink_name1, flink_name2;
154 igt_assert(nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
155 0, BO_SIZE, NULL, &nvbo) == 0);
157 igt_assert(nouveau_bo_set_prime(nvbo, &prime_fd) == 0);
159 intel_bo = drm_intel_bo_gem_create_from_prime(bufmgr, prime_fd, BO_SIZE);
160 igt_assert(intel_bo);
162 intel_bo2 = drm_intel_bo_gem_create_from_prime(bufmgr2, prime_fd, BO_SIZE);
163 igt_assert(intel_bo2);
166 igt_assert(drm_intel_bo_flink(intel_bo, &flink_name1) == 0);
167 igt_assert(drm_intel_bo_flink(intel_bo2, &flink_name2) == 0);
169 igt_assert(flink_name1 == flink_name2);
171 nouveau_bo_ref(NULL, &nvbo);
172 drm_intel_bo_unreference(intel_bo);
173 drm_intel_bo_unreference(intel_bo2);
176 static void test_nv_i915_reimport_twice_check_flink_name(void)
178 drm_intel_bo *intel_bo = NULL, *intel_bo2 = NULL;
180 struct nouveau_bo *nvbo = NULL;
181 uint32_t flink_name1, flink_name2;
183 igt_assert(nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
184 0, BO_SIZE, NULL, &nvbo) == 0);
186 igt_assert(nouveau_bo_set_prime(nvbo, &prime_fd) == 0);
188 intel_bo = drm_intel_bo_gem_create_from_prime(bufmgr, prime_fd, BO_SIZE);
189 igt_assert(intel_bo);
191 igt_assert(nouveau_bo_set_prime(nvbo, &prime_fd) == 0);
193 intel_bo2 = drm_intel_bo_gem_create_from_prime(bufmgr2, prime_fd, BO_SIZE);
194 igt_assert(intel_bo2);
197 igt_assert(drm_intel_bo_flink(intel_bo, &flink_name1) == 0);
198 igt_assert(drm_intel_bo_flink(intel_bo2, &flink_name2) == 0);
200 igt_assert(flink_name1 == flink_name2);
202 nouveau_bo_ref(NULL, &nvbo);
203 drm_intel_bo_unreference(intel_bo);
204 drm_intel_bo_unreference(intel_bo2);
207 static void test_i915_nv_import_vs_close(void)
209 drm_intel_bo *test_intel_bo;
211 struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
213 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
214 igt_assert(test_intel_bo);
216 igt_assert(drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd) == 0);
218 igt_assert(nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo) == 0);
220 igt_assert(nouveau_bo_prime_handle_ref(ndev2, prime_fd, &nvbo2) < 0);
222 nouveau_bo_ref(NULL, &nvbo2);
223 nouveau_bo_ref(NULL, &nvbo);
224 drm_intel_bo_unreference(test_intel_bo);
227 /* import handle twice on one driver */
228 static void test_i915_nv_double_import(void)
230 drm_intel_bo *test_intel_bo;
232 struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
234 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
235 igt_assert(test_intel_bo);
237 igt_assert(drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd) == 0);
239 igt_assert(nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo) == 0);
240 igt_assert(nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo2) == 0);
243 igt_assert(nvbo->handle == nvbo2->handle);
245 nouveau_bo_ref(NULL, &nvbo2);
246 nouveau_bo_ref(NULL, &nvbo);
247 drm_intel_bo_unreference(test_intel_bo);
250 /* export handle twice from one driver - import twice
251 see if we get same object */
252 static void test_i915_nv_double_export(void)
254 drm_intel_bo *test_intel_bo;
255 int prime_fd, prime_fd2;
256 struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
258 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
259 igt_assert(test_intel_bo);
261 drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd);
263 drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd2);
265 igt_assert(nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo) == 0);
267 igt_assert(nouveau_bo_prime_handle_ref(ndev, prime_fd2, &nvbo2) == 0);
270 igt_assert(nvbo->handle == nvbo2->handle);
272 nouveau_bo_ref(NULL, &nvbo2);
273 nouveau_bo_ref(NULL, &nvbo);
274 drm_intel_bo_unreference(test_intel_bo);
277 /* export handle from intel driver - reimport to intel driver
278 see if you get same object */
279 static void test_i915_self_import(void)
281 drm_intel_bo *test_intel_bo, *test_intel_bo2;
284 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
286 drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd);
288 test_intel_bo2 = drm_intel_bo_gem_create_from_prime(bufmgr, prime_fd, BO_SIZE);
290 igt_assert(test_intel_bo2);
292 igt_assert(test_intel_bo->handle == test_intel_bo2->handle);
294 drm_intel_bo_unreference(test_intel_bo);
297 /* nouveau export reimport test */
298 static void test_nv_self_import(void)
301 struct nouveau_bo *nvbo, *nvbo2;
303 igt_assert(nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
304 0, BO_SIZE, NULL, &nvbo) == 0);
305 igt_assert(nouveau_bo_set_prime(nvbo, &prime_fd) == 0);
307 igt_assert(nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo2) == 0);
310 igt_assert(nvbo->handle == nvbo2->handle);
311 nouveau_bo_ref(NULL, &nvbo);
312 nouveau_bo_ref(NULL, &nvbo2);
315 /* export handle from intel driver - reimport to another intel driver bufmgr
316 see if you get same object */
317 static void test_i915_self_import_to_different_fd(void)
319 drm_intel_bo *test_intel_bo, *test_intel_bo2;
322 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
324 drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd);
326 test_intel_bo2 = drm_intel_bo_gem_create_from_prime(bufmgr2, prime_fd, BO_SIZE);
328 igt_assert(test_intel_bo2);
330 drm_intel_bo_unreference(test_intel_bo2);
331 drm_intel_bo_unreference(test_intel_bo);
334 /* nouveau export reimport to other driver test */
335 static void test_nv_self_import_to_different_fd(void)
338 struct nouveau_bo *nvbo, *nvbo2;
340 igt_assert(nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
341 0, BO_SIZE, NULL, &nvbo) == 0);
342 igt_assert(nouveau_bo_set_prime(nvbo, &prime_fd) == 0);
344 igt_assert(nouveau_bo_prime_handle_ref(ndev2, prime_fd, &nvbo2) == 0);
347 /* not sure what to test for, just make sure we don't explode */
348 nouveau_bo_ref(NULL, &nvbo);
349 nouveau_bo_ref(NULL, &nvbo2);
355 find_and_open_devices();
357 igt_require(nouveau_fd != -1);
358 igt_require(nouveau_fd2 != -1);
359 igt_require(intel_fd != -1);
360 igt_require(intel_fd2 != -1);
362 /* set up intel bufmgr */
363 bufmgr = drm_intel_bufmgr_gem_init(intel_fd, 4096);
365 /* Do not enable reuse, we share (almost) all buffers. */
366 //drm_intel_bufmgr_gem_enable_reuse(bufmgr);
368 bufmgr2 = drm_intel_bufmgr_gem_init(intel_fd2, 4096);
370 drm_intel_bufmgr_gem_enable_reuse(bufmgr2);
372 /* set up nouveau bufmgr */
373 igt_assert(nouveau_device_wrap(nouveau_fd, 0, &ndev) >= 0);
374 igt_assert(nouveau_client_new(ndev, &nclient) >= 0);
376 /* set up nouveau bufmgr */
377 igt_assert(nouveau_device_wrap(nouveau_fd2, 0, &ndev2) >= 0);
379 igt_assert(nouveau_client_new(ndev2, &nclient2) >= 0);;
381 /* set up an intel batch buffer */
382 devid = intel_get_drm_devid(intel_fd);
383 intel_batch = intel_batchbuffer_alloc(bufmgr, devid);
384 igt_assert(intel_batch);
387 #define xtest(name) \
391 xtest(i915_nv_import_twice);
392 xtest(i915_nv_import_twice_check_flink_name);
393 xtest(i915_nv_reimport_twice_check_flink_name);
394 xtest(nv_i915_import_twice_check_flink_name);
395 xtest(nv_i915_reimport_twice_check_flink_name);
396 xtest(i915_nv_import_vs_close);
397 xtest(i915_nv_double_import);
398 xtest(i915_nv_double_export);
399 xtest(i915_self_import);
400 xtest(nv_self_import);
401 xtest(i915_self_import_to_different_fd);
402 xtest(nv_self_import_to_different_fd);
405 intel_batchbuffer_free(intel_batch);
407 nouveau_device_del(&ndev);
408 drm_intel_bufmgr_destroy(bufmgr);