blob: c510c1cfe3bb5a65895321a55c1fdf52390da11f [file] [log] [blame]
Maarten Lankhorst45200252012-08-13 15:57:57 +02001/* wierd use of API tests */
2
3/* test1- export buffer from intel, import same fd twice into nouveau,
4 check handles match
5 test2 - export buffer from intel, import fd once, close fd, try import again
6 fail if it succeeds
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
9*/
10
11#include <stdio.h>
12#include <stdlib.h>
13#include <unistd.h>
14#include <fcntl.h>
15#include <sys/stat.h>
16
17#include "intel_bufmgr.h"
18#include "nouveau.h"
19#include "intel_gpu_tools.h"
20#include "intel_batchbuffer.h"
Daniel Vetterc28b8982013-07-15 10:51:10 +020021#include "drmtest.h"
Daniel Vettere49ceb82014-03-22 21:07:37 +010022#include "intel_chipset.h"
Maarten Lankhorst45200252012-08-13 15:57:57 +020023
24#define BO_SIZE (256*1024)
25
26int intel_fd = -1, intel_fd2 = -1, nouveau_fd = -1, nouveau_fd2 = -1;
27drm_intel_bufmgr *bufmgr;
28drm_intel_bufmgr *bufmgr2;
29struct nouveau_device *ndev, *ndev2;
30struct nouveau_client *nclient, *nclient2;
31uint32_t devid;
32struct intel_batchbuffer *intel_batch;
33
34static int find_and_open_devices(void)
35{
36 int i;
37 char path[80];
38 struct stat buf;
39 FILE *fl;
40 char vendor_id[8];
41 int venid;
42 for (i = 0; i < 9; i++) {
Imre Deak0bf5fd82012-10-10 16:04:44 +030043 char *ret;
44
Maarten Lankhorst45200252012-08-13 15:57:57 +020045 sprintf(path, "/sys/class/drm/card%d/device/vendor", i);
46 if (stat(path, &buf))
47 break;
48
49 fl = fopen(path, "r");
50 if (!fl)
51 break;
52
Imre Deak0bf5fd82012-10-10 16:04:44 +030053 ret = fgets(vendor_id, 8, fl);
Daniel Vetter83440952013-08-13 12:35:58 +020054 igt_assert(ret);
Maarten Lankhorst45200252012-08-13 15:57:57 +020055 fclose(fl);
56
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);
61 if (!intel_fd)
62 return -1;
63 intel_fd2 = open(path, O_RDWR);
64 if (!intel_fd2)
65 return -1;
66 } else if (venid == 0x10de) {
67 nouveau_fd = open(path, O_RDWR);
68 if (!nouveau_fd)
69 return -1;
70 nouveau_fd2 = open(path, O_RDWR);
71 if (!nouveau_fd2)
72 return -1;
73 }
74 }
75 return 0;
76}
77
Daniel Vetter4a9d50d2013-07-15 11:04:20 +020078static int test_i915_nv_import_twice(void)
Maarten Lankhorst45200252012-08-13 15:57:57 +020079{
80 int ret;
81 drm_intel_bo *test_intel_bo;
82 int prime_fd;
83 struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
84
85 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
86
87 ret = drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd);
88 if (ret)
89 goto out;
90
91 ret = nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo);
92 if (ret < 0) {
93 close(prime_fd);
94 goto out;
95 }
96 ret = nouveau_bo_prime_handle_ref(ndev2, prime_fd, &nvbo2);
97 close(prime_fd);
98 if (ret < 0)
99 goto out;
Maarten Lankhorst45200252012-08-13 15:57:57 +0200100out:
101 nouveau_bo_ref(NULL, &nvbo2);
102 nouveau_bo_ref(NULL, &nvbo);
103 drm_intel_bo_unreference(test_intel_bo);
104 return ret;
105}
106
107
Daniel Vetter05cc5152013-07-15 11:55:09 +0200108static int test_i915_nv_import_twice_check_flink_name(void)
109{
110 int ret;
111 drm_intel_bo *test_intel_bo;
112 int prime_fd;
113 struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
114 uint32_t flink_name1, flink_name2;
115
116 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
117
118 ret = drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd);
119 if (ret)
120 goto out;
121
122 ret = nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo);
123 if (ret < 0) {
124 close(prime_fd);
125 goto out;
126 }
127 ret = nouveau_bo_prime_handle_ref(ndev2, prime_fd, &nvbo2);
128 close(prime_fd);
129 if (ret < 0)
130 goto out;
131
132 ret = nouveau_bo_name_get(nvbo, &flink_name1);
133 if (ret < 0)
134 goto out;
135 ret = nouveau_bo_name_get(nvbo2, &flink_name2);
136 if (ret < 0)
137 goto out;
138
139 if (flink_name1 != flink_name2) {
140 fprintf(stderr, "flink names don't match\n");
141 ret = -1;
142 }
143
144out:
145 nouveau_bo_ref(NULL, &nvbo2);
146 nouveau_bo_ref(NULL, &nvbo);
147 drm_intel_bo_unreference(test_intel_bo);
148 return ret;
149}
150
151
152static int test_i915_nv_reimport_twice_check_flink_name(void)
153{
154 int ret;
155 drm_intel_bo *test_intel_bo;
156 int prime_fd;
157 struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
158 uint32_t flink_name1, flink_name2;
159
160 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
161
162 ret = drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd);
163 if (ret)
164 goto out;
165
166 ret = nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo);
167 if (ret < 0) {
168 close(prime_fd);
169 goto out;
170 }
171
172 /* create a new dma-buf */
173 close(prime_fd);
174 ret = drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd);
175 if (ret)
176 goto out;
177
178 ret = nouveau_bo_prime_handle_ref(ndev2, prime_fd, &nvbo2);
179 if (ret < 0)
180 goto out;
181 close(prime_fd);
182
183 ret = nouveau_bo_name_get(nvbo, &flink_name1);
184 if (ret < 0)
185 goto out;
186 ret = nouveau_bo_name_get(nvbo2, &flink_name2);
187 if (ret < 0)
188 goto out;
189
190 if (flink_name1 != flink_name2) {
191 fprintf(stderr, "flink names don't match\n");
192 ret = -1;
193 }
194
195out:
196 nouveau_bo_ref(NULL, &nvbo2);
197 nouveau_bo_ref(NULL, &nvbo);
198 drm_intel_bo_unreference(test_intel_bo);
199 return ret;
200}
201
202
203static int test_nv_i915_import_twice_check_flink_name(void)
204{
205 int ret;
206 drm_intel_bo *intel_bo = NULL, *intel_bo2 = NULL;
207 int prime_fd;
208 struct nouveau_bo *nvbo = NULL;
209 uint32_t flink_name1, flink_name2;
210
211 ret = nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
212 0, BO_SIZE, NULL, &nvbo);
213 if (ret < 0)
214 return ret;
215
216 ret = nouveau_bo_set_prime(nvbo, &prime_fd);
217 if (ret < 0)
218 return ret;
219
220 intel_bo = drm_intel_bo_gem_create_from_prime(bufmgr, prime_fd, BO_SIZE);
221 if (!intel_bo) {
222 ret = -1;
223 goto out;
224 }
225
226 intel_bo2 = drm_intel_bo_gem_create_from_prime(bufmgr2, prime_fd, BO_SIZE);
227 if (!intel_bo2) {
228 ret = -1;
229 goto out;
230 }
231 close(prime_fd);
232
233 ret = drm_intel_bo_flink(intel_bo, &flink_name1);
234 if (ret < 0)
235 goto out;
236 ret = drm_intel_bo_flink(intel_bo2, &flink_name2);
237 if (ret < 0)
238 goto out;
239
240 if (flink_name1 != flink_name2) {
241 fprintf(stderr, "flink names don't match\n");
242 ret = -1;
243 }
244
245out:
246 nouveau_bo_ref(NULL, &nvbo);
247 drm_intel_bo_unreference(intel_bo);
248 drm_intel_bo_unreference(intel_bo2);
249 return ret;
250}
251
252
253static int test_nv_i915_reimport_twice_check_flink_name(void)
254{
255 int ret;
256 drm_intel_bo *intel_bo = NULL, *intel_bo2 = NULL;
257 int prime_fd;
258 struct nouveau_bo *nvbo = NULL;
259 uint32_t flink_name1, flink_name2;
260
261 ret = nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
262 0, BO_SIZE, NULL, &nvbo);
263 if (ret < 0)
264 return ret;
265
266 ret = nouveau_bo_set_prime(nvbo, &prime_fd);
267 if (ret < 0)
268 return ret;
269
270 intel_bo = drm_intel_bo_gem_create_from_prime(bufmgr, prime_fd, BO_SIZE);
271 if (!intel_bo) {
272 ret = -1;
273 goto out;
274 }
275 close(prime_fd);
276 ret = nouveau_bo_set_prime(nvbo, &prime_fd);
277 if (ret < 0)
278 goto out;
279
280
281 intel_bo2 = drm_intel_bo_gem_create_from_prime(bufmgr2, prime_fd, BO_SIZE);
282 if (!intel_bo2) {
283 ret = -1;
284 goto out;
285 }
286 close(prime_fd);
287
288 ret = drm_intel_bo_flink(intel_bo, &flink_name1);
289 if (ret < 0)
290 goto out;
291 ret = drm_intel_bo_flink(intel_bo2, &flink_name2);
292 if (ret < 0)
293 goto out;
294
295 if (flink_name1 != flink_name2) {
296 fprintf(stderr, "flink names don't match\n");
297 ret = -1;
298 }
299
300out:
301 nouveau_bo_ref(NULL, &nvbo);
302 drm_intel_bo_unreference(intel_bo);
303 drm_intel_bo_unreference(intel_bo2);
304 return ret;
305}
306
307
Daniel Vetter4a9d50d2013-07-15 11:04:20 +0200308static int test_i915_nv_import_vs_close(void)
Maarten Lankhorst45200252012-08-13 15:57:57 +0200309{
310 int ret;
311 drm_intel_bo *test_intel_bo;
312 int prime_fd;
313 struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
314
315 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
316
317 ret = drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd);
318 if (ret < 0)
319 goto out;
320
321 ret = nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo);
322 close(prime_fd);
323 if (ret < 0)
324 goto out;
325 ret = nouveau_bo_prime_handle_ref(ndev2, prime_fd, &nvbo2);
326 if (ret == 0)
327 ret = -1;
328 else
329 ret = 0;
330
331out:
332 nouveau_bo_ref(NULL, &nvbo2);
333 nouveau_bo_ref(NULL, &nvbo);
334 drm_intel_bo_unreference(test_intel_bo);
335 return ret;
336}
337
338
339/* import handle twice on one driver */
Daniel Vetter4a9d50d2013-07-15 11:04:20 +0200340static int test_i915_nv_double_import(void)
Maarten Lankhorst45200252012-08-13 15:57:57 +0200341{
342 int ret;
343 drm_intel_bo *test_intel_bo;
344 int prime_fd;
345 struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
346
347 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
348
349 ret = drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd);
350 if (ret < 0)
351 goto out;
352
353 ret = nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo);
354 if (ret < 0) {
355 close(prime_fd);
356 goto out;
357 }
358 ret = nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo2);
359 close(prime_fd);
360 if (ret < 0)
361 goto out;
362
363 if (nvbo->handle != nvbo2->handle)
364 ret = -1;
365
366out:
367 nouveau_bo_ref(NULL, &nvbo2);
368 nouveau_bo_ref(NULL, &nvbo);
369 drm_intel_bo_unreference(test_intel_bo);
370 return ret;
371}
372
373/* export handle twice from one driver - import twice
374 see if we get same object */
Daniel Vetter4a9d50d2013-07-15 11:04:20 +0200375static int test_i915_nv_double_export(void)
Maarten Lankhorst45200252012-08-13 15:57:57 +0200376{
377 int ret;
378 drm_intel_bo *test_intel_bo;
379 int prime_fd, prime_fd2;
380 struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
381
382 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
383
384 drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd);
385
386 drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd2);
387
388 ret = nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo);
389 close(prime_fd);
390 if (ret >= 0)
391 ret = nouveau_bo_prime_handle_ref(ndev, prime_fd2, &nvbo2);
392 close(prime_fd2);
393 if (ret < 0)
394 goto out;
395
396 if (nvbo->handle != nvbo2->handle)
397 ret = -1;
398
399out:
400 nouveau_bo_ref(NULL, &nvbo2);
401 nouveau_bo_ref(NULL, &nvbo);
402 drm_intel_bo_unreference(test_intel_bo);
403 return ret;
404}
405
406/* export handle from intel driver - reimport to intel driver
407 see if you get same object */
Daniel Vetter4a9d50d2013-07-15 11:04:20 +0200408static int test_i915_self_import(void)
Maarten Lankhorst45200252012-08-13 15:57:57 +0200409{
410 int ret;
411 drm_intel_bo *test_intel_bo, *test_intel_bo2;
412 int prime_fd;
413
414 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
415
416 drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd);
417
418 test_intel_bo2 = drm_intel_bo_gem_create_from_prime(bufmgr, prime_fd, BO_SIZE);
419 close(prime_fd);
420 if (!test_intel_bo2) {
421 ret = -1;
422 goto out;
423 }
424
425 ret = 0;
426 if (test_intel_bo->handle != test_intel_bo2->handle)
427 ret = -1;
428
429out:
430 drm_intel_bo_unreference(test_intel_bo);
431 return ret;
432}
433
434/* nouveau export reimport test */
Daniel Vetter4a9d50d2013-07-15 11:04:20 +0200435static int test_nv_self_import(void)
Maarten Lankhorst45200252012-08-13 15:57:57 +0200436{
437 int ret;
438 int prime_fd;
439 struct nouveau_bo *nvbo, *nvbo2;
440
441 ret = nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
442 0, BO_SIZE, NULL, &nvbo);
443 if (ret < 0)
444 return ret;
445 ret = nouveau_bo_set_prime(nvbo, &prime_fd);
446 if (ret < 0)
447 return ret;
448
449 ret = nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo2);
450 close(prime_fd);
451 if (ret < 0)
452 return ret;
453
454 if (nvbo->handle != nvbo2->handle)
455 fprintf(stderr,"mismatch handles %d %d\n", nvbo->handle, nvbo2->handle);
456 nouveau_bo_ref(NULL, &nvbo);
457 nouveau_bo_ref(NULL, &nvbo2);
458 return 0;
459}
460
461/* export handle from intel driver - reimport to another intel driver bufmgr
462 see if you get same object */
Daniel Vetter4a9d50d2013-07-15 11:04:20 +0200463static int test_i915_self_import_to_different_fd(void)
Maarten Lankhorst45200252012-08-13 15:57:57 +0200464{
465 int ret;
466 drm_intel_bo *test_intel_bo, *test_intel_bo2;
467 int prime_fd;
468
469 test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
470
471 drm_intel_bo_gem_export_to_prime(test_intel_bo, &prime_fd);
472
473 test_intel_bo2 = drm_intel_bo_gem_create_from_prime(bufmgr2, prime_fd, BO_SIZE);
474 close(prime_fd);
475 if (!test_intel_bo2) {
476 ret = -1;
477 goto out;
478 }
479
480 ret = 0;
481 /* not sure what to test for, just that we don't explode */
482out:
483 drm_intel_bo_unreference(test_intel_bo2);
484 drm_intel_bo_unreference(test_intel_bo);
485 return ret;
486}
487
488/* nouveau export reimport to other driver test */
Daniel Vetter4a9d50d2013-07-15 11:04:20 +0200489static int test_nv_self_import_to_different_fd(void)
Maarten Lankhorst45200252012-08-13 15:57:57 +0200490{
491 int ret;
492 int prime_fd;
493 struct nouveau_bo *nvbo, *nvbo2;
494
495 ret = nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
496 0, BO_SIZE, NULL, &nvbo);
497 if (ret < 0)
498 return ret;
499 ret = nouveau_bo_set_prime(nvbo, &prime_fd);
500 if (ret < 0)
501 return ret;
502
503 ret = nouveau_bo_prime_handle_ref(ndev2, prime_fd, &nvbo2);
504 close(prime_fd);
505 if (ret < 0)
506 return ret;
507
508 /* not sure what to test for, just make sure we don't explode */
509 nouveau_bo_ref(NULL, &nvbo);
510 nouveau_bo_ref(NULL, &nvbo2);
511 return 0;
512}
513
Daniel Vetter071e9ca2013-10-31 16:23:26 +0100514igt_main
Maarten Lankhorst45200252012-08-13 15:57:57 +0200515{
Daniel Vetterb3880d32013-08-14 18:02:46 +0200516 igt_fixture {
517 igt_assert(find_and_open_devices() == 0);
Maarten Lankhorst45200252012-08-13 15:57:57 +0200518
Daniel Vetterb3880d32013-08-14 18:02:46 +0200519 igt_require(nouveau_fd != -1);
520 igt_require(nouveau_fd2 != -1);
521 igt_require(intel_fd != -1);
522 igt_require(intel_fd2 != -1);
523
524 /* set up intel bufmgr */
525 bufmgr = drm_intel_bufmgr_gem_init(intel_fd, 4096);
526 igt_assert(bufmgr);
527 /* Do not enable reuse, we share (almost) all buffers. */
528 //drm_intel_bufmgr_gem_enable_reuse(bufmgr);
529
530 bufmgr2 = drm_intel_bufmgr_gem_init(intel_fd2, 4096);
Daniel Vetterec834c92013-08-14 22:24:43 +0200531 igt_assert(bufmgr2);
Daniel Vetterb3880d32013-08-14 18:02:46 +0200532 drm_intel_bufmgr_gem_enable_reuse(bufmgr2);
533
534 /* set up nouveau bufmgr */
535 igt_assert(nouveau_device_wrap(nouveau_fd, 0, &ndev) >= 0);
536 igt_assert(nouveau_client_new(ndev, &nclient) >= 0);
537
538 /* set up nouveau bufmgr */
539 igt_assert(nouveau_device_wrap(nouveau_fd2, 0, &ndev2) >= 0);
540
541 igt_assert(nouveau_client_new(ndev2, &nclient2) >= 0);;
542
543 /* set up an intel batch buffer */
544 devid = intel_get_drm_devid(intel_fd);
545 intel_batch = intel_batchbuffer_alloc(bufmgr, devid);
546 igt_assert(intel_batch);
Maarten Lankhorst45200252012-08-13 15:57:57 +0200547 }
548
Daniel Vetter4a9d50d2013-07-15 11:04:20 +0200549#define xtest(name) \
Daniel Vetter1caaf0a2013-08-12 12:17:35 +0200550 igt_subtest(#name) \
Daniel Vetter4a9d50d2013-07-15 11:04:20 +0200551 if (test_##name()) \
Daniel Vetter5e25fcc2013-08-13 12:56:06 +0200552 igt_fail(2);
Maarten Lankhorst45200252012-08-13 15:57:57 +0200553
Daniel Vetter4a9d50d2013-07-15 11:04:20 +0200554 xtest(i915_nv_import_twice);
Daniel Vetter05cc5152013-07-15 11:55:09 +0200555 xtest(i915_nv_import_twice_check_flink_name);
556 xtest(i915_nv_reimport_twice_check_flink_name);
557 xtest(nv_i915_import_twice_check_flink_name);
558 xtest(nv_i915_reimport_twice_check_flink_name);
Daniel Vetter4a9d50d2013-07-15 11:04:20 +0200559 xtest(i915_nv_import_vs_close);
560 xtest(i915_nv_double_import);
561 xtest(i915_nv_double_export);
562 xtest(i915_self_import);
563 xtest(nv_self_import);
564 xtest(i915_self_import_to_different_fd);
565 xtest(nv_self_import_to_different_fd);
566
Daniel Vetterb3880d32013-08-14 18:02:46 +0200567 igt_fixture {
568 intel_batchbuffer_free(intel_batch);
Maarten Lankhorst45200252012-08-13 15:57:57 +0200569
Daniel Vetterb3880d32013-08-14 18:02:46 +0200570 nouveau_device_del(&ndev);
571 drm_intel_bufmgr_destroy(bufmgr);
Maarten Lankhorst45200252012-08-13 15:57:57 +0200572
Daniel Vetterb3880d32013-08-14 18:02:46 +0200573 close(intel_fd);
574 close(nouveau_fd);
575 }
Maarten Lankhorst45200252012-08-13 15:57:57 +0200576}