packaging: only on x86* arch
[platform/upstream/intel-gpu-tools.git] / tests / drv_suspend.c
1 /*
2  * Copyright © 2013 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  *    Daniel Vetter <daniel.vetter@ffwll.ch>
25  *
26  */
27
28 #include <unistd.h>
29 #include <stdlib.h>
30 #include <stdio.h>
31 #include <string.h>
32 #include <fcntl.h>
33 #include <inttypes.h>
34 #include <errno.h>
35 #include <sys/stat.h>
36 #include <sys/ioctl.h>
37
38 #include <drm.h>
39
40 #include "ioctl_wrappers.h"
41 #include "drmtest.h"
42 #include "igt_debugfs.h"
43 #include "igt_aux.h"
44
45 #define OBJECT_SIZE (16*1024*1024)
46
47 static void
48 test_fence_restore(int fd, bool tiled2untiled)
49 {
50         uint32_t handle1, handle2, handle_tiled;
51         uint32_t *ptr1, *ptr2, *ptr_tiled;
52         int i;
53
54         /* We wall the tiled object with untiled canary objects to make sure
55          * that we detect tile leaking in both directions. */
56         handle1 = gem_create(fd, OBJECT_SIZE);
57         handle2 = gem_create(fd, OBJECT_SIZE);
58         handle_tiled = gem_create(fd, OBJECT_SIZE);
59
60         /* Access the buffer objects in the order we want to have the laid out. */
61         ptr1 = gem_mmap(fd, handle1, OBJECT_SIZE, PROT_READ | PROT_WRITE);
62         igt_assert(ptr1 != MAP_FAILED);
63         for (i = 0; i < OBJECT_SIZE/sizeof(uint32_t); i++)
64                 ptr1[i] = i;
65
66         ptr_tiled = gem_mmap(fd, handle_tiled, OBJECT_SIZE, PROT_READ | PROT_WRITE);
67         igt_assert(ptr_tiled != MAP_FAILED);
68         if (tiled2untiled)
69                 gem_set_tiling(fd, handle_tiled, I915_TILING_X, 2048);
70         for (i = 0; i < OBJECT_SIZE/sizeof(uint32_t); i++)
71                 ptr_tiled[i] = i;
72
73         ptr2 = gem_mmap(fd, handle2, OBJECT_SIZE, PROT_READ | PROT_WRITE);
74         igt_assert(ptr2 != MAP_FAILED);
75         for (i = 0; i < OBJECT_SIZE/sizeof(uint32_t); i++)
76                 ptr2[i] = i;
77
78         if (tiled2untiled)
79                 gem_set_tiling(fd, handle_tiled, I915_TILING_NONE, 2048);
80         else
81                 gem_set_tiling(fd, handle_tiled, I915_TILING_X, 2048);
82
83         igt_system_suspend_autoresume();
84
85         igt_info("checking the first canary object\n");
86         for (i = 0; i < OBJECT_SIZE/sizeof(uint32_t); i++)
87                 igt_assert(ptr1[i] == i);
88
89         igt_info("checking the second canary object\n");
90         for (i = 0; i < OBJECT_SIZE/sizeof(uint32_t); i++)
91                 igt_assert(ptr2[i] == i);
92
93         gem_close(fd, handle1);
94         gem_close(fd, handle2);
95         gem_close(fd, handle_tiled);
96
97         munmap(ptr1, OBJECT_SIZE);
98         munmap(ptr2, OBJECT_SIZE);
99         munmap(ptr_tiled, OBJECT_SIZE);
100 }
101
102 static void
103 test_debugfs_reader(void)
104 {
105         struct igt_helper_process reader = {};
106         reader.use_SIGKILL = true;
107
108         igt_fork_helper(&reader) {
109                 static const char dfs_base[] = "/sys/kernel/debug/dri";
110                 static char tmp[1024];
111
112                 snprintf(tmp, sizeof(tmp) - 1,
113                          "while true; do find %s/%i/ -type f | xargs cat > /dev/null 2>&1; done",
114                          dfs_base, drm_get_card());
115                 igt_assert(execl("/bin/sh", "sh", "-c", tmp, (char *) NULL) != -1);
116         }
117
118         sleep(1);
119
120         igt_system_suspend_autoresume();
121
122         sleep(1);
123
124         igt_stop_helper(&reader);
125 }
126
127 static void
128 test_sysfs_reader(void)
129 {
130         struct igt_helper_process reader = {};
131         reader.use_SIGKILL = true;
132
133         igt_fork_helper(&reader) {
134                 static const char dfs_base[] = "/sys/class/drm/card";
135                 static char tmp[1024];
136
137                 snprintf(tmp, sizeof(tmp) - 1,
138                          "while true; do find %s%i*/ -type f | xargs cat > /dev/null 2>&1; done",
139                          dfs_base, drm_get_card());
140                 igt_assert(execl("/bin/sh", "sh", "-c", tmp, (char *) NULL) != -1);
141         }
142
143         sleep(1);
144
145         igt_system_suspend_autoresume();
146
147         sleep(1);
148
149         igt_stop_helper(&reader);
150 }
151
152 static void
153 test_forcewake(void)
154 {
155         int fw_fd;
156
157         fw_fd = igt_open_forcewake_handle();
158         igt_assert(fw_fd >= 0);
159         igt_system_suspend_autoresume();
160         close (fw_fd);
161 }
162
163 int fd;
164
165 igt_main
166 {
167         igt_skip_on_simulation();
168
169         igt_fixture
170                 fd = drm_open_any();
171
172         igt_subtest("fence-restore-tiled2untiled")
173                 test_fence_restore(fd, true);
174
175         igt_subtest("fence-restore-untiled")
176                 test_fence_restore(fd, false);
177
178         igt_subtest("debugfs-reader")
179                 test_debugfs_reader();
180
181         igt_subtest("sysfs-reader")
182                 test_sysfs_reader();
183
184         igt_subtest("forcewake")
185                 test_forcewake();
186
187         igt_fixture
188                 close(fd);
189 }