xref: /aosp_15_r20/external/igt-gpu-tools/tests/i915/gem_spin_batch.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2017 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  */
24*d83cc019SAndroid Build Coastguard Worker 
25*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
26*d83cc019SAndroid Build Coastguard Worker 
27*d83cc019SAndroid Build Coastguard Worker #define MAX_ERROR 5 /* % */
28*d83cc019SAndroid Build Coastguard Worker 
29*d83cc019SAndroid Build Coastguard Worker #define assert_within_epsilon(x, ref, tolerance) \
30*d83cc019SAndroid Build Coastguard Worker 	igt_assert_f(100 * x <= (100 + tolerance) * ref && \
31*d83cc019SAndroid Build Coastguard Worker 		     100 * x >= (100 - tolerance) * ref, \
32*d83cc019SAndroid Build Coastguard Worker 		     "'%s' != '%s' (%lld not within %d%% tolerance of %lld)\n",\
33*d83cc019SAndroid Build Coastguard Worker 		     #x, #ref, (long long)x, tolerance, (long long)ref)
34*d83cc019SAndroid Build Coastguard Worker 
spin(int fd,const struct intel_execution_engine2 * e2,unsigned int timeout_sec)35*d83cc019SAndroid Build Coastguard Worker static void spin(int fd, const struct intel_execution_engine2 *e2,
36*d83cc019SAndroid Build Coastguard Worker 		 unsigned int timeout_sec)
37*d83cc019SAndroid Build Coastguard Worker {
38*d83cc019SAndroid Build Coastguard Worker 	const uint64_t timeout_100ms = 100000000LL;
39*d83cc019SAndroid Build Coastguard Worker 	unsigned long loops = 0;
40*d83cc019SAndroid Build Coastguard Worker 	igt_spin_t *spin;
41*d83cc019SAndroid Build Coastguard Worker 	struct timespec tv = { };
42*d83cc019SAndroid Build Coastguard Worker 	struct timespec itv = { };
43*d83cc019SAndroid Build Coastguard Worker 	uint64_t elapsed;
44*d83cc019SAndroid Build Coastguard Worker 
45*d83cc019SAndroid Build Coastguard Worker 	spin = __igt_spin_new(fd, .engine = e2->flags);
46*d83cc019SAndroid Build Coastguard Worker 	while ((elapsed = igt_nsec_elapsed(&tv)) >> 30 < timeout_sec) {
47*d83cc019SAndroid Build Coastguard Worker 		igt_spin_t *next = __igt_spin_new(fd, .engine = e2->flags);
48*d83cc019SAndroid Build Coastguard Worker 
49*d83cc019SAndroid Build Coastguard Worker 		igt_spin_set_timeout(spin,
50*d83cc019SAndroid Build Coastguard Worker 				     timeout_100ms - igt_nsec_elapsed(&itv));
51*d83cc019SAndroid Build Coastguard Worker 		gem_sync(fd, spin->handle);
52*d83cc019SAndroid Build Coastguard Worker 		igt_debug("loop %lu: interval=%fms (target 100ms), elapsed %fms\n",
53*d83cc019SAndroid Build Coastguard Worker 			  loops,
54*d83cc019SAndroid Build Coastguard Worker 			  igt_nsec_elapsed(&itv) * 1e-6,
55*d83cc019SAndroid Build Coastguard Worker 			  igt_nsec_elapsed(&tv) * 1e-6);
56*d83cc019SAndroid Build Coastguard Worker 		memset(&itv, 0, sizeof(itv));
57*d83cc019SAndroid Build Coastguard Worker 
58*d83cc019SAndroid Build Coastguard Worker 		igt_spin_free(fd, spin);
59*d83cc019SAndroid Build Coastguard Worker 		spin = next;
60*d83cc019SAndroid Build Coastguard Worker 		loops++;
61*d83cc019SAndroid Build Coastguard Worker 	}
62*d83cc019SAndroid Build Coastguard Worker 	igt_spin_free(fd, spin);
63*d83cc019SAndroid Build Coastguard Worker 
64*d83cc019SAndroid Build Coastguard Worker 	igt_info("Completed %ld loops in %lld ns, target %ld\n",
65*d83cc019SAndroid Build Coastguard Worker 		 loops, (long long)elapsed, (long)(elapsed / timeout_100ms));
66*d83cc019SAndroid Build Coastguard Worker 
67*d83cc019SAndroid Build Coastguard Worker 	assert_within_epsilon(timeout_100ms * loops, elapsed, MAX_ERROR);
68*d83cc019SAndroid Build Coastguard Worker }
69*d83cc019SAndroid Build Coastguard Worker 
70*d83cc019SAndroid Build Coastguard Worker #define RESUBMIT_NEW_CTX     (1 << 0)
71*d83cc019SAndroid Build Coastguard Worker #define RESUBMIT_ALL_ENGINES (1 << 1)
72*d83cc019SAndroid Build Coastguard Worker 
spin_resubmit(int fd,const struct intel_execution_engine2 * e2,unsigned int flags)73*d83cc019SAndroid Build Coastguard Worker static void spin_resubmit(int fd, const struct intel_execution_engine2 *e2,
74*d83cc019SAndroid Build Coastguard Worker 			  unsigned int flags)
75*d83cc019SAndroid Build Coastguard Worker {
76*d83cc019SAndroid Build Coastguard Worker 	const uint32_t ctx0 = gem_context_create(fd);
77*d83cc019SAndroid Build Coastguard Worker 	const uint32_t ctx1 = (flags & RESUBMIT_NEW_CTX) ?
78*d83cc019SAndroid Build Coastguard Worker 		gem_context_create(fd) : ctx0;
79*d83cc019SAndroid Build Coastguard Worker 	igt_spin_t *spin = __igt_spin_new(fd, .ctx = ctx0, .engine = e2->flags);
80*d83cc019SAndroid Build Coastguard Worker 	const struct intel_execution_engine2 *other;
81*d83cc019SAndroid Build Coastguard Worker 
82*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_execbuffer2 eb = {
83*d83cc019SAndroid Build Coastguard Worker 		.buffer_count = 1,
84*d83cc019SAndroid Build Coastguard Worker 		.buffers_ptr = to_user_pointer(&spin->obj[IGT_SPIN_BATCH]),
85*d83cc019SAndroid Build Coastguard Worker 		.rsvd1 = ctx1,
86*d83cc019SAndroid Build Coastguard Worker 	};
87*d83cc019SAndroid Build Coastguard Worker 
88*d83cc019SAndroid Build Coastguard Worker 	igt_assert(gem_context_has_engine_map(fd, 0) ||
89*d83cc019SAndroid Build Coastguard Worker 		   !(flags & RESUBMIT_ALL_ENGINES));
90*d83cc019SAndroid Build Coastguard Worker 
91*d83cc019SAndroid Build Coastguard Worker 	if (flags & RESUBMIT_ALL_ENGINES) {
92*d83cc019SAndroid Build Coastguard Worker 		gem_context_set_all_engines(fd, ctx0);
93*d83cc019SAndroid Build Coastguard Worker 		if (ctx0 != ctx1)
94*d83cc019SAndroid Build Coastguard Worker 			gem_context_set_all_engines(fd, ctx1);
95*d83cc019SAndroid Build Coastguard Worker 
96*d83cc019SAndroid Build Coastguard Worker 		for_each_context_engine(fd, ctx1, other) {
97*d83cc019SAndroid Build Coastguard Worker 			if (gem_engine_is_equal(other, e2))
98*d83cc019SAndroid Build Coastguard Worker 				continue;
99*d83cc019SAndroid Build Coastguard Worker 
100*d83cc019SAndroid Build Coastguard Worker 			eb.flags = other->flags;
101*d83cc019SAndroid Build Coastguard Worker 			gem_execbuf(fd, &eb);
102*d83cc019SAndroid Build Coastguard Worker 		}
103*d83cc019SAndroid Build Coastguard Worker 	} else {
104*d83cc019SAndroid Build Coastguard Worker 		eb.flags = e2->flags;
105*d83cc019SAndroid Build Coastguard Worker 		gem_execbuf(fd, &eb);
106*d83cc019SAndroid Build Coastguard Worker 	}
107*d83cc019SAndroid Build Coastguard Worker 
108*d83cc019SAndroid Build Coastguard Worker 	igt_spin_end(spin);
109*d83cc019SAndroid Build Coastguard Worker 
110*d83cc019SAndroid Build Coastguard Worker 	gem_sync(fd, spin->handle);
111*d83cc019SAndroid Build Coastguard Worker 
112*d83cc019SAndroid Build Coastguard Worker 	igt_spin_free(fd, spin);
113*d83cc019SAndroid Build Coastguard Worker 
114*d83cc019SAndroid Build Coastguard Worker 	if (ctx1 != ctx0)
115*d83cc019SAndroid Build Coastguard Worker 		gem_context_destroy(fd, ctx1);
116*d83cc019SAndroid Build Coastguard Worker 
117*d83cc019SAndroid Build Coastguard Worker 	gem_context_destroy(fd, ctx0);
118*d83cc019SAndroid Build Coastguard Worker }
119*d83cc019SAndroid Build Coastguard Worker 
spin_exit_handler(int sig)120*d83cc019SAndroid Build Coastguard Worker static void spin_exit_handler(int sig)
121*d83cc019SAndroid Build Coastguard Worker {
122*d83cc019SAndroid Build Coastguard Worker 	igt_terminate_spins();
123*d83cc019SAndroid Build Coastguard Worker }
124*d83cc019SAndroid Build Coastguard Worker 
spin_on_all_engines(int fd,unsigned int timeout_sec)125*d83cc019SAndroid Build Coastguard Worker static void spin_on_all_engines(int fd, unsigned int timeout_sec)
126*d83cc019SAndroid Build Coastguard Worker {
127*d83cc019SAndroid Build Coastguard Worker 	const struct intel_execution_engine2 *e2;
128*d83cc019SAndroid Build Coastguard Worker 
129*d83cc019SAndroid Build Coastguard Worker 	__for_each_physical_engine(fd, e2) {
130*d83cc019SAndroid Build Coastguard Worker 		igt_fork(child, 1) {
131*d83cc019SAndroid Build Coastguard Worker 			igt_install_exit_handler(spin_exit_handler);
132*d83cc019SAndroid Build Coastguard Worker 			spin(fd, e2, timeout_sec);
133*d83cc019SAndroid Build Coastguard Worker 		}
134*d83cc019SAndroid Build Coastguard Worker 	}
135*d83cc019SAndroid Build Coastguard Worker 
136*d83cc019SAndroid Build Coastguard Worker 	igt_waitchildren();
137*d83cc019SAndroid Build Coastguard Worker }
138*d83cc019SAndroid Build Coastguard Worker 
139*d83cc019SAndroid Build Coastguard Worker igt_main
140*d83cc019SAndroid Build Coastguard Worker {
141*d83cc019SAndroid Build Coastguard Worker 	const struct intel_execution_engine2 *e2;
142*d83cc019SAndroid Build Coastguard Worker 	const struct intel_execution_engine *e;
143*d83cc019SAndroid Build Coastguard Worker 	struct intel_execution_engine2 e2__;
144*d83cc019SAndroid Build Coastguard Worker 	int fd = -1;
145*d83cc019SAndroid Build Coastguard Worker 
146*d83cc019SAndroid Build Coastguard Worker 	igt_skip_on_simulation();
147*d83cc019SAndroid Build Coastguard Worker 
148*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
149*d83cc019SAndroid Build Coastguard Worker 		fd = drm_open_driver(DRIVER_INTEL);
150*d83cc019SAndroid Build Coastguard Worker 		igt_require_gem(fd);
151*d83cc019SAndroid Build Coastguard Worker 		igt_fork_hang_detector(fd);
152*d83cc019SAndroid Build Coastguard Worker 	}
153*d83cc019SAndroid Build Coastguard Worker 
154*d83cc019SAndroid Build Coastguard Worker 	for (e = intel_execution_engines; e->name; e++) {
155*d83cc019SAndroid Build Coastguard Worker 		e2__ = gem_eb_flags_to_engine(e->exec_id | e->flags);
156*d83cc019SAndroid Build Coastguard Worker 		if (e2__.flags == -1)
157*d83cc019SAndroid Build Coastguard Worker 			continue;
158*d83cc019SAndroid Build Coastguard Worker 		e2 = &e2__;
159*d83cc019SAndroid Build Coastguard Worker 
160*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("legacy-%s", e->name)
161*d83cc019SAndroid Build Coastguard Worker 			spin(fd, e2, 3);
162*d83cc019SAndroid Build Coastguard Worker 
163*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("legacy-resubmit-%s", e->name)
164*d83cc019SAndroid Build Coastguard Worker 			spin_resubmit(fd, e2, 0);
165*d83cc019SAndroid Build Coastguard Worker 
166*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("legacy-resubmit-new-%s", e->name)
167*d83cc019SAndroid Build Coastguard Worker 			spin_resubmit(fd, e2, RESUBMIT_NEW_CTX);
168*d83cc019SAndroid Build Coastguard Worker 	}
169*d83cc019SAndroid Build Coastguard Worker 
__for_each_physical_engine(fd,e2)170*d83cc019SAndroid Build Coastguard Worker 	__for_each_physical_engine(fd, e2) {
171*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("%s", e2->name)
172*d83cc019SAndroid Build Coastguard Worker 			spin(fd, e2, 3);
173*d83cc019SAndroid Build Coastguard Worker 
174*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("resubmit-%s", e2->name)
175*d83cc019SAndroid Build Coastguard Worker 			spin_resubmit(fd, e2, 0);
176*d83cc019SAndroid Build Coastguard Worker 
177*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("resubmit-new-%s", e2->name)
178*d83cc019SAndroid Build Coastguard Worker 			spin_resubmit(fd, e2, RESUBMIT_NEW_CTX);
179*d83cc019SAndroid Build Coastguard Worker 
180*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("resubmit-all-%s", e2->name)
181*d83cc019SAndroid Build Coastguard Worker 			spin_resubmit(fd, e2, RESUBMIT_ALL_ENGINES);
182*d83cc019SAndroid Build Coastguard Worker 
183*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("resubmit-new-all-%s", e2->name)
184*d83cc019SAndroid Build Coastguard Worker 			spin_resubmit(fd, e2,
185*d83cc019SAndroid Build Coastguard Worker 				      RESUBMIT_NEW_CTX |
186*d83cc019SAndroid Build Coastguard Worker 				      RESUBMIT_ALL_ENGINES);
187*d83cc019SAndroid Build Coastguard Worker 	}
188*d83cc019SAndroid Build Coastguard Worker 
189*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("spin-each")
190*d83cc019SAndroid Build Coastguard Worker 		spin_on_all_engines(fd, 3);
191*d83cc019SAndroid Build Coastguard Worker 
192*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
193*d83cc019SAndroid Build Coastguard Worker 		igt_stop_hang_detector();
194*d83cc019SAndroid Build Coastguard Worker 		close(fd);
195*d83cc019SAndroid Build Coastguard Worker 	}
196*d83cc019SAndroid Build Coastguard Worker }
197