diff options
| author | Jesse Barnes <jesse.barnes@intel.com> | 2007-10-30 12:52:46 -0700 | 
|---|---|---|
| committer | Jesse Barnes <jesse.barnes@intel.com> | 2007-10-30 12:52:46 -0700 | 
| commit | 91aae7e683786a48547872b0a5fa92b2232e02c0 (patch) | |
| tree | a30c8022886d61add4a4c2e073fa07f29d7745a7 /tests | |
| parent | 7e9ea55a2f052cc939ba9bbf9edac39798344b7a (diff) | |
| parent | 79744d730c90019edd367eee4a8ec1fa22d53402 (diff) | |
Merge branch 'master' into vblank-rework, fixup remaining drivers
Conflicts:
	linux-core/drmP.h
	linux-core/drm_drv.c
	linux-core/drm_irq.c
	shared-core/i915_drv.h
	shared-core/i915_irq.c
	shared-core/mga_drv.h
	shared-core/mga_irq.c
	shared-core/radeon_drv.h
	shared-core/radeon_irq.c
Merge in the latest master bits and update the remaining drivers (except
mach64 which math_b is working on).  Also remove the 9xx hack from the i915
driver; it seems to be correct.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/Makefile | 27 | ||||
| -rw-r--r-- | tests/Makefile.am | 29 | ||||
| -rw-r--r-- | tests/auth.c | 137 | ||||
| -rw-r--r-- | tests/drmtest.c | 83 | ||||
| -rw-r--r-- | tests/drmtest.h | 37 | ||||
| -rw-r--r-- | tests/getclient.c | 60 | ||||
| -rw-r--r-- | tests/getstats.c | 51 | ||||
| -rw-r--r-- | tests/getversion.c | 47 | ||||
| -rw-r--r-- | tests/lock.c | 263 | ||||
| -rw-r--r-- | tests/openclose.c | 37 | ||||
| -rw-r--r-- | tests/setversion.c | 84 | ||||
| -rw-r--r-- | tests/updatedraw.c | 148 | 
12 files changed, 976 insertions, 27 deletions
diff --git a/tests/Makefile b/tests/Makefile deleted file mode 100644 index b406e0ad..00000000 --- a/tests/Makefile +++ /dev/null @@ -1,27 +0,0 @@ - -# These definitions are for handling dependencies in the out of kernel build. - -PROGS = dristat drmstat - -CLEANFILES = *.o *.ko $(PROGS) .depend .*.flags .*.d  - -# Build test utilities - -PRGCFLAGS = $(CFLAGS) -g -ansi -pedantic -DPOSIX_C_SOURCE=199309L \ -	    -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE \ -	    -I. -I../libdrm -I../shared-core - -DRMSTATLIBS = -L../libdrm -ldrm - - -programs: $(PROGS) - -dristat: dristat.c -	$(CC) $(PRGCFLAGS) $< -o $@ - -drmstat: drmstat.c -	$(CC) $(PRGCFLAGS) $< -o $@ $(DRMSTATLIBS) - -clean: -	rm -f $(CLEANFILES) - diff --git a/tests/Makefile.am b/tests/Makefile.am new file mode 100644 index 00000000..dce1754e --- /dev/null +++ b/tests/Makefile.am @@ -0,0 +1,29 @@ +AM_CFLAGS = \ +	-I $(top_srcdir)/shared-core \ +	-I $(top_srcdir)/libdrm + +noinst_PROGRAMS = \ +	dristat \ +	drmstat + +EXTRA_LTLIBRARIES = libdrmtest.la +libdrmtest_la_SOURCES = \ +	drmtest.c \ +	drmtest.h +libdrmtest_la_LIBADD = \ +	$(top_builddir)/libdrm/libdrm.la + +LDADD = libdrmtest.la + +TESTS = auth \ +	openclose \ +	getversion \ +	getclient \ +	getstats \ +	lock \ +	setversion \ +	updatedraw + +EXTRA_PROGRAMS = $(TESTS) +CLEANFILES = $(EXTRA_PROGRAMS) $(EXTRA_LTLIBRARIES) + diff --git a/tests/auth.c b/tests/auth.c new file mode 100644 index 00000000..9b6fca94 --- /dev/null +++ b/tests/auth.c @@ -0,0 +1,137 @@ +/* + * Copyright © 2007 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. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include <limits.h> +#include "drmtest.h" + +enum auth_event { +	SERVER_READY, +	CLIENT_MAGIC, +	CLIENT_DONE, +}; + +int commfd[2]; + +static void wait_event(int pipe, enum auth_event expected_event) +{ +	int ret; +	enum auth_event event; +	unsigned char in; + +	ret = read(commfd[pipe], &in, 1); +	if (ret == -1) +		err(1, "read error"); +	event = in; + +	if (event != expected_event) +		errx(1, "unexpected event: %d\n", event); +} + +static void +send_event(int pipe, enum auth_event send_event) +{ +	int ret; +	unsigned char event; + +	event = send_event; +	ret = write(commfd[pipe], &event, 1); +	if (ret == -1) +		err(1, "failed to send event %d", event); +} + +static void client() +{ +	struct drm_auth auth; +	int drmfd, ret; + +	/* XXX: Should make sure we open the same DRM as the master */ +	wait_event(0, SERVER_READY); + +	drmfd = drm_open_any(); + +	/* Get a client magic number and pass it to the master for auth. */ +	auth.magic = 0; /* Quiet valgrind */ +	ret = ioctl(drmfd, DRM_IOCTL_GET_MAGIC, &auth); +	if (ret == -1) +		err(1, "Couldn't get client magic"); +	send_event(0, CLIENT_MAGIC); +	ret = write(commfd[0], &auth.magic, sizeof(auth.magic)); +	if (ret == -1) +		err(1, "Couldn't write auth data"); + +	/* Signal that the client is completely done. */ +	send_event(0, CLIENT_DONE); +} + +static void server() +{ +	int drmfd, ret; +	struct drm_auth auth; + +	drmfd = drm_open_any_master(); + +	auth.magic = 0xd0d0d0d0; +	ret = ioctl(drmfd, DRM_IOCTL_AUTH_MAGIC, &auth); +	if (ret != -1 || errno != EINVAL) +		errx(1, "Authenticating bad magic succeeded\n"); + +	send_event(1, SERVER_READY); + +	wait_event(1, CLIENT_MAGIC); +	ret = read(commfd[1], &auth.magic, sizeof(auth.magic)); +	if (ret == -1) +		err(1, "Failure to read client magic"); + +	ret = ioctl(drmfd, DRM_IOCTL_AUTH_MAGIC, &auth); +	if (ret == -1) +		err(1, "Failure to authenticate client magic\n"); + +	wait_event(1, CLIENT_DONE); +} + +/** + * Checks DRM authentication mechanisms. + */ +int main(int argc, char **argv) +{ +	int ret; + +	ret = pipe(commfd); +	if (ret == -1) +		err(1, "Couldn't create pipe"); + +	ret = fork(); +	if (ret == -1) +		err(1, "failure to fork client"); +	if (ret == 0) +		client(); +	else +		server(); + +	return 0; +} + diff --git a/tests/drmtest.c b/tests/drmtest.c new file mode 100644 index 00000000..cae99a0c --- /dev/null +++ b/tests/drmtest.c @@ -0,0 +1,83 @@ +/* + * Copyright © 2007 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. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include <fcntl.h> +#include "drmtest.h" + +/** Open the first DRM device we can find, searching up to 16 device nodes */ +int drm_open_any(void) +{ +	char name[20]; +	int i, fd; + +	for (i = 0; i < 16; i++) { +		sprintf(name, "/dev/dri/card%d", i); +		fd = open(name, O_RDWR); +		if (fd != -1) +			return fd; +	} +	abort(); +} + + +/** + * Open the first DRM device we can find where we end up being the master. + */ +int drm_open_any_master(void) +{ +	char name[20]; +	int i, fd; + +	for (i = 0; i < 16; i++) { +		drm_client_t client; +		int ret; + +		sprintf(name, "/dev/dri/card%d", i); +		fd = open(name, O_RDWR); +		if (fd == -1) +			continue; + +		/* Check that we're the only opener and authed. */ +		client.idx = 0; +		ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client); +		assert (ret == 0); +		if (!client.auth) { +			close(fd); +			continue; +		} +		client.idx = 1; +		ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client); +		if (ret != -1 || errno != EINVAL) { +			close(fd); +			continue; +		} +		return fd; +	} +	fprintf(stderr, "Couldn't find an un-controlled DRM device\n"); +	abort(); +} + diff --git a/tests/drmtest.h b/tests/drmtest.h new file mode 100644 index 00000000..afa0df4a --- /dev/null +++ b/tests/drmtest.h @@ -0,0 +1,37 @@ +/* + * Copyright © 2007 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. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <assert.h> +#include <errno.h> + +#include "xf86drm.h" + +int drm_open_any(void); +int drm_open_any_master(void); diff --git a/tests/getclient.c b/tests/getclient.c new file mode 100644 index 00000000..349c16ec --- /dev/null +++ b/tests/getclient.c @@ -0,0 +1,60 @@ +/* + * Copyright © 2007 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. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include <limits.h> +#include "drmtest.h" + +/** + * Checks DRM_IOCTL_GET_CLIENT. + */ +int main(int argc, char **argv) +{ +	int fd, ret; +	drm_client_t client; + +	fd = drm_open_any(); + +	/* Look for client index 0.  This should exist whether we're operating +	 * on an otherwise unused drm device, or the X Server is running on +	 * the device. +	 */ +	client.idx = 0; +	ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client); +	assert(ret == 0); + +	/* Look for some absurd client index and make sure it's invalid. +	 * The DRM drivers currently always return data, so the user has +	 * no real way to detect when the list has terminated.  That's bad, +	 * and this test is XFAIL as a result. +	 */ +	client.idx = 0x7fffffff; +	ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client); +	assert(ret == -1 && errno == EINVAL); + +	close(fd); +	return 0; +} diff --git a/tests/getstats.c b/tests/getstats.c new file mode 100644 index 00000000..bd55b12e --- /dev/null +++ b/tests/getstats.c @@ -0,0 +1,51 @@ +/* + * Copyright © 2007 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. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include <limits.h> +#include "drmtest.h" + +/** + * Checks DRM_IOCTL_GET_STATS. + * + * I don't care too much about the actual contents, just that the kernel + * doesn't crash. + */ +int main(int argc, char **argv) +{ +	int fd, ret; +	drm_stats_t stats; + +	fd = drm_open_any(); + +	ret = ioctl(fd, DRM_IOCTL_GET_STATS, &stats); +	assert(ret == 0); + +	assert(stats.count >= 0); + +	close(fd); +	return 0; +} diff --git a/tests/getversion.c b/tests/getversion.c new file mode 100644 index 00000000..3de90de6 --- /dev/null +++ b/tests/getversion.c @@ -0,0 +1,47 @@ +/* + * Copyright © 2007 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. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include "drmtest.h" + +/** + * Checks DRM_IOCTL_GET_VERSION and libdrm's drmGetVersion() interface to it. + */ +int main(int argc, char **argv) +{ +	int fd; +	drmVersionPtr v; + +	fd = drm_open_any(); +	v = drmGetVersion(fd); +	assert(strlen(v->name) != 0); +	assert(strlen(v->date) != 0); +	assert(strlen(v->desc) != 0); +	assert(v->version_major >= 1); +	drmFree(v); +	close(fd); +	return 0; +} diff --git a/tests/lock.c b/tests/lock.c new file mode 100644 index 00000000..86caa281 --- /dev/null +++ b/tests/lock.c @@ -0,0 +1,263 @@ +/* + * Copyright © 2007 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. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +/** @file lock.c + * Tests various potential failures of the DRM locking mechanisms + */ + +#include <limits.h> +#include "drmtest.h" + +enum auth_event { +	SERVER_READY, +	CLIENT_MAGIC, +	SERVER_LOCKED, +	CLIENT_LOCKED, +}; + +int commfd[2]; +unsigned int lock1 = 0x00001111; +unsigned int lock2 = 0x00002222; + +/* return time in milliseconds */ +static unsigned int +get_millis() +{ +	struct timeval tv; + +	gettimeofday(&tv, NULL); +	return tv.tv_sec * 1000 + tv.tv_usec / 1000; +} + +static void +wait_event(int pipe, enum auth_event expected_event) +{ +	int ret; +	enum auth_event event; +	unsigned char in; + +	ret = read(commfd[pipe], &in, 1); +	if (ret == -1) +		err(1, "read error"); +	event = in; + +	if (event != expected_event) +		errx(1, "unexpected event: %d\n", event); +} + +static void +send_event(int pipe, enum auth_event send_event) +{ +	int ret; +	unsigned char event; + +	event = send_event; +	ret = write(commfd[pipe], &event, 1); +	if (ret == -1) +		err(1, "failed to send event %d", event); +} + +static void +client_auth(int drmfd) +{ +	struct drm_auth auth; +	int ret; + +	/* Get a client magic number and pass it to the master for auth. */ +	ret = ioctl(drmfd, DRM_IOCTL_GET_MAGIC, &auth); +	if (ret == -1) +		err(1, "Couldn't get client magic"); +	send_event(0, CLIENT_MAGIC); +	ret = write(commfd[0], &auth.magic, sizeof(auth.magic)); +	if (ret == -1) +		err(1, "Couldn't write auth data"); +} + +static void +server_auth(int drmfd) +{ +	struct drm_auth auth; +	int ret; + +	send_event(1, SERVER_READY); +	wait_event(1, CLIENT_MAGIC); +	ret = read(commfd[1], &auth.magic, sizeof(auth.magic)); +	if (ret == -1) +		err(1, "Failure to read client magic"); + +	ret = ioctl(drmfd, DRM_IOCTL_AUTH_MAGIC, &auth); +	if (ret == -1) +		err(1, "Failure to authenticate client magic\n"); +} + +/** Tests that locking is successful in normal conditions */ +static void +test_lock_unlock(int drmfd) +{ +	int ret; + +	ret = drmGetLock(drmfd, lock1, 0); +	if (ret != 0) +		err(1, "Locking failed"); +	ret = drmUnlock(drmfd, lock1); +	if (ret != 0) +		err(1, "Unlocking failed"); +} + +/** Tests that unlocking the lock while it's not held works correctly */ +static void +test_unlock_unlocked(int drmfd) +{ +	int ret; + +	ret = drmUnlock(drmfd, lock1); +	if (ret == 0) +		err(1, "Unlocking unlocked lock succeeded"); +} + +/** Tests that unlocking a lock held by another context fails appropriately */ +static void +test_unlock_unowned(int drmfd) +{ +	int ret; + +	ret = drmGetLock(drmfd, lock1, 0); +	assert(ret == 0); +	ret = drmUnlock(drmfd, lock2); +	if (ret == 0) +		errx(1, "Unlocking other context's lock succeeded"); +	ret = drmUnlock(drmfd, lock1); +	assert(ret == 0); +} + +/** + * Tests that an open/close by the same process doesn't result in the lock + * being dropped. + */ +static void test_open_close_locked(drmfd) +{ +	int ret, tempfd; + +	ret = drmGetLock(drmfd, lock1, 0); +	assert(ret == 0); +	/* XXX: Need to make sure that this is the same device as drmfd */ +	tempfd = drm_open_any(); +	close(tempfd); +	ret = drmUnlock(drmfd, lock1); +	if (ret != 0) +		errx(1, "lock lost during open/close by same pid"); +} + +static void client() +{ +	int drmfd, ret; +	unsigned int time; + +	wait_event(0, SERVER_READY); + +	/* XXX: Should make sure we open the same DRM as the master */ +	drmfd = drm_open_any(); + +	client_auth(drmfd); + +	/* Wait for the server to grab the lock, then grab it ourselves (to +	 * contest it).  Hopefully we hit it within the window of when the +	 * server locks. +	 */ +	wait_event(0, SERVER_LOCKED); +	ret = drmGetLock(drmfd, lock2, 0); +	time = get_millis(); +	if (ret != 0) +		err(1, "Failed to get lock on client\n"); +	drmUnlock(drmfd, lock2); + +	/* Tell the server that our locking completed, and when it did */ +	send_event(0, CLIENT_LOCKED); +	ret = write(commfd[0], &time, sizeof(time)); + +	close(drmfd); +	exit(0); +} + +static void server() +{ +	int drmfd, tempfd, ret; +	unsigned int client_time, unlock_time; + +	drmfd = drm_open_any_master(); + +	test_lock_unlock(drmfd); +	test_unlock_unlocked(drmfd); +	test_unlock_unowned(drmfd); +	test_open_close_locked(drmfd); + +	/* Perform the authentication sequence with the client. */ +	server_auth(drmfd); + +	/* Now, test that the client attempting to lock while the server +	 * holds the lock works correctly. +	 */ +	ret = drmGetLock(drmfd, lock1, 0); +	assert(ret == 0); +	send_event(1, SERVER_LOCKED); +	/* Wait a while for the client to do its thing */ +	sleep(1); +	ret = drmUnlock(drmfd, lock1); +	assert(ret == 0); +	unlock_time = get_millis(); + +	wait_event(1, CLIENT_LOCKED); +	ret = read(commfd[1], &client_time, sizeof(client_time)); +	if (ret == -1) +		err(1, "Failure to read client magic"); + +	if (client_time < unlock_time) +		errx(1, "Client took lock before server released it"); + +	close(drmfd); +} + +int main(int argc, char **argv) +{ +	int ret; + + +	ret = pipe(commfd); +	if (ret == -1) +		err(1, "Couldn't create pipe"); + +	ret = fork(); +	if (ret == -1) +		err(1, "failure to fork client"); +	if (ret == 0) +		client(); +	else +		server(); + +	return 0; +} + diff --git a/tests/openclose.c b/tests/openclose.c new file mode 100644 index 00000000..946a4459 --- /dev/null +++ b/tests/openclose.c @@ -0,0 +1,37 @@ +/* + * Copyright © 2007 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. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include "drmtest.h" + +int main(int argc, char **argv) +{ +	int fd; + +	fd = drm_open_any(); +	close(fd); +	return 0; +} diff --git a/tests/setversion.c b/tests/setversion.c new file mode 100644 index 00000000..f4bfbfba --- /dev/null +++ b/tests/setversion.c @@ -0,0 +1,84 @@ +/* + * Copyright © 2007 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. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include <limits.h> +#include "drmtest.h" + +/** + * Checks DRM_IOCTL_SET_VERSION. + * + * This tests that we can get the actual version out, and that setting invalid + * major/minor numbers fails appropriately.  It does not check the actual + * behavior differenses resulting from an increased DI version. + */ +int main(int argc, char **argv) +{ +	int fd, ret; +	drm_set_version_t sv, version; + +	fd = drm_open_any_master(); + +	/* First, check that we can get the DD/DI versions. */ +	memset(&version, 0, sizeof(version)); +	version.drm_di_major = -1; +	version.drm_di_minor = -1; +	version.drm_dd_major = -1; +	version.drm_dd_minor = -1; +	ret = ioctl(fd, DRM_IOCTL_SET_VERSION, &version); +	assert(ret == 0); +	assert(version.drm_di_major != -1); +	assert(version.drm_di_minor != -1); +	assert(version.drm_dd_major != -1); +	assert(version.drm_dd_minor != -1); + +	/* Check that an invalid DI major fails */ +	sv = version; +	sv.drm_di_major++; +	ret = ioctl(fd, DRM_IOCTL_SET_VERSION, &sv); +	assert(ret == -1 && errno == EINVAL); + +	/* Check that an invalid DI minor fails */ +	sv = version; +	sv.drm_di_major++; +	ret = ioctl(fd, DRM_IOCTL_SET_VERSION, &sv); +	assert(ret == -1 && errno == EINVAL); + +	/* Check that an invalid DD major fails */ +	sv = version; +	sv.drm_dd_major++; +	ret = ioctl(fd, DRM_IOCTL_SET_VERSION, &sv); +	assert(ret == -1 && errno == EINVAL); + +	/* Check that an invalid DD minor fails */ +	sv = version; +	sv.drm_dd_minor++; +	ret = ioctl(fd, DRM_IOCTL_SET_VERSION, &sv); +	assert(ret == -1 && errno == EINVAL); + +	close(fd); +	return 0; +} diff --git a/tests/updatedraw.c b/tests/updatedraw.c new file mode 100644 index 00000000..2f22fef2 --- /dev/null +++ b/tests/updatedraw.c @@ -0,0 +1,148 @@ +/* + * Copyright © 2007 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. + * + * Authors: + *    Eric Anholt <eric@anholt.net> + * + */ + +#include "drmtest.h" + +static void +set_draw_cliprects_empty(int fd, int drawable) +{ +	int ret; +	struct drm_update_draw update; + +	update.handle = drawable; +	update.type = DRM_DRAWABLE_CLIPRECTS; +	update.num = 0; +	update.data = 0; + +	ret = ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update); +	assert(ret == 0); +} + +static void +set_draw_cliprects_empty_fail(int fd, int drawable) +{ +	int ret; +	struct drm_update_draw update; + +	update.handle = drawable; +	update.type = DRM_DRAWABLE_CLIPRECTS; +	update.num = 0; +	update.data = 0; + +	ret = ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update); +	assert(ret == -1 && errno == EINVAL); +} + +static void +set_draw_cliprects_2(int fd, int drawable) +{ +	int ret; +	struct drm_update_draw update; +	drm_clip_rect_t rects[2]; + +	rects[0].x1 = 0; +	rects[0].y1 = 0; +	rects[0].x2 = 10; +	rects[0].y2 = 10; + +	rects[1].x1 = 10; +	rects[1].y1 = 10; +	rects[1].x2 = 20; +	rects[1].y2 = 20; + +	update.handle = drawable; +	update.type = DRM_DRAWABLE_CLIPRECTS; +	update.num = 2; +	update.data = (unsigned long long)(uintptr_t)&rects; + +	ret = ioctl(fd, DRM_IOCTL_UPDATE_DRAW, &update); +	assert(ret == 0); +} + +static int add_drawable(int fd) +{ +	drm_draw_t drawarg; +	int ret; + +	/* Create a drawable. +	 * IOCTL_ADD_DRAW is RDWR, though it should really just be RD +	 */ +	drawarg.handle = 0; +	ret = ioctl(fd, DRM_IOCTL_ADD_DRAW, &drawarg); +	assert(ret == 0); +	return drawarg.handle; +} + +static int rm_drawable(int fd, int drawable, int fail) +{ +	drm_draw_t drawarg; +	int ret; + +	/* Create a drawable. +	 * IOCTL_ADD_DRAW is RDWR, though it should really just be RD +	 */ +	drawarg.handle = drawable; +	ret = ioctl(fd, DRM_IOCTL_RM_DRAW, &drawarg); +	if (!fail) +		assert(ret == 0); +	else +		assert(ret == -1 && errno == EINVAL); + +	return drawarg.handle; +} + +/** + * Tests drawable management: adding, removing, and updating the cliprects of + * drawables. + */ +int main(int argc, char **argv) +{ +	int fd, ret, d1, d2; + +	fd = drm_open_any_master(); + +	d1 = add_drawable(fd); +	d2 = add_drawable(fd); +	/* Do a series of cliprect updates */ +	set_draw_cliprects_empty(fd, d1); +	set_draw_cliprects_empty(fd, d2); +	set_draw_cliprects_2(fd, d1); +	set_draw_cliprects_empty(fd, d1); + +	/* Remove our drawables */ +	rm_drawable(fd, d1, 0); +	rm_drawable(fd, d2, 0); + +	/* Check that removing an unknown drawable returns error */ +	rm_drawable(fd, 0x7fffffff, 1); + +	/* Attempt to set cliprects on a nonexistent drawable */ +	set_draw_cliprects_empty_fail(fd, d1); + +	close(fd); +	return 0; +}  | 
