summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2012-05-20 17:20:03 +0100
committerDave Airlie <airlied@redhat.com>2012-05-20 17:20:03 +0100
commite3fce518307254eeb5303d62c50d395193a9a5ac (patch)
tree73f6a8426ef00d114b1c5f6833ea44cbeec3f73a
parentfd6fe33a1908eaaac9216bc8a172087467c95628 (diff)
prime more bits
-rw-r--r--tests/prime_api.c155
-rw-r--r--tests/prime_test.c161
2 files changed, 286 insertions, 30 deletions
diff --git a/tests/prime_api.c b/tests/prime_api.c
index 9b865d6e..01bf1505 100644
--- a/tests/prime_api.c
+++ b/tests/prime_api.c
@@ -19,8 +19,11 @@
#include "intel_gpu_tools.h"
#include "intel_batchbuffer.h"
-int intel_fd = -1, nouveau_fd = -1, nouveau_fd2 = -1;
+#define BO_SIZE (256*1024)
+
+int intel_fd = -1, intel_fd2 = -1, nouveau_fd = -1, nouveau_fd2 = -1;
drm_intel_bufmgr *bufmgr;
+drm_intel_bufmgr *bufmgr2;
struct nouveau_device *ndev, *ndev2;
struct nouveau_client *nclient, *nclient2;
uint32_t devid;
@@ -52,6 +55,9 @@ static int find_and_open_devices(void)
intel_fd = open(path, O_RDWR);
if (!intel_fd)
return -1;
+ intel_fd2 = open(path, O_RDWR);
+ if (!intel_fd2)
+ return -1;
} else if (venid == 0x10de) {
nouveau_fd = open(path, O_RDWR);
if (!nouveau_fd)
@@ -69,9 +75,9 @@ static int test1(void)
int ret;
drm_intel_bo *test_intel_bo;
int prime_fd;
- struct nouveau_bo *nvbo, *nvbo2;
+ struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
- test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", 256*1024, 4096);
+ test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
drm_intel_bufmgr_gem_set_bo_prime(test_intel_bo, &prime_fd);
@@ -100,9 +106,9 @@ static int test2(void)
int ret;
drm_intel_bo *test_intel_bo;
int prime_fd;
- struct nouveau_bo *nvbo, *nvbo2;
+ struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
- test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", 256*1024, 4096);
+ test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
drm_intel_bufmgr_gem_set_bo_prime(test_intel_bo, &prime_fd);
@@ -111,6 +117,8 @@ static int test2(void)
ret = nouveau_bo_prime_handle_ref(ndev2, prime_fd, &nvbo2);
if (ret == 0)
ret = -1;
+ else
+ ret = 0;
nouveau_bo_ref(NULL, &nvbo2);
nouveau_bo_ref(NULL, &nvbo);
@@ -125,9 +133,9 @@ static int test3(void)
int ret;
drm_intel_bo *test_intel_bo;
int prime_fd;
- struct nouveau_bo *nvbo, *nvbo2;
+ struct nouveau_bo *nvbo = NULL, *nvbo2 = NULL;
- test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", 256*1024, 4096);
+ test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
drm_intel_bufmgr_gem_set_bo_prime(test_intel_bo, &prime_fd);
@@ -159,7 +167,7 @@ static int test4(void)
int prime_fd, prime_fd2;
struct nouveau_bo *nvbo, *nvbo2;
- test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", 256*1024, 4096);
+ test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
drm_intel_bufmgr_gem_set_bo_prime(test_intel_bo, &prime_fd);
@@ -175,8 +183,6 @@ static int test4(void)
if (ret < 0)
return ret;
- fprintf(stderr,"handles %d %d\n", nvbo->handle, nvbo2->handle);
-
if (nvbo->handle != nvbo2->handle)
ret = -1;
@@ -186,6 +192,114 @@ static int test4(void)
return ret;
}
+/* export handle from intel driver - reimport to intel driver
+ see if you get same object */
+static int test5(void)
+{
+ int ret;
+ drm_intel_bo *test_intel_bo, *test_intel_bo2;
+ int prime_fd;
+
+ test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
+
+ drm_intel_bufmgr_gem_set_bo_prime(test_intel_bo, &prime_fd);
+
+ test_intel_bo2 = drm_intel_bufmgr_gem_get_bo_prime(bufmgr, prime_fd, BO_SIZE);
+ close(prime_fd);
+ if (!test_intel_bo2) {
+ ret = -1;
+ goto out;
+ }
+
+ ret = 0;
+ if (test_intel_bo->handle != test_intel_bo2->handle)
+ ret = -1;
+
+out:
+ drm_intel_bo_unreference(test_intel_bo);
+ return ret;
+}
+
+/* nouveau export reimport test */
+static int test6(void)
+{
+ int ret;
+ int prime_fd;
+ struct nouveau_bo *nvbo, *nvbo2;
+
+ ret = nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
+ 0, BO_SIZE, NULL, &nvbo);
+ if (ret < 0)
+ return ret;
+ ret = nouveau_bo_set_prime(nvbo, &prime_fd);
+ if (ret < 0)
+ return ret;
+
+ ret = nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo2);
+ close(prime_fd);
+ if (ret < 0)
+ return ret;
+
+ if (nvbo->handle != nvbo2->handle)
+ fprintf(stderr,"mismatch handles %d %d\n", nvbo->handle, nvbo2->handle);
+ nouveau_bo_ref(NULL, &nvbo);
+ nouveau_bo_ref(NULL, &nvbo2);
+ return 0;
+}
+
+/* export handle from intel driver - reimport to another intel driver bufmgr
+ see if you get same object */
+static int test7(void)
+{
+ int ret;
+ drm_intel_bo *test_intel_bo, *test_intel_bo2;
+ int prime_fd;
+
+ test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
+
+ drm_intel_bufmgr_gem_set_bo_prime(test_intel_bo, &prime_fd);
+
+ test_intel_bo2 = drm_intel_bufmgr_gem_get_bo_prime(bufmgr2, prime_fd, BO_SIZE);
+ close(prime_fd);
+ if (!test_intel_bo2) {
+ ret = -1;
+ goto out;
+ }
+
+ ret = 0;
+ /* not sure what to test for, just that we don't explode */
+out:
+ drm_intel_bo_unreference(test_intel_bo2);
+ drm_intel_bo_unreference(test_intel_bo);
+ return ret;
+}
+
+/* nouveau export reimport to other driver test */
+static int test8(void)
+{
+ int ret;
+ int prime_fd;
+ struct nouveau_bo *nvbo, *nvbo2;
+
+ ret = nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
+ 0, BO_SIZE, NULL, &nvbo);
+ if (ret < 0)
+ return ret;
+ ret = nouveau_bo_set_prime(nvbo, &prime_fd);
+ if (ret < 0)
+ return ret;
+
+ ret = nouveau_bo_prime_handle_ref(ndev2, prime_fd, &nvbo2);
+ close(prime_fd);
+ if (ret < 0)
+ return ret;
+
+ /* not sure what to test for, just make sure we don't explode */
+ nouveau_bo_ref(NULL, &nvbo);
+ nouveau_bo_ref(NULL, &nvbo2);
+ return 0;
+}
+
int main(int argc, char **argv)
{
int ret;
@@ -194,7 +308,7 @@ int main(int argc, char **argv)
if (ret < 0)
return ret;
- if (nouveau_fd == -1 || intel_fd == -1 || nouveau_fd2 == -1) {
+ if (nouveau_fd == -1 || intel_fd == -1 || nouveau_fd2 == -1 || intel_fd2 == -1) {
fprintf(stderr,"failed to find intel and nouveau GPU\n");
return -1;
}
@@ -203,6 +317,9 @@ int main(int argc, char **argv)
bufmgr = drm_intel_bufmgr_gem_init(intel_fd, 4096);
drm_intel_bufmgr_gem_enable_reuse(bufmgr);
+ bufmgr2 = drm_intel_bufmgr_gem_init(intel_fd2, 4096);
+ drm_intel_bufmgr_gem_enable_reuse(bufmgr2);
+
/* set up nouveau bufmgr */
ret = nouveau_device_wrap(nouveau_fd, 0, &ndev);
if (ret < 0) {
@@ -233,7 +350,6 @@ int main(int argc, char **argv)
devid = intel_get_drm_devid(intel_fd);
intel_batch = intel_batchbuffer_alloc(bufmgr, devid);
- /* create an object on the i915 */
ret = test1();
if (ret)
fprintf(stderr,"prime_test: failed test 1\n");
@@ -250,6 +366,21 @@ int main(int argc, char **argv)
if (ret)
fprintf(stderr,"prime_test: failed test 4\n");
+ ret = test5();
+ if (ret)
+ fprintf(stderr,"prime_test: failed test 5\n");
+
+ ret = test6();
+ if (ret)
+ fprintf(stderr,"prime_test: failed test 6\n");
+
+ ret = test7();
+ if (ret)
+ fprintf(stderr,"prime_test: failed test 7\n");
+
+ ret = test8();
+ if (ret)
+ fprintf(stderr,"prime_test: failed test 8\n");
intel_batchbuffer_free(intel_batch);
diff --git a/tests/prime_test.c b/tests/prime_test.c
index 55b3603d..e9bd40ba 100644
--- a/tests/prime_test.c
+++ b/tests/prime_test.c
@@ -32,6 +32,8 @@ struct nouveau_client *nclient;
uint32_t devid;
struct intel_batchbuffer *intel_batch;
+#define BO_SIZE (256*1024)
+
static int find_and_open_devices(void)
{
int i;
@@ -82,7 +84,7 @@ static int test1(void)
int prime_fd;
struct nouveau_bo *nvbo;
- test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", 256*1024, 4096);
+ test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
drm_intel_bufmgr_gem_set_bo_prime(test_intel_bo, &prime_fd);
@@ -112,14 +114,14 @@ static int test2(void)
struct nouveau_bo *nvbo;
ret = nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
- 0, 256*1024, NULL, &nvbo);
+ 0, BO_SIZE, NULL, &nvbo);
if (ret < 0)
return ret;
ret = nouveau_bo_set_prime(nvbo, &prime_fd);
if (ret < 0)
return ret;
- test_intel_bo = drm_intel_bufmgr_gem_get_bo_prime(bufmgr, prime_fd);
+ test_intel_bo = drm_intel_bufmgr_gem_get_bo_prime(bufmgr, prime_fd, BO_SIZE);
close(prime_fd);
if (!test_intel_bo)
return -1;
@@ -129,15 +131,68 @@ static int test2(void)
return 0;
}
+/*
+ * allocate intel, give to nouveau, map on nouveau
+ * write 0xdeadbeef, non-gtt map on intel, read
+ */
static int test3(void)
{
int ret;
drm_intel_bo *test_intel_bo;
int prime_fd;
- struct nouveau_bo *nvbo;
+ struct nouveau_bo *nvbo = NULL;
+ uint32_t *ptr;
+
+ test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
+
+ drm_intel_bufmgr_gem_set_bo_prime(test_intel_bo, &prime_fd);
+
+ ret = nouveau_bo_prime_handle_ref(ndev, prime_fd, &nvbo);
+ if (ret < 0) {
+ fprintf(stderr,"failed to ref prime buffer %d\n", ret);
+ close(prime_fd);
+ goto free_intel;
+ }
+ close(prime_fd);
+ goto free_intel;
+
+ ret = nouveau_bo_map(nvbo, NOUVEAU_BO_RDWR, nclient);
+ if (ret < 0) {
+ fprintf(stderr,"failed to map nouveau bo\n");
+ goto out;
+ }
+
+ ptr = nvbo->map;
+ *ptr = 0xdeadbeef;
+
+ drm_intel_bo_map(test_intel_bo, 1);
+
+ ptr = test_intel_bo->virtual;
+
+ if (*ptr != 0xdeadbeef) {
+ fprintf(stderr,"mapped value doesn't match\n");
+ ret = -1;
+ }
+out:
+ nouveau_bo_ref(NULL, &nvbo);
+free_intel:
+ drm_intel_bo_unreference(test_intel_bo);
+ return ret;
+}
+
+/*
+ * allocate intel, give to nouveau, map on nouveau
+ * write 0xdeadbeef, gtt map on intel, read
+ */
+static int test4(void)
+{
+ int ret;
+ drm_intel_bo *test_intel_bo;
+ int prime_fd;
+ struct nouveau_bo *nvbo = NULL;
uint32_t *ptr;
- test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", 256*1024, 4096);
+ test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
drm_intel_bufmgr_gem_set_bo_prime(test_intel_bo, &prime_fd);
@@ -158,7 +213,7 @@ static int test3(void)
ptr = nvbo->map;
*ptr = 0xdeadbeef;
- drm_intel_bo_map(test_intel_bo, 0);
+ drm_intel_gem_bo_map_gtt(test_intel_bo);
ptr = test_intel_bo->virtual;
if (*ptr != 0xdeadbeef) {
@@ -171,8 +226,10 @@ out:
return ret;
}
-
-static int test4(void)
+/* test drm_intel_bo_map doesn't work properly,
+ this tries to map the backing shmem fd, which doesn't exist
+ for these objects */
+static int test5(void)
{
int ret;
drm_intel_bo *test_intel_bo;
@@ -181,15 +238,69 @@ static int test4(void)
uint32_t *ptr;
ret = nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
- 0, 256*1024, NULL, &nvbo);
+ 0, BO_SIZE, NULL, &nvbo);
if (ret < 0)
return ret;
ret = nouveau_bo_set_prime(nvbo, &prime_fd);
if (ret < 0)
return ret;
+ test_intel_bo = drm_intel_bufmgr_gem_get_bo_prime(bufmgr, prime_fd, BO_SIZE);
+ close(prime_fd);
+ if (!test_intel_bo)
+ return -1;
+
+ ret = nouveau_bo_map(nvbo, NOUVEAU_BO_RDWR, nclient);
+ if (ret < 0) {
+ fprintf(stderr,"failed to map nouveau bo\n");
+ goto out;
+ }
+
+ ptr = nvbo->map;
+ *ptr = 0xdeadbeef;
+
+ ret = drm_intel_bo_map(test_intel_bo, 0);
+ if (ret != 0) {
+ /* failed to map the bo is expected */
+ ret = 0;
+ goto out;
+ }
+ if (!test_intel_bo->virtual) {
+ ret = 0;
+ goto out;
+ }
+ ptr = test_intel_bo->virtual;
+
+ if (*ptr != 0xdeadbeef) {
+ fprintf(stderr,"mapped value doesn't match %08x\n", *ptr);
+ ret = -1;
+ }
+ out:
+ nouveau_bo_ref(NULL, &nvbo);
+ drm_intel_bo_unreference(test_intel_bo);
+ return ret;
+}
+
+/* test drm_intel_bo_map_gtt works properly,
+ this tries to map the backing shmem fd, which doesn't exist
+ for these objects */
+static int test6(void)
+{
+ int ret;
+ drm_intel_bo *test_intel_bo;
+ int prime_fd;
+ struct nouveau_bo *nvbo;
+ uint32_t *ptr;
+
+ ret = nouveau_bo_new(ndev, NOUVEAU_BO_GART | NOUVEAU_BO_MAP,
+ 0, BO_SIZE, NULL, &nvbo);
+ if (ret < 0)
+ return ret;
+ ret = nouveau_bo_set_prime(nvbo, &prime_fd);
+ if (ret < 0)
+ return ret;
- test_intel_bo = drm_intel_bufmgr_gem_get_bo_prime(bufmgr, prime_fd);
+ test_intel_bo = drm_intel_bufmgr_gem_get_bo_prime(bufmgr, prime_fd, BO_SIZE);
close(prime_fd);
if (!test_intel_bo)
return -1;
@@ -202,12 +313,22 @@ static int test4(void)
ptr = nvbo->map;
*ptr = 0xdeadbeef;
+ *(ptr + 1) = 0xa55a55;
- drm_intel_bo_map(test_intel_bo, 0);
+ ret = drm_intel_gem_bo_map_gtt(test_intel_bo);
+ if (ret != 0) {
+ fprintf(stderr,"failed to map bo\n");
+ goto out;
+ }
+ if (!test_intel_bo->virtual) {
+ ret = -1;
+ fprintf(stderr,"failed to map bo\n");
+ goto out;
+ }
ptr = test_intel_bo->virtual;
if (*ptr != 0xdeadbeef) {
- fprintf(stderr,"mapped value doesn't match\n");
+ fprintf(stderr,"mapped value doesn't match %08x %08x\n", *ptr, *(ptr + 1));
ret = -1;
}
out:
@@ -248,17 +369,17 @@ create_bo(drm_intel_bufmgr *ibufmgr, uint32_t val, int width, int height)
/* use intel hw to fill the BO with a blit from another BO,
then readback from the nouveau bo, check value is correct */
-static int test5(void)
+static int test7(void)
{
int ret;
drm_intel_bo *test_intel_bo, *src_bo;
int prime_fd;
- struct nouveau_bo *nvbo;
+ struct nouveau_bo *nvbo = NULL;
uint32_t *ptr;
src_bo = create_bo(bufmgr, 0xaa55aa55, 256, 1);
- test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", 256*1024, 4096);
+ test_intel_bo = drm_intel_bo_alloc(bufmgr, "test bo", BO_SIZE, 4096);
drm_intel_bufmgr_gem_set_bo_prime(test_intel_bo, &prime_fd);
@@ -290,9 +411,9 @@ out:
return ret;
}
-/* test 6 use nouveau to do blit */
+/* test 8 use nouveau to do blit */
-/* test 7 nouveau copy engine?? */
+/* test 9 nouveau copy engine?? */
int main(int argc, char **argv)
{
@@ -347,7 +468,11 @@ int main(int argc, char **argv)
ret = test5();
if (ret)
- fprintf(stderr,"prime_test: failed test 4\n");
+ fprintf(stderr,"prime_test: failed test 5\n");
+
+ ret = test6();
+ if (ret)
+ fprintf(stderr,"prime_test: failed test 6\n");
intel_batchbuffer_free(intel_batch);