xref: /aosp_15_r20/external/igt-gpu-tools/tests/i915/gem_wait.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
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