diff options
author | Dave Airlie <airlied@redhat.com> | 2012-05-20 17:20:03 +0100 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-05-20 17:20:03 +0100 |
commit | e3fce518307254eeb5303d62c50d395193a9a5ac (patch) | |
tree | 73f6a8426ef00d114b1c5f6833ea44cbeec3f73a | |
parent | fd6fe33a1908eaaac9216bc8a172087467c95628 (diff) |
prime more bits
-rw-r--r-- | tests/prime_api.c | 155 | ||||
-rw-r--r-- | tests/prime_test.c | 161 |
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); |