1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2012 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker *
4*d83cc019SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker *
11*d83cc019SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker * Software.
14*d83cc019SAndroid Build Coastguard Worker *
15*d83cc019SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21*d83cc019SAndroid Build Coastguard Worker * IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker *
23*d83cc019SAndroid Build Coastguard Worker * Authors:
24*d83cc019SAndroid Build Coastguard Worker * Ben Widawsky <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker *
26*d83cc019SAndroid Build Coastguard Worker */
27*d83cc019SAndroid Build Coastguard Worker
28*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
29*d83cc019SAndroid Build Coastguard Worker #include "igt_vgem.h"
30*d83cc019SAndroid Build Coastguard Worker
__gem_wait(int fd,struct drm_i915_gem_wait * w)31*d83cc019SAndroid Build Coastguard Worker static int __gem_wait(int fd, struct drm_i915_gem_wait *w)
32*d83cc019SAndroid Build Coastguard Worker {
33*d83cc019SAndroid Build Coastguard Worker int err;
34*d83cc019SAndroid Build Coastguard Worker
35*d83cc019SAndroid Build Coastguard Worker err = 0;
36*d83cc019SAndroid Build Coastguard Worker if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_WAIT, w))
37*d83cc019SAndroid Build Coastguard Worker err = -errno;
38*d83cc019SAndroid Build Coastguard Worker
39*d83cc019SAndroid Build Coastguard Worker return err;
40*d83cc019SAndroid Build Coastguard Worker }
41*d83cc019SAndroid Build Coastguard Worker
invalid_flags(int fd)42*d83cc019SAndroid Build Coastguard Worker static void invalid_flags(int fd)
43*d83cc019SAndroid Build Coastguard Worker {
44*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_wait wait;
45*d83cc019SAndroid Build Coastguard Worker
46*d83cc019SAndroid Build Coastguard Worker memset(&wait, 0, sizeof(wait));
47*d83cc019SAndroid Build Coastguard Worker wait.bo_handle = gem_create(fd, 4096);
48*d83cc019SAndroid Build Coastguard Worker wait.timeout_ns = 1;
49*d83cc019SAndroid Build Coastguard Worker /* NOTE: This test intentionally tests for just the next available flag.
50*d83cc019SAndroid Build Coastguard Worker * Don't "fix" this testcase without the ABI testcases for new flags
51*d83cc019SAndroid Build Coastguard Worker * first. */
52*d83cc019SAndroid Build Coastguard Worker wait.flags = 1;
53*d83cc019SAndroid Build Coastguard Worker
54*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_wait(fd, &wait), -EINVAL);
55*d83cc019SAndroid Build Coastguard Worker
56*d83cc019SAndroid Build Coastguard Worker gem_close(fd, wait.bo_handle);
57*d83cc019SAndroid Build Coastguard Worker }
58*d83cc019SAndroid Build Coastguard Worker
invalid_buf(int fd)59*d83cc019SAndroid Build Coastguard Worker static void invalid_buf(int fd)
60*d83cc019SAndroid Build Coastguard Worker {
61*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_wait wait;
62*d83cc019SAndroid Build Coastguard Worker
63*d83cc019SAndroid Build Coastguard Worker memset(&wait, 0, sizeof(wait));
64*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_wait(fd, &wait), -ENOENT);
65*d83cc019SAndroid Build Coastguard Worker }
66*d83cc019SAndroid Build Coastguard Worker
67*d83cc019SAndroid Build Coastguard Worker #define BUSY 1
68*d83cc019SAndroid Build Coastguard Worker #define HANG 2
69*d83cc019SAndroid Build Coastguard Worker #define AWAIT 4
70*d83cc019SAndroid Build Coastguard Worker #define WRITE 8
71*d83cc019SAndroid Build Coastguard Worker
basic(int fd,unsigned engine,unsigned flags)72*d83cc019SAndroid Build Coastguard Worker static void basic(int fd, unsigned engine, unsigned flags)
73*d83cc019SAndroid Build Coastguard Worker {
74*d83cc019SAndroid Build Coastguard Worker IGT_CORK_HANDLE(cork);
75*d83cc019SAndroid Build Coastguard Worker uint32_t plug =
76*d83cc019SAndroid Build Coastguard Worker flags & (WRITE | AWAIT) ? igt_cork_plug(&cork, fd) : 0;
77*d83cc019SAndroid Build Coastguard Worker igt_spin_t *spin = igt_spin_new(fd,
78*d83cc019SAndroid Build Coastguard Worker .engine = engine,
79*d83cc019SAndroid Build Coastguard Worker .dependency = plug);
80*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_wait wait = {
81*d83cc019SAndroid Build Coastguard Worker flags & WRITE ? plug : spin->handle
82*d83cc019SAndroid Build Coastguard Worker };
83*d83cc019SAndroid Build Coastguard Worker
84*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_wait(fd, &wait), -ETIME);
85*d83cc019SAndroid Build Coastguard Worker
86*d83cc019SAndroid Build Coastguard Worker if (flags & BUSY) {
87*d83cc019SAndroid Build Coastguard Worker struct timespec tv = {};
88*d83cc019SAndroid Build Coastguard Worker int timeout;
89*d83cc019SAndroid Build Coastguard Worker
90*d83cc019SAndroid Build Coastguard Worker timeout = 120;
91*d83cc019SAndroid Build Coastguard Worker if ((flags & HANG) == 0) {
92*d83cc019SAndroid Build Coastguard Worker igt_spin_set_timeout(spin, NSEC_PER_SEC/2);
93*d83cc019SAndroid Build Coastguard Worker timeout = 1;
94*d83cc019SAndroid Build Coastguard Worker }
95*d83cc019SAndroid Build Coastguard Worker
96*d83cc019SAndroid Build Coastguard Worker if (flags & (WRITE | AWAIT))
97*d83cc019SAndroid Build Coastguard Worker igt_cork_unplug(&cork);
98*d83cc019SAndroid Build Coastguard Worker
99*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_wait(fd, &wait), -ETIME);
100*d83cc019SAndroid Build Coastguard Worker
101*d83cc019SAndroid Build Coastguard Worker while (__gem_wait(fd, &wait) == -ETIME)
102*d83cc019SAndroid Build Coastguard Worker igt_assert(igt_seconds_elapsed(&tv) < timeout);
103*d83cc019SAndroid Build Coastguard Worker } else {
104*d83cc019SAndroid Build Coastguard Worker wait.timeout_ns = NSEC_PER_SEC / 2; /* 0.5s */
105*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_wait(fd, &wait), -ETIME);
106*d83cc019SAndroid Build Coastguard Worker igt_assert_eq_s64(wait.timeout_ns, 0);
107*d83cc019SAndroid Build Coastguard Worker
108*d83cc019SAndroid Build Coastguard Worker if (flags & (WRITE | AWAIT))
109*d83cc019SAndroid Build Coastguard Worker igt_cork_unplug(&cork);
110*d83cc019SAndroid Build Coastguard Worker
111*d83cc019SAndroid Build Coastguard Worker wait.timeout_ns = 0;
112*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_wait(fd, &wait), -ETIME);
113*d83cc019SAndroid Build Coastguard Worker
114*d83cc019SAndroid Build Coastguard Worker if ((flags & HANG) == 0) {
115*d83cc019SAndroid Build Coastguard Worker igt_spin_set_timeout(spin, NSEC_PER_SEC/2);
116*d83cc019SAndroid Build Coastguard Worker wait.timeout_ns = NSEC_PER_SEC; /* 1.0s */
117*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_wait(fd, &wait), 0);
118*d83cc019SAndroid Build Coastguard Worker igt_assert(wait.timeout_ns >= 0);
119*d83cc019SAndroid Build Coastguard Worker } else {
120*d83cc019SAndroid Build Coastguard Worker wait.timeout_ns = -1;
121*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_wait(fd, &wait), 0);
122*d83cc019SAndroid Build Coastguard Worker igt_assert(wait.timeout_ns == -1);
123*d83cc019SAndroid Build Coastguard Worker }
124*d83cc019SAndroid Build Coastguard Worker
125*d83cc019SAndroid Build Coastguard Worker wait.timeout_ns = 0;
126*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(__gem_wait(fd, &wait), 0);
127*d83cc019SAndroid Build Coastguard Worker igt_assert(wait.timeout_ns == 0);
128*d83cc019SAndroid Build Coastguard Worker }
129*d83cc019SAndroid Build Coastguard Worker
130*d83cc019SAndroid Build Coastguard Worker if (plug)
131*d83cc019SAndroid Build Coastguard Worker gem_close(fd, plug);
132*d83cc019SAndroid Build Coastguard Worker igt_spin_free(fd, spin);
133*d83cc019SAndroid Build Coastguard Worker }
134*d83cc019SAndroid Build Coastguard Worker
135*d83cc019SAndroid Build Coastguard Worker igt_main
136*d83cc019SAndroid Build Coastguard Worker {
137*d83cc019SAndroid Build Coastguard Worker const struct intel_execution_engine2 *e;
138*d83cc019SAndroid Build Coastguard Worker int fd = -1;
139*d83cc019SAndroid Build Coastguard Worker
140*d83cc019SAndroid Build Coastguard Worker igt_skip_on_simulation();
141*d83cc019SAndroid Build Coastguard Worker
142*d83cc019SAndroid Build Coastguard Worker igt_fixture {
143*d83cc019SAndroid Build Coastguard Worker fd = drm_open_driver_master(DRIVER_INTEL);
144*d83cc019SAndroid Build Coastguard Worker igt_require_gem(fd);
145*d83cc019SAndroid Build Coastguard Worker }
146*d83cc019SAndroid Build Coastguard Worker
147*d83cc019SAndroid Build Coastguard Worker igt_subtest("invalid-flags")
148*d83cc019SAndroid Build Coastguard Worker invalid_flags(fd);
149*d83cc019SAndroid Build Coastguard Worker
150*d83cc019SAndroid Build Coastguard Worker igt_subtest("invalid-buf")
151*d83cc019SAndroid Build Coastguard Worker invalid_buf(fd);
152*d83cc019SAndroid Build Coastguard Worker
153*d83cc019SAndroid Build Coastguard Worker igt_subtest_group {
154*d83cc019SAndroid Build Coastguard Worker igt_fixture {
155*d83cc019SAndroid Build Coastguard Worker igt_fork_hang_detector(fd);
156*d83cc019SAndroid Build Coastguard Worker igt_fork_signal_helper();
157*d83cc019SAndroid Build Coastguard Worker }
158*d83cc019SAndroid Build Coastguard Worker
159*d83cc019SAndroid Build Coastguard Worker igt_subtest("basic-busy-all") {
160*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
161*d83cc019SAndroid Build Coastguard Worker basic(fd, ALL_ENGINES, BUSY);
162*d83cc019SAndroid Build Coastguard Worker }
163*d83cc019SAndroid Build Coastguard Worker igt_subtest("basic-wait-all") {
164*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
165*d83cc019SAndroid Build Coastguard Worker basic(fd, ALL_ENGINES, 0);
166*d83cc019SAndroid Build Coastguard Worker }
167*d83cc019SAndroid Build Coastguard Worker igt_subtest("basic-await-all") {
168*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
169*d83cc019SAndroid Build Coastguard Worker basic(fd, ALL_ENGINES, AWAIT);
170*d83cc019SAndroid Build Coastguard Worker }
171*d83cc019SAndroid Build Coastguard Worker igt_subtest("basic-busy-write-all") {
172*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
173*d83cc019SAndroid Build Coastguard Worker basic(fd, ALL_ENGINES, BUSY | WRITE);
174*d83cc019SAndroid Build Coastguard Worker }
175*d83cc019SAndroid Build Coastguard Worker igt_subtest("basic-wait-write-all") {
176*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
177*d83cc019SAndroid Build Coastguard Worker basic(fd, ALL_ENGINES, WRITE);
178*d83cc019SAndroid Build Coastguard Worker }
179*d83cc019SAndroid Build Coastguard Worker
__for_each_physical_engine(fd,e)180*d83cc019SAndroid Build Coastguard Worker __for_each_physical_engine(fd, e) {
181*d83cc019SAndroid Build Coastguard Worker igt_subtest_group {
182*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("busy-%s", e->name) {
183*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
184*d83cc019SAndroid Build Coastguard Worker basic(fd, e->flags, BUSY);
185*d83cc019SAndroid Build Coastguard Worker }
186*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("wait-%s", e->name) {
187*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
188*d83cc019SAndroid Build Coastguard Worker basic(fd, e->flags, 0);
189*d83cc019SAndroid Build Coastguard Worker }
190*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("await-%s", e->name) {
191*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
192*d83cc019SAndroid Build Coastguard Worker basic(fd, e->flags, AWAIT);
193*d83cc019SAndroid Build Coastguard Worker }
194*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("write-busy-%s", e->name) {
195*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
196*d83cc019SAndroid Build Coastguard Worker basic(fd, e->flags, BUSY | WRITE);
197*d83cc019SAndroid Build Coastguard Worker }
198*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("write-wait-%s", e->name) {
199*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
200*d83cc019SAndroid Build Coastguard Worker basic(fd, e->flags, WRITE);
201*d83cc019SAndroid Build Coastguard Worker }
202*d83cc019SAndroid Build Coastguard Worker }
203*d83cc019SAndroid Build Coastguard Worker }
204*d83cc019SAndroid Build Coastguard Worker
205*d83cc019SAndroid Build Coastguard Worker igt_fixture {
206*d83cc019SAndroid Build Coastguard Worker igt_stop_signal_helper();
207*d83cc019SAndroid Build Coastguard Worker igt_stop_hang_detector();
208*d83cc019SAndroid Build Coastguard Worker }
209*d83cc019SAndroid Build Coastguard Worker }
210*d83cc019SAndroid Build Coastguard Worker
211*d83cc019SAndroid Build Coastguard Worker igt_subtest_group {
212*d83cc019SAndroid Build Coastguard Worker igt_hang_t hang;
213*d83cc019SAndroid Build Coastguard Worker
214*d83cc019SAndroid Build Coastguard Worker igt_fixture {
215*d83cc019SAndroid Build Coastguard Worker hang = igt_allow_hang(fd, 0, 0);
216*d83cc019SAndroid Build Coastguard Worker igt_fork_signal_helper();
217*d83cc019SAndroid Build Coastguard Worker }
218*d83cc019SAndroid Build Coastguard Worker
219*d83cc019SAndroid Build Coastguard Worker igt_subtest("hang-busy-all") {
220*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
221*d83cc019SAndroid Build Coastguard Worker basic(fd, ALL_ENGINES, BUSY | HANG);
222*d83cc019SAndroid Build Coastguard Worker }
223*d83cc019SAndroid Build Coastguard Worker igt_subtest("hang-wait-all") {
224*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
225*d83cc019SAndroid Build Coastguard Worker basic(fd, ALL_ENGINES, HANG);
226*d83cc019SAndroid Build Coastguard Worker }
227*d83cc019SAndroid Build Coastguard Worker
228*d83cc019SAndroid Build Coastguard Worker igt_subtest("hang-busy-write-all") {
229*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
230*d83cc019SAndroid Build Coastguard Worker basic(fd, ALL_ENGINES, BUSY | WRITE | HANG);
231*d83cc019SAndroid Build Coastguard Worker }
232*d83cc019SAndroid Build Coastguard Worker igt_subtest("hang-wait-write-all") {
233*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
234*d83cc019SAndroid Build Coastguard Worker basic(fd, ALL_ENGINES, WRITE | HANG);
235*d83cc019SAndroid Build Coastguard Worker }
236*d83cc019SAndroid Build Coastguard Worker
__for_each_physical_engine(fd,e)237*d83cc019SAndroid Build Coastguard Worker __for_each_physical_engine(fd, e) {
238*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("hang-busy-%s", e->name) {
239*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
240*d83cc019SAndroid Build Coastguard Worker basic(fd, e->flags, HANG | BUSY);
241*d83cc019SAndroid Build Coastguard Worker }
242*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("hang-wait-%s", e->name) {
243*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
244*d83cc019SAndroid Build Coastguard Worker basic(fd, e->flags, HANG);
245*d83cc019SAndroid Build Coastguard Worker }
246*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("hang-busy-write-%s", e->name) {
247*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
248*d83cc019SAndroid Build Coastguard Worker basic(fd, e->flags, HANG | WRITE | BUSY);
249*d83cc019SAndroid Build Coastguard Worker }
250*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("hang-wait-write-%s", e->name) {
251*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(fd);
252*d83cc019SAndroid Build Coastguard Worker basic(fd, e->flags, HANG | WRITE);
253*d83cc019SAndroid Build Coastguard Worker }
254*d83cc019SAndroid Build Coastguard Worker }
255*d83cc019SAndroid Build Coastguard Worker
256*d83cc019SAndroid Build Coastguard Worker igt_fixture {
257*d83cc019SAndroid Build Coastguard Worker igt_stop_signal_helper();
258*d83cc019SAndroid Build Coastguard Worker igt_disallow_hang(fd, hang);
259*d83cc019SAndroid Build Coastguard Worker }
260*d83cc019SAndroid Build Coastguard Worker }
261*d83cc019SAndroid Build Coastguard Worker
262*d83cc019SAndroid Build Coastguard Worker igt_fixture {
263*d83cc019SAndroid Build Coastguard Worker close(fd);
264*d83cc019SAndroid Build Coastguard Worker }
265*d83cc019SAndroid Build Coastguard Worker }
266