Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> --- lib/Makefile.sources | 2 + lib/igt_vgem.c | 80 ++++++++++++++++++++++++++ lib/igt_vgem.h | 42 ++++++++++++++ tests/Makefile.sources | 2 + tests/vgem_basic.c | 145 ++++++++++++++++++++++++++++++++++++++++++++++++ tests/vgem_reload_basic | 22 ++++++++ 6 files changed, 293 insertions(+) create mode 100644 lib/igt_vgem.c create mode 100644 lib/igt_vgem.h create mode 100644 tests/vgem_basic.c create mode 100755 tests/vgem_reload_basic diff --git a/lib/Makefile.sources b/lib/Makefile.sources index f50ff4d..7f3f8c6 100644 --- a/lib/Makefile.sources +++ b/lib/Makefile.sources @@ -18,6 +18,8 @@ libintel_tools_la_SOURCES = \ igt_stats.h \ igt_sysfs.c \ igt_sysfs.h \ + igt_vgem.c \ + igt_vgem.h \ instdone.c \ instdone.h \ intel_batchbuffer.c \ diff --git a/lib/igt_vgem.c b/lib/igt_vgem.c new file mode 100644 index 0000000..9977903 --- /dev/null +++ b/lib/igt_vgem.c @@ -0,0 +1,80 @@ +/* + * Copyright © 2016 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "igt.h" +#include "igt_vgem.h" + +#include <sys/mman.h> + +int __vgem_create(int fd, struct vgem_bo *bo) +{ + struct drm_mode_create_dumb arg; + + memset(&arg, 0, sizeof(arg)); + arg.width = bo->width; + arg.height = bo->height; + arg.bpp = bo->bpp; + + if (drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &arg)) + return -errno; + + bo->handle = arg.handle; + bo->pitch = arg.pitch; + bo->size = arg.size; + + return 0; +} + +void vgem_create(int fd, struct vgem_bo *bo) +{ + igt_assert_eq(__vgem_create(fd, bo), 0); +} + +void *__vgem_mmap(int fd, struct vgem_bo *bo, unsigned prot) +{ + struct drm_mode_map_dumb arg; + void *ptr; + + memset(&arg, 0, sizeof(arg)); + arg.handle = bo->handle; + if (drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &arg)) + return NULL; + + ptr = mmap(0, bo->size, prot, MAP_SHARED, fd, arg.offset); + if (ptr == MAP_FAILED) + return NULL; + + return ptr; +} + +void *vgem_mmap(int fd, struct vgem_bo *bo, unsigned prot) +{ + void *ptr; + + igt_assert_f((ptr = __vgem_mmap(fd, bo, prot)), + "vgem_map(fd=%d, bo->handle=%d, prot=%x)\n", + fd, bo->handle, prot); + + return ptr; +} + diff --git a/lib/igt_vgem.h b/lib/igt_vgem.h new file mode 100644 index 0000000..9e4a55e --- /dev/null +++ b/lib/igt_vgem.h @@ -0,0 +1,42 @@ +/* + * Copyright © 2016 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#ifndef IGT_VGEM_H +#define IGT_VGEM_H + +#include <stdint.h> + +struct vgem_bo { + uint32_t handle; + uint32_t width, height; + uint32_t bpp, pitch; + uint64_t size; +}; + +int __vgem_create(int fd, struct vgem_bo *bo); +void vgem_create(int fd, struct vgem_bo *bo); + +void *__vgem_mmap(int fd, struct vgem_bo *bo, unsigned prot); +void *vgem_mmap(int fd, struct vgem_bo *bo, unsigned prot); + +#endif /* IGT_VGEM_H */ diff --git a/tests/Makefile.sources b/tests/Makefile.sources index 7d40386..569a6f4 100644 --- a/tests/Makefile.sources +++ b/tests/Makefile.sources @@ -123,6 +123,7 @@ TESTS_progs_M = \ prime_mmap_kms \ prime_self_import \ template \ + vgem_basic \ $(NULL) TESTS_progs_XM = \ @@ -218,6 +219,7 @@ TESTS_scripts = \ sysfs_l3_parity \ test_rte_check \ tools_test \ + vgem_reload_basic \ $(NULL) # This target contains testcases which support automagic subtest enumeration diff --git a/tests/vgem_basic.c b/tests/vgem_basic.c new file mode 100644 index 0000000..b79ee6f --- /dev/null +++ b/tests/vgem_basic.c @@ -0,0 +1,145 @@ +/* + * Copyright © 2016 Intel Corporation + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + */ + +#include "igt.h" +#include "igt_vgem.h" + +#include <sys/mman.h> + +IGT_TEST_DESCRIPTION("Basic sanity check of Virtual GEM module (vGEM)."); + +static void test_create(int fd) +{ + struct vgem_bo bo; + + bo.width = 0; + bo.height = 0; + bo.bpp = 0; + igt_assert_eq(__vgem_create(fd, &bo), -EINVAL); + + bo.width = 1; + bo.height = 1; + bo.bpp = 1; + vgem_create(fd, &bo); + igt_assert_eq(bo.size, 4096); + gem_close(fd, bo.handle); + + bo.width = 1024; + bo.height = 1024; + bo.bpp = 8; + vgem_create(fd, &bo); + igt_assert_eq(bo.size, 1<<20); + gem_close(fd, bo.handle); + + bo.width = 1<<15; + bo.height = 1<<15; + bo.bpp = 16; + vgem_create(fd, &bo); + igt_assert_eq(bo.size, 1<<31); + gem_close(fd, bo.handle); +} + +static void test_mmap(int fd) +{ + struct vgem_bo bo; + uint32_t *ptr; + + bo.width = 1024; + bo.height = 1024; + bo.bpp = 32; + vgem_create(fd, &bo); + + ptr = vgem_mmap(fd, &bo, PROT_WRITE); + gem_close(fd, bo.handle); + + for (int page = 0; page < bo.size >> 12; page++) + ptr[page] = 0; + + munmap(ptr, bo.size); +} + +static void test_dmabuf_mmap(int fd) +{ + struct vgem_bo bo; + uint32_t *ptr; + int export; + + bo.width = 1024; + bo.height = 1024; + bo.bpp = 32; + vgem_create(fd, &bo); + + export = prime_handle_to_fd_for_mmap(fd, bo.handle); + ptr = mmap(NULL, bo.size, PROT_WRITE, MAP_SHARED, export, 0); + close(export); + igt_assert(ptr != MAP_FAILED); + + for (int page = 0; page < bo.size >> 12; page++) + ptr[page] = page; + munmap(ptr, bo.size); + + ptr = vgem_mmap(fd, &bo, PROT_READ); + gem_close(fd, bo.handle); + + for (int page = 0; page < bo.size >> 12; page++) + igt_assert_eq(ptr[page], page); + munmap(ptr, bo.size); +} + +static bool has_prime_export(int fd) +{ + uint64_t value; + + if (drmGetCap(fd, DRM_CAP_PRIME, &value)) + return false; + + return value & DRM_PRIME_CAP_EXPORT; +} + +igt_main +{ + int fd = -1; + + igt_fixture { + fd = drm_open_driver(DRIVER_VGEM); + } + + igt_subtest_f("create") + test_create(fd); + + igt_subtest_f("mmap") + test_mmap(fd); + + igt_subtest_group { + igt_fixture { + igt_require(has_prime_export(fd)); + } + + igt_subtest_f("dmabuf-mmap") + test_dmabuf_mmap(fd); + } + + igt_fixture { + close(fd); + } +} diff --git a/tests/vgem_reload_basic b/tests/vgem_reload_basic new file mode 100755 index 0000000..b150b2c --- /dev/null +++ b/tests/vgem_reload_basic @@ -0,0 +1,22 @@ +#!/bin/bash +# +# Testcase: Reload the vgem module +# +# ... we've broken this way too often :( +# + +function unload() { + /sbin/rmmod vgem + # drm may be used by other devices (nouveau, radeon, udl, etc) + /sbin/rmmod drm &> /dev/null + + if /sbin/lsmod | grep vgem &> /dev/null ; then + echo WARNING: vgem.ko still loaded! + return 1 + fi +} + +unload &> /dev/null + +/sbin/modprobe vgem $* || exit 1 +unload || exit 1 -- 2.8.1 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel