[PATCH igt 2/2] igt: Add basic exercise of vGEM

Chris Wilson chris at chris-wilson.co.uk
Sat Jun 18 13:59:10 UTC 2016


Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 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



More information about the dri-devel mailing list