tests: roll out igt_simple_init/igt_simple_main
[platform/upstream/intel-gpu-tools.git] / tests / gem_reg_read.c
1 /*
2  * Copyright © 2012 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  *
23  * Authors:
24  *    Ben Widawsky <ben@bwidawsk.net>
25  *
26  */
27
28 #include <stdio.h>
29 #include <string.h>
30 #include "i915_drm.h"
31 #include "drmtest.h"
32
33 struct local_drm_i915_reg_read {
34         __u64 offset;
35         __u64 val; /* Return value */
36 };
37
38 #define REG_READ_IOCTL DRM_IOWR(DRM_COMMAND_BASE + 0x31, struct local_drm_i915_reg_read)
39
40 static void handle_bad(int ret, int expected, const char *desc)
41 {
42         if (ret != 0 && errno != expected) {
43                 fprintf(stderr, "%s - errno was %d, but should have been %d\n",
44                                 desc, errno, expected);
45                 igt_fail(1);
46         } else if (ret == 0) {
47                 fprintf(stderr, "%s - Command succeeded, but should have failed\n",
48                         desc);
49                 igt_fail(1);
50         }
51 }
52
53 static uint64_t timer_query(int fd)
54 {
55         struct local_drm_i915_reg_read reg_read;
56
57         reg_read.offset = 0x2358;
58         if (drmIoctl(fd, REG_READ_IOCTL, &reg_read)) {
59                 perror("positive test case failed: ");
60                 igt_fail(1);
61         }
62
63         return reg_read.val;
64 }
65
66 igt_simple_main
67 {
68         struct local_drm_i915_reg_read reg_read;
69         int fd, ret;
70
71         fd = drm_open_any();
72
73         reg_read.offset = 0x2358;
74         ret = drmIoctl(fd, REG_READ_IOCTL, &reg_read);
75         igt_assert(ret == 0 || errno == EINVAL);
76         igt_require(ret == 0);
77
78         reg_read.val = timer_query(fd);
79         sleep(1);
80         if (timer_query(fd) == reg_read.val) {
81                 fprintf(stderr, "Timer isn't moving, probably busted\n");
82                 igt_fail(1);
83         }
84
85         /* bad reg */
86         reg_read.offset = 0x12345678;
87         handle_bad(drmIoctl(fd, REG_READ_IOCTL, &reg_read),
88                    EINVAL, "bad register");
89
90         close(fd);
91 }