xref: /aosp_15_r20/external/igt-gpu-tools/tests/i915/gem_ctx_create.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 
30*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
31*d83cc019SAndroid Build Coastguard Worker #include <string.h>
32*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
33*d83cc019SAndroid Build Coastguard Worker #include <time.h>
34*d83cc019SAndroid Build Coastguard Worker 
35*d83cc019SAndroid Build Coastguard Worker #include "igt_rand.h"
36*d83cc019SAndroid Build Coastguard Worker #include "sw_sync.h"
37*d83cc019SAndroid Build Coastguard Worker 
38*d83cc019SAndroid Build Coastguard Worker #define LOCAL_I915_EXEC_BSD_SHIFT      (13)
39*d83cc019SAndroid Build Coastguard Worker #define LOCAL_I915_EXEC_BSD_MASK       (3 << LOCAL_I915_EXEC_BSD_SHIFT)
40*d83cc019SAndroid Build Coastguard Worker 
41*d83cc019SAndroid Build Coastguard Worker #define ENGINE_FLAGS  (I915_EXEC_RING_MASK | LOCAL_I915_EXEC_BSD_MASK)
42*d83cc019SAndroid Build Coastguard Worker 
43*d83cc019SAndroid Build Coastguard Worker static unsigned all_engines[16];
44*d83cc019SAndroid Build Coastguard Worker static unsigned all_nengine;
45*d83cc019SAndroid Build Coastguard Worker 
46*d83cc019SAndroid Build Coastguard Worker static unsigned ppgtt_engines[16];
47*d83cc019SAndroid Build Coastguard Worker static unsigned ppgtt_nengine;
48*d83cc019SAndroid Build Coastguard Worker 
create_ioctl(int fd,struct drm_i915_gem_context_create * arg)49*d83cc019SAndroid Build Coastguard Worker static int create_ioctl(int fd, struct drm_i915_gem_context_create *arg)
50*d83cc019SAndroid Build Coastguard Worker {
51*d83cc019SAndroid Build Coastguard Worker 	int err;
52*d83cc019SAndroid Build Coastguard Worker 
53*d83cc019SAndroid Build Coastguard Worker 	err = 0;
54*d83cc019SAndroid Build Coastguard Worker 	if (igt_ioctl(fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, arg)) {
55*d83cc019SAndroid Build Coastguard Worker 		err = -errno;
56*d83cc019SAndroid Build Coastguard Worker 		igt_assume(err);
57*d83cc019SAndroid Build Coastguard Worker 	}
58*d83cc019SAndroid Build Coastguard Worker 
59*d83cc019SAndroid Build Coastguard Worker 	errno = 0;
60*d83cc019SAndroid Build Coastguard Worker 	return err;
61*d83cc019SAndroid Build Coastguard Worker }
62*d83cc019SAndroid Build Coastguard Worker 
create_ext_ioctl(int i915,struct drm_i915_gem_context_create_ext * arg)63*d83cc019SAndroid Build Coastguard Worker static int create_ext_ioctl(int i915,
64*d83cc019SAndroid Build Coastguard Worker 			    struct drm_i915_gem_context_create_ext *arg)
65*d83cc019SAndroid Build Coastguard Worker {
66*d83cc019SAndroid Build Coastguard Worker 	int err;
67*d83cc019SAndroid Build Coastguard Worker 
68*d83cc019SAndroid Build Coastguard Worker 	err = 0;
69*d83cc019SAndroid Build Coastguard Worker 	if (igt_ioctl(i915, DRM_IOCTL_I915_GEM_CONTEXT_CREATE_EXT, arg)) {
70*d83cc019SAndroid Build Coastguard Worker 		err = -errno;
71*d83cc019SAndroid Build Coastguard Worker 		igt_assume(err);
72*d83cc019SAndroid Build Coastguard Worker 	}
73*d83cc019SAndroid Build Coastguard Worker 
74*d83cc019SAndroid Build Coastguard Worker 	errno = 0;
75*d83cc019SAndroid Build Coastguard Worker 	return err;
76*d83cc019SAndroid Build Coastguard Worker }
77*d83cc019SAndroid Build Coastguard Worker 
elapsed(const struct timespec * start,const struct timespec * end)78*d83cc019SAndroid Build Coastguard Worker static double elapsed(const struct timespec *start,
79*d83cc019SAndroid Build Coastguard Worker 		      const struct timespec *end)
80*d83cc019SAndroid Build Coastguard Worker {
81*d83cc019SAndroid Build Coastguard Worker 	return (end->tv_sec - start->tv_sec) + 1e-9*(end->tv_nsec - start->tv_nsec);
82*d83cc019SAndroid Build Coastguard Worker }
83*d83cc019SAndroid Build Coastguard Worker 
files(int core,int timeout,const int ncpus)84*d83cc019SAndroid Build Coastguard Worker static void files(int core, int timeout, const int ncpus)
85*d83cc019SAndroid Build Coastguard Worker {
86*d83cc019SAndroid Build Coastguard Worker 	const uint32_t bbe = MI_BATCH_BUFFER_END;
87*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_execbuffer2 execbuf;
88*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_exec_object2 obj;
89*d83cc019SAndroid Build Coastguard Worker 	uint32_t batch, name;
90*d83cc019SAndroid Build Coastguard Worker 
91*d83cc019SAndroid Build Coastguard Worker 	batch = gem_create(core, 4096);
92*d83cc019SAndroid Build Coastguard Worker 	gem_write(core, batch, 0, &bbe, sizeof(bbe));
93*d83cc019SAndroid Build Coastguard Worker 	name = gem_flink(core, batch);
94*d83cc019SAndroid Build Coastguard Worker 
95*d83cc019SAndroid Build Coastguard Worker 	memset(&obj, 0, sizeof(obj));
96*d83cc019SAndroid Build Coastguard Worker 	memset(&execbuf, 0, sizeof(execbuf));
97*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffers_ptr = to_user_pointer(&obj);
98*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffer_count = 1;
99*d83cc019SAndroid Build Coastguard Worker 
100*d83cc019SAndroid Build Coastguard Worker 	igt_fork(child, ncpus) {
101*d83cc019SAndroid Build Coastguard Worker 		struct timespec start, end;
102*d83cc019SAndroid Build Coastguard Worker 		unsigned count = 0;
103*d83cc019SAndroid Build Coastguard Worker 
104*d83cc019SAndroid Build Coastguard Worker 		clock_gettime(CLOCK_MONOTONIC, &start);
105*d83cc019SAndroid Build Coastguard Worker 		do {
106*d83cc019SAndroid Build Coastguard Worker 			do {
107*d83cc019SAndroid Build Coastguard Worker 				int fd = drm_open_driver(DRIVER_INTEL);
108*d83cc019SAndroid Build Coastguard Worker 				obj.handle = gem_open(fd, name);
109*d83cc019SAndroid Build Coastguard Worker 				execbuf.flags &= ~ENGINE_FLAGS;
110*d83cc019SAndroid Build Coastguard Worker 				execbuf.flags |= ppgtt_engines[count % ppgtt_nengine];
111*d83cc019SAndroid Build Coastguard Worker 				gem_execbuf(fd, &execbuf);
112*d83cc019SAndroid Build Coastguard Worker 				close(fd);
113*d83cc019SAndroid Build Coastguard Worker 			} while (++count & 1023);
114*d83cc019SAndroid Build Coastguard Worker 			clock_gettime(CLOCK_MONOTONIC, &end);
115*d83cc019SAndroid Build Coastguard Worker 		} while (elapsed(&start, &end) < timeout);
116*d83cc019SAndroid Build Coastguard Worker 
117*d83cc019SAndroid Build Coastguard Worker 		gem_sync(core, batch);
118*d83cc019SAndroid Build Coastguard Worker 		clock_gettime(CLOCK_MONOTONIC, &end);
119*d83cc019SAndroid Build Coastguard Worker 		igt_info("[%d] File creation + execution: %.3f us\n",
120*d83cc019SAndroid Build Coastguard Worker 			 child, elapsed(&start, &end) / count *1e6);
121*d83cc019SAndroid Build Coastguard Worker 	}
122*d83cc019SAndroid Build Coastguard Worker 	igt_waitchildren();
123*d83cc019SAndroid Build Coastguard Worker 
124*d83cc019SAndroid Build Coastguard Worker 	gem_close(core, batch);
125*d83cc019SAndroid Build Coastguard Worker }
126*d83cc019SAndroid Build Coastguard Worker 
active(int fd,unsigned engine,int timeout,int ncpus)127*d83cc019SAndroid Build Coastguard Worker static void active(int fd, unsigned engine, int timeout, int ncpus)
128*d83cc019SAndroid Build Coastguard Worker {
129*d83cc019SAndroid Build Coastguard Worker 	const uint32_t bbe = MI_BATCH_BUFFER_END;
130*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_execbuffer2 execbuf;
131*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_exec_object2 obj;
132*d83cc019SAndroid Build Coastguard Worker 	unsigned int nengine, engines[16];
133*d83cc019SAndroid Build Coastguard Worker 	unsigned *shared;
134*d83cc019SAndroid Build Coastguard Worker 
135*d83cc019SAndroid Build Coastguard Worker 	if (engine == ALL_ENGINES) {
136*d83cc019SAndroid Build Coastguard Worker 		igt_require(all_nengine);
137*d83cc019SAndroid Build Coastguard Worker 		nengine = all_nengine;
138*d83cc019SAndroid Build Coastguard Worker 		memcpy(engines, all_engines, sizeof(engines[0])*nengine);
139*d83cc019SAndroid Build Coastguard Worker 	} else {
140*d83cc019SAndroid Build Coastguard Worker 		gem_require_ring(fd, engine);
141*d83cc019SAndroid Build Coastguard Worker 		nengine = 1;
142*d83cc019SAndroid Build Coastguard Worker 		engines[0] = engine;
143*d83cc019SAndroid Build Coastguard Worker 	}
144*d83cc019SAndroid Build Coastguard Worker 
145*d83cc019SAndroid Build Coastguard Worker 	shared = mmap(NULL, 4096, PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
146*d83cc019SAndroid Build Coastguard Worker 	igt_assert(shared != MAP_FAILED);
147*d83cc019SAndroid Build Coastguard Worker 
148*d83cc019SAndroid Build Coastguard Worker 	memset(&obj, 0, sizeof(obj));
149*d83cc019SAndroid Build Coastguard Worker 	obj.handle = gem_create(fd, 4096);
150*d83cc019SAndroid Build Coastguard Worker 	gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
151*d83cc019SAndroid Build Coastguard Worker 
152*d83cc019SAndroid Build Coastguard Worker 	memset(&execbuf, 0, sizeof(execbuf));
153*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffers_ptr = to_user_pointer(&obj);
154*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffer_count = 1;
155*d83cc019SAndroid Build Coastguard Worker 
156*d83cc019SAndroid Build Coastguard Worker 	if (ncpus < 0) {
157*d83cc019SAndroid Build Coastguard Worker 		igt_fork(child, ppgtt_nengine) {
158*d83cc019SAndroid Build Coastguard Worker 			unsigned long count = 0;
159*d83cc019SAndroid Build Coastguard Worker 
160*d83cc019SAndroid Build Coastguard Worker 			if (ppgtt_engines[child] == engine)
161*d83cc019SAndroid Build Coastguard Worker 				continue;
162*d83cc019SAndroid Build Coastguard Worker 
163*d83cc019SAndroid Build Coastguard Worker 			execbuf.flags = ppgtt_engines[child];
164*d83cc019SAndroid Build Coastguard Worker 
165*d83cc019SAndroid Build Coastguard Worker 			while (!*(volatile unsigned *)shared) {
166*d83cc019SAndroid Build Coastguard Worker 				obj.handle = gem_create(fd, 4096 << 10);
167*d83cc019SAndroid Build Coastguard Worker 				gem_write(fd, obj.handle, 0, &bbe, sizeof(bbe));
168*d83cc019SAndroid Build Coastguard Worker 
169*d83cc019SAndroid Build Coastguard Worker 				gem_execbuf(fd, &execbuf);
170*d83cc019SAndroid Build Coastguard Worker 				gem_close(fd, obj.handle);
171*d83cc019SAndroid Build Coastguard Worker 				count++;
172*d83cc019SAndroid Build Coastguard Worker 			}
173*d83cc019SAndroid Build Coastguard Worker 
174*d83cc019SAndroid Build Coastguard Worker 			igt_debug("hog[%d]: cycles=%lu\n", child, count);
175*d83cc019SAndroid Build Coastguard Worker 		}
176*d83cc019SAndroid Build Coastguard Worker 		ncpus = -ncpus;
177*d83cc019SAndroid Build Coastguard Worker 	}
178*d83cc019SAndroid Build Coastguard Worker 
179*d83cc019SAndroid Build Coastguard Worker 	igt_fork(child, ncpus) {
180*d83cc019SAndroid Build Coastguard Worker 		struct timespec start, end;
181*d83cc019SAndroid Build Coastguard Worker 		unsigned count = 0;
182*d83cc019SAndroid Build Coastguard Worker 
183*d83cc019SAndroid Build Coastguard Worker 		clock_gettime(CLOCK_MONOTONIC, &start);
184*d83cc019SAndroid Build Coastguard Worker 		do {
185*d83cc019SAndroid Build Coastguard Worker 			do {
186*d83cc019SAndroid Build Coastguard Worker 				execbuf.rsvd1 = gem_context_create(fd);
187*d83cc019SAndroid Build Coastguard Worker 				for (unsigned n = 0; n < nengine; n++) {
188*d83cc019SAndroid Build Coastguard Worker 					execbuf.flags = engines[n];
189*d83cc019SAndroid Build Coastguard Worker 					gem_execbuf(fd, &execbuf);
190*d83cc019SAndroid Build Coastguard Worker 				}
191*d83cc019SAndroid Build Coastguard Worker 				gem_context_destroy(fd, execbuf.rsvd1);
192*d83cc019SAndroid Build Coastguard Worker 			} while (++count & 1023);
193*d83cc019SAndroid Build Coastguard Worker 			clock_gettime(CLOCK_MONOTONIC, &end);
194*d83cc019SAndroid Build Coastguard Worker 		} while (elapsed(&start, &end) < timeout);
195*d83cc019SAndroid Build Coastguard Worker 
196*d83cc019SAndroid Build Coastguard Worker 		gem_sync(fd, obj.handle);
197*d83cc019SAndroid Build Coastguard Worker 		clock_gettime(CLOCK_MONOTONIC, &end);
198*d83cc019SAndroid Build Coastguard Worker 		igt_info("[%d] Context creation + execution: %.3f us\n",
199*d83cc019SAndroid Build Coastguard Worker 			 child, elapsed(&start, &end) / count *1e6);
200*d83cc019SAndroid Build Coastguard Worker 
201*d83cc019SAndroid Build Coastguard Worker 		shared[0] = 1;
202*d83cc019SAndroid Build Coastguard Worker 	}
203*d83cc019SAndroid Build Coastguard Worker 	igt_waitchildren();
204*d83cc019SAndroid Build Coastguard Worker 
205*d83cc019SAndroid Build Coastguard Worker 	gem_close(fd, obj.handle);
206*d83cc019SAndroid Build Coastguard Worker 	munmap(shared, 4096);
207*d83cc019SAndroid Build Coastguard Worker }
208*d83cc019SAndroid Build Coastguard Worker 
xchg_u32(void * array,unsigned i,unsigned j)209*d83cc019SAndroid Build Coastguard Worker static void xchg_u32(void *array, unsigned i, unsigned j)
210*d83cc019SAndroid Build Coastguard Worker {
211*d83cc019SAndroid Build Coastguard Worker 	uint32_t *a = array, tmp;
212*d83cc019SAndroid Build Coastguard Worker 
213*d83cc019SAndroid Build Coastguard Worker 	tmp = a[i];
214*d83cc019SAndroid Build Coastguard Worker 	a[i] = a[j];
215*d83cc019SAndroid Build Coastguard Worker 	a[j] = tmp;
216*d83cc019SAndroid Build Coastguard Worker }
217*d83cc019SAndroid Build Coastguard Worker 
__context_size(int fd)218*d83cc019SAndroid Build Coastguard Worker static unsigned __context_size(int fd)
219*d83cc019SAndroid Build Coastguard Worker {
220*d83cc019SAndroid Build Coastguard Worker 	switch (intel_gen(intel_get_drm_devid(fd))) {
221*d83cc019SAndroid Build Coastguard Worker 	case 0:
222*d83cc019SAndroid Build Coastguard Worker 	case 1:
223*d83cc019SAndroid Build Coastguard Worker 	case 2:
224*d83cc019SAndroid Build Coastguard Worker 	case 3:
225*d83cc019SAndroid Build Coastguard Worker 	case 4:
226*d83cc019SAndroid Build Coastguard Worker 	case 5:
227*d83cc019SAndroid Build Coastguard Worker 	case 6:
228*d83cc019SAndroid Build Coastguard Worker 	case 7: return 17 << 12;
229*d83cc019SAndroid Build Coastguard Worker 	case 8: return 20 << 12;
230*d83cc019SAndroid Build Coastguard Worker 	case 9: return 22 << 12;
231*d83cc019SAndroid Build Coastguard Worker 	default: return 32 << 12;
232*d83cc019SAndroid Build Coastguard Worker 	}
233*d83cc019SAndroid Build Coastguard Worker }
234*d83cc019SAndroid Build Coastguard Worker 
context_size(int fd)235*d83cc019SAndroid Build Coastguard Worker static unsigned context_size(int fd)
236*d83cc019SAndroid Build Coastguard Worker {
237*d83cc019SAndroid Build Coastguard Worker 	uint64_t size;
238*d83cc019SAndroid Build Coastguard Worker 
239*d83cc019SAndroid Build Coastguard Worker 	size = __context_size(fd);
240*d83cc019SAndroid Build Coastguard Worker 	if (ppgtt_nengine > 1) {
241*d83cc019SAndroid Build Coastguard Worker 		size += 4 << 12; /* ringbuffer as well */
242*d83cc019SAndroid Build Coastguard Worker 		size *= ppgtt_nengine;
243*d83cc019SAndroid Build Coastguard Worker 	}
244*d83cc019SAndroid Build Coastguard Worker 
245*d83cc019SAndroid Build Coastguard Worker 	return size;
246*d83cc019SAndroid Build Coastguard Worker }
247*d83cc019SAndroid Build Coastguard Worker 
total_avail_mem(unsigned mode)248*d83cc019SAndroid Build Coastguard Worker static uint64_t total_avail_mem(unsigned mode)
249*d83cc019SAndroid Build Coastguard Worker {
250*d83cc019SAndroid Build Coastguard Worker 	uint64_t total = intel_get_avail_ram_mb();
251*d83cc019SAndroid Build Coastguard Worker 	if (mode & CHECK_SWAP)
252*d83cc019SAndroid Build Coastguard Worker 		total += intel_get_total_swap_mb();
253*d83cc019SAndroid Build Coastguard Worker 	return total << 20;
254*d83cc019SAndroid Build Coastguard Worker }
255*d83cc019SAndroid Build Coastguard Worker 
maximum(int fd,int ncpus,unsigned mode)256*d83cc019SAndroid Build Coastguard Worker static void maximum(int fd, int ncpus, unsigned mode)
257*d83cc019SAndroid Build Coastguard Worker {
258*d83cc019SAndroid Build Coastguard Worker 	const uint32_t bbe = MI_BATCH_BUFFER_END;
259*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_execbuffer2 execbuf;
260*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_exec_object2 obj[2];
261*d83cc019SAndroid Build Coastguard Worker 	uint64_t avail_mem = total_avail_mem(mode);
262*d83cc019SAndroid Build Coastguard Worker 	unsigned ctx_size = context_size(fd);
263*d83cc019SAndroid Build Coastguard Worker 	uint32_t *contexts = NULL;
264*d83cc019SAndroid Build Coastguard Worker 	unsigned long count = 0;
265*d83cc019SAndroid Build Coastguard Worker 	uint32_t ctx_id;
266*d83cc019SAndroid Build Coastguard Worker 
267*d83cc019SAndroid Build Coastguard Worker 	do {
268*d83cc019SAndroid Build Coastguard Worker 		int err;
269*d83cc019SAndroid Build Coastguard Worker 
270*d83cc019SAndroid Build Coastguard Worker 		if ((count & -count) == count) {
271*d83cc019SAndroid Build Coastguard Worker 			int sz = count ? 2*count : 1;
272*d83cc019SAndroid Build Coastguard Worker 			contexts = realloc(contexts,
273*d83cc019SAndroid Build Coastguard Worker 					   sz*sizeof(*contexts));
274*d83cc019SAndroid Build Coastguard Worker 			igt_assert(contexts);
275*d83cc019SAndroid Build Coastguard Worker 		}
276*d83cc019SAndroid Build Coastguard Worker 
277*d83cc019SAndroid Build Coastguard Worker 		err = -ENOMEM;
278*d83cc019SAndroid Build Coastguard Worker 		if (avail_mem > (count + 1) * ctx_size)
279*d83cc019SAndroid Build Coastguard Worker 			err = __gem_context_create(fd, &ctx_id);
280*d83cc019SAndroid Build Coastguard Worker 		if (err) {
281*d83cc019SAndroid Build Coastguard Worker 			igt_info("Created %lu contexts, before failing with '%s' [%d]\n",
282*d83cc019SAndroid Build Coastguard Worker 				 count, strerror(-err), -err);
283*d83cc019SAndroid Build Coastguard Worker 			break;
284*d83cc019SAndroid Build Coastguard Worker 		}
285*d83cc019SAndroid Build Coastguard Worker 
286*d83cc019SAndroid Build Coastguard Worker 		contexts[count++] = ctx_id;
287*d83cc019SAndroid Build Coastguard Worker 	} while (1);
288*d83cc019SAndroid Build Coastguard Worker 	igt_require(count);
289*d83cc019SAndroid Build Coastguard Worker 
290*d83cc019SAndroid Build Coastguard Worker 	memset(obj, 0, sizeof(obj));
291*d83cc019SAndroid Build Coastguard Worker 	obj[1].handle = gem_create(fd, 4096);
292*d83cc019SAndroid Build Coastguard Worker 	gem_write(fd, obj[1].handle, 0, &bbe, sizeof(bbe));
293*d83cc019SAndroid Build Coastguard Worker 
294*d83cc019SAndroid Build Coastguard Worker 	memset(&execbuf, 0, sizeof(execbuf));
295*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffers_ptr = to_user_pointer(obj);
296*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffer_count = 2;
297*d83cc019SAndroid Build Coastguard Worker 
298*d83cc019SAndroid Build Coastguard Worker 	igt_fork(child, ncpus) {
299*d83cc019SAndroid Build Coastguard Worker 		struct timespec start, end;
300*d83cc019SAndroid Build Coastguard Worker 
301*d83cc019SAndroid Build Coastguard Worker 		hars_petruska_f54_1_random_perturb(child);
302*d83cc019SAndroid Build Coastguard Worker 		obj[0].handle = gem_create(fd, 4096);
303*d83cc019SAndroid Build Coastguard Worker 
304*d83cc019SAndroid Build Coastguard Worker 		clock_gettime(CLOCK_MONOTONIC, &start);
305*d83cc019SAndroid Build Coastguard Worker 		for (int repeat = 0; repeat < 3; repeat++) {
306*d83cc019SAndroid Build Coastguard Worker 			igt_permute_array(contexts, count, xchg_u32);
307*d83cc019SAndroid Build Coastguard Worker 			igt_permute_array(all_engines, all_nengine, xchg_u32);
308*d83cc019SAndroid Build Coastguard Worker 
309*d83cc019SAndroid Build Coastguard Worker 			for (unsigned long i = 0; i < count; i++) {
310*d83cc019SAndroid Build Coastguard Worker 				execbuf.rsvd1 = contexts[i];
311*d83cc019SAndroid Build Coastguard Worker 				for (unsigned long j = 0; j < all_nengine; j++) {
312*d83cc019SAndroid Build Coastguard Worker 					execbuf.flags = all_engines[j];
313*d83cc019SAndroid Build Coastguard Worker 					gem_execbuf(fd, &execbuf);
314*d83cc019SAndroid Build Coastguard Worker 				}
315*d83cc019SAndroid Build Coastguard Worker 			}
316*d83cc019SAndroid Build Coastguard Worker 		}
317*d83cc019SAndroid Build Coastguard Worker 		gem_sync(fd, obj[0].handle);
318*d83cc019SAndroid Build Coastguard Worker 		clock_gettime(CLOCK_MONOTONIC, &end);
319*d83cc019SAndroid Build Coastguard Worker 		gem_close(fd, obj[0].handle);
320*d83cc019SAndroid Build Coastguard Worker 
321*d83cc019SAndroid Build Coastguard Worker 		igt_info("[%d] Context execution: %.3f us\n", child,
322*d83cc019SAndroid Build Coastguard Worker 			 elapsed(&start, &end) / (3 * count * all_nengine) * 1e6);
323*d83cc019SAndroid Build Coastguard Worker 	}
324*d83cc019SAndroid Build Coastguard Worker 	igt_waitchildren();
325*d83cc019SAndroid Build Coastguard Worker 
326*d83cc019SAndroid Build Coastguard Worker 	gem_close(fd, obj[1].handle);
327*d83cc019SAndroid Build Coastguard Worker 
328*d83cc019SAndroid Build Coastguard Worker 	for (unsigned long i = 0; i < count; i++)
329*d83cc019SAndroid Build Coastguard Worker 		gem_context_destroy(fd, contexts[i]);
330*d83cc019SAndroid Build Coastguard Worker 	free(contexts);
331*d83cc019SAndroid Build Coastguard Worker }
332*d83cc019SAndroid Build Coastguard Worker 
basic_ext_param(int i915)333*d83cc019SAndroid Build Coastguard Worker static void basic_ext_param(int i915)
334*d83cc019SAndroid Build Coastguard Worker {
335*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_context_create_ext_setparam ext = {
336*d83cc019SAndroid Build Coastguard Worker 		{ .name = I915_CONTEXT_CREATE_EXT_SETPARAM },
337*d83cc019SAndroid Build Coastguard Worker 	};
338*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_context_create_ext create = {
339*d83cc019SAndroid Build Coastguard Worker 		.flags = I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS
340*d83cc019SAndroid Build Coastguard Worker 	};
341*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_context_param get;
342*d83cc019SAndroid Build Coastguard Worker 
343*d83cc019SAndroid Build Coastguard Worker 	igt_require(create_ext_ioctl(i915, &create) == 0);
344*d83cc019SAndroid Build Coastguard Worker 	gem_context_destroy(i915, create.ctx_id);
345*d83cc019SAndroid Build Coastguard Worker 
346*d83cc019SAndroid Build Coastguard Worker 	create.extensions = -1ull;
347*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(create_ext_ioctl(i915, &create), -EFAULT);
348*d83cc019SAndroid Build Coastguard Worker 
349*d83cc019SAndroid Build Coastguard Worker 	create.extensions = to_user_pointer(&ext);
350*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(create_ext_ioctl(i915, &create), -EINVAL);
351*d83cc019SAndroid Build Coastguard Worker 
352*d83cc019SAndroid Build Coastguard Worker 	ext.param.param = I915_CONTEXT_PARAM_PRIORITY;
353*d83cc019SAndroid Build Coastguard Worker 	if (create_ext_ioctl(i915, &create) != -ENODEV) {
354*d83cc019SAndroid Build Coastguard Worker 		gem_context_destroy(i915, create.ctx_id);
355*d83cc019SAndroid Build Coastguard Worker 
356*d83cc019SAndroid Build Coastguard Worker 		ext.base.next_extension = -1ull;
357*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(create_ext_ioctl(i915, &create), -EFAULT);
358*d83cc019SAndroid Build Coastguard Worker 		ext.base.next_extension = to_user_pointer(&ext);
359*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(create_ext_ioctl(i915, &create), -E2BIG);
360*d83cc019SAndroid Build Coastguard Worker 		ext.base.next_extension = 0;
361*d83cc019SAndroid Build Coastguard Worker 
362*d83cc019SAndroid Build Coastguard Worker 		ext.param.value = 32;
363*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(create_ext_ioctl(i915, &create), 0);
364*d83cc019SAndroid Build Coastguard Worker 
365*d83cc019SAndroid Build Coastguard Worker 		memset(&get, 0, sizeof(get));
366*d83cc019SAndroid Build Coastguard Worker 		get.ctx_id = create.ctx_id;
367*d83cc019SAndroid Build Coastguard Worker 		get.param = I915_CONTEXT_PARAM_PRIORITY;
368*d83cc019SAndroid Build Coastguard Worker 		gem_context_get_param(i915, &get);
369*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(get.value, ext.param.value);
370*d83cc019SAndroid Build Coastguard Worker 
371*d83cc019SAndroid Build Coastguard Worker 		gem_context_destroy(i915, create.ctx_id);
372*d83cc019SAndroid Build Coastguard Worker 
373*d83cc019SAndroid Build Coastguard Worker 		/* Having demonstrated a valid setup, check a few invalids */
374*d83cc019SAndroid Build Coastguard Worker 		ext.param.ctx_id = 1;
375*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(create_ext_ioctl(i915, &create), -EINVAL);
376*d83cc019SAndroid Build Coastguard Worker 		ext.param.ctx_id = create.ctx_id;
377*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(create_ext_ioctl(i915, &create), -EINVAL);
378*d83cc019SAndroid Build Coastguard Worker 		ext.param.ctx_id = -1;
379*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(create_ext_ioctl(i915, &create), -EINVAL);
380*d83cc019SAndroid Build Coastguard Worker 		ext.param.ctx_id = 0;
381*d83cc019SAndroid Build Coastguard Worker 	}
382*d83cc019SAndroid Build Coastguard Worker }
383*d83cc019SAndroid Build Coastguard Worker 
check_single_timeline(int i915,uint32_t ctx,int num_engines)384*d83cc019SAndroid Build Coastguard Worker static void check_single_timeline(int i915, uint32_t ctx, int num_engines)
385*d83cc019SAndroid Build Coastguard Worker {
386*d83cc019SAndroid Build Coastguard Worker #define RCS_TIMESTAMP (0x2000 + 0x358)
387*d83cc019SAndroid Build Coastguard Worker 	const int gen = intel_gen(intel_get_drm_devid(i915));
388*d83cc019SAndroid Build Coastguard Worker 	const int has_64bit_reloc = gen >= 8;
389*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_exec_object2 results = { .handle = gem_create(i915, 4096) };
390*d83cc019SAndroid Build Coastguard Worker 	const uint32_t bbe = MI_BATCH_BUFFER_END;
391*d83cc019SAndroid Build Coastguard Worker 	int timeline = sw_sync_timeline_create();
392*d83cc019SAndroid Build Coastguard Worker 	uint32_t last, *map;
393*d83cc019SAndroid Build Coastguard Worker 
394*d83cc019SAndroid Build Coastguard Worker 	{
395*d83cc019SAndroid Build Coastguard Worker 		struct drm_i915_gem_execbuffer2 execbuf = {
396*d83cc019SAndroid Build Coastguard Worker 			.buffers_ptr = to_user_pointer(&results),
397*d83cc019SAndroid Build Coastguard Worker 			.buffer_count = 1,
398*d83cc019SAndroid Build Coastguard Worker 			.rsvd1 = ctx,
399*d83cc019SAndroid Build Coastguard Worker 		};
400*d83cc019SAndroid Build Coastguard Worker 		gem_write(i915, results.handle, 0, &bbe, sizeof(bbe));
401*d83cc019SAndroid Build Coastguard Worker 		gem_execbuf(i915, &execbuf);
402*d83cc019SAndroid Build Coastguard Worker 		results.flags = EXEC_OBJECT_PINNED;
403*d83cc019SAndroid Build Coastguard Worker 	}
404*d83cc019SAndroid Build Coastguard Worker 
405*d83cc019SAndroid Build Coastguard Worker 	for (int i = 0; i < num_engines; i++) {
406*d83cc019SAndroid Build Coastguard Worker 		struct drm_i915_gem_exec_object2 obj[2] = {
407*d83cc019SAndroid Build Coastguard Worker 			results, /* write hazard lies! */
408*d83cc019SAndroid Build Coastguard Worker 			{ .handle = gem_create(i915, 4096) },
409*d83cc019SAndroid Build Coastguard Worker 		};
410*d83cc019SAndroid Build Coastguard Worker 		struct drm_i915_gem_execbuffer2 execbuf = {
411*d83cc019SAndroid Build Coastguard Worker 			.buffers_ptr = to_user_pointer(obj),
412*d83cc019SAndroid Build Coastguard Worker 			.buffer_count = 2,
413*d83cc019SAndroid Build Coastguard Worker 			.rsvd1 = ctx,
414*d83cc019SAndroid Build Coastguard Worker 			.rsvd2 = sw_sync_timeline_create_fence(timeline, num_engines - i),
415*d83cc019SAndroid Build Coastguard Worker 			.flags = i | I915_EXEC_FENCE_IN,
416*d83cc019SAndroid Build Coastguard Worker 		};
417*d83cc019SAndroid Build Coastguard Worker 		uint64_t offset = results.offset + 4 * i;
418*d83cc019SAndroid Build Coastguard Worker 		uint32_t *cs;
419*d83cc019SAndroid Build Coastguard Worker 		int j = 0;
420*d83cc019SAndroid Build Coastguard Worker 
421*d83cc019SAndroid Build Coastguard Worker 		cs = gem_mmap__cpu(i915, obj[1].handle, 0, 4096, PROT_WRITE);
422*d83cc019SAndroid Build Coastguard Worker 
423*d83cc019SAndroid Build Coastguard Worker 		cs[j] = 0x24 << 23 | 1; /* SRM */
424*d83cc019SAndroid Build Coastguard Worker 		if (has_64bit_reloc)
425*d83cc019SAndroid Build Coastguard Worker 			cs[j]++;
426*d83cc019SAndroid Build Coastguard Worker 		j++;
427*d83cc019SAndroid Build Coastguard Worker 		cs[j++] = RCS_TIMESTAMP;
428*d83cc019SAndroid Build Coastguard Worker 		cs[j++] = offset;
429*d83cc019SAndroid Build Coastguard Worker 		if (has_64bit_reloc)
430*d83cc019SAndroid Build Coastguard Worker 			cs[j++] = offset >> 32;
431*d83cc019SAndroid Build Coastguard Worker 		cs[j++] = MI_BATCH_BUFFER_END;
432*d83cc019SAndroid Build Coastguard Worker 
433*d83cc019SAndroid Build Coastguard Worker 		munmap(cs, 4096);
434*d83cc019SAndroid Build Coastguard Worker 
435*d83cc019SAndroid Build Coastguard Worker 		gem_execbuf(i915, &execbuf);
436*d83cc019SAndroid Build Coastguard Worker 		gem_close(i915, obj[1].handle);
437*d83cc019SAndroid Build Coastguard Worker 		close(execbuf.rsvd2);
438*d83cc019SAndroid Build Coastguard Worker 	}
439*d83cc019SAndroid Build Coastguard Worker 	close(timeline);
440*d83cc019SAndroid Build Coastguard Worker 	gem_sync(i915, results.handle);
441*d83cc019SAndroid Build Coastguard Worker 
442*d83cc019SAndroid Build Coastguard Worker 	map = gem_mmap__cpu(i915, results.handle, 0, 4096, PROT_READ);
443*d83cc019SAndroid Build Coastguard Worker 	gem_set_domain(i915, results.handle, I915_GEM_DOMAIN_CPU, 0);
444*d83cc019SAndroid Build Coastguard Worker 	gem_close(i915, results.handle);
445*d83cc019SAndroid Build Coastguard Worker 
446*d83cc019SAndroid Build Coastguard Worker 	last = map[0];
447*d83cc019SAndroid Build Coastguard Worker 	for (int i = 1; i < num_engines; i++) {
448*d83cc019SAndroid Build Coastguard Worker 		igt_assert_f((map[i] - last) > 0,
449*d83cc019SAndroid Build Coastguard Worker 			     "Engine instance [%d] executed too early: this:%x, last:%x\n",
450*d83cc019SAndroid Build Coastguard Worker 			     i, map[i], last);
451*d83cc019SAndroid Build Coastguard Worker 		last = map[i];
452*d83cc019SAndroid Build Coastguard Worker 	}
453*d83cc019SAndroid Build Coastguard Worker 	munmap(map, 4096);
454*d83cc019SAndroid Build Coastguard Worker }
455*d83cc019SAndroid Build Coastguard Worker 
iris_pipeline(int i915)456*d83cc019SAndroid Build Coastguard Worker static void iris_pipeline(int i915)
457*d83cc019SAndroid Build Coastguard Worker {
458*d83cc019SAndroid Build Coastguard Worker #ifdef I915_DEFINE_CONTEXT_PARAM_ENGINES
459*d83cc019SAndroid Build Coastguard Worker #define RCS0 {0, 0}
460*d83cc019SAndroid Build Coastguard Worker 	I915_DEFINE_CONTEXT_PARAM_ENGINES(engines, 2) = {
461*d83cc019SAndroid Build Coastguard Worker 		.engines = { RCS0, RCS0 }
462*d83cc019SAndroid Build Coastguard Worker 	};
463*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_context_create_ext_setparam p_engines = {
464*d83cc019SAndroid Build Coastguard Worker 		.base = {
465*d83cc019SAndroid Build Coastguard Worker 			.name = I915_CONTEXT_CREATE_EXT_SETPARAM,
466*d83cc019SAndroid Build Coastguard Worker 			.next_extension = 0, /* end of chain */
467*d83cc019SAndroid Build Coastguard Worker 		},
468*d83cc019SAndroid Build Coastguard Worker 		.param = {
469*d83cc019SAndroid Build Coastguard Worker 			.param = I915_CONTEXT_PARAM_ENGINES,
470*d83cc019SAndroid Build Coastguard Worker 			.value = to_user_pointer(&engines),
471*d83cc019SAndroid Build Coastguard Worker 			.size = sizeof(engines),
472*d83cc019SAndroid Build Coastguard Worker 		},
473*d83cc019SAndroid Build Coastguard Worker 	};
474*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_context_create_ext_setparam p_recover = {
475*d83cc019SAndroid Build Coastguard Worker 		.base = {
476*d83cc019SAndroid Build Coastguard Worker 			.name =I915_CONTEXT_CREATE_EXT_SETPARAM,
477*d83cc019SAndroid Build Coastguard Worker 			.next_extension = to_user_pointer(&p_engines),
478*d83cc019SAndroid Build Coastguard Worker 		},
479*d83cc019SAndroid Build Coastguard Worker 		.param = {
480*d83cc019SAndroid Build Coastguard Worker 			.param = I915_CONTEXT_PARAM_RECOVERABLE,
481*d83cc019SAndroid Build Coastguard Worker 			.value = 0,
482*d83cc019SAndroid Build Coastguard Worker 		},
483*d83cc019SAndroid Build Coastguard Worker 	};
484*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_context_create_ext_setparam p_prio = {
485*d83cc019SAndroid Build Coastguard Worker 		.base = {
486*d83cc019SAndroid Build Coastguard Worker 			.name =I915_CONTEXT_CREATE_EXT_SETPARAM,
487*d83cc019SAndroid Build Coastguard Worker 			.next_extension = to_user_pointer(&p_recover),
488*d83cc019SAndroid Build Coastguard Worker 		},
489*d83cc019SAndroid Build Coastguard Worker 		.param = {
490*d83cc019SAndroid Build Coastguard Worker 			.param = I915_CONTEXT_PARAM_PRIORITY,
491*d83cc019SAndroid Build Coastguard Worker 			.value = 768,
492*d83cc019SAndroid Build Coastguard Worker 		},
493*d83cc019SAndroid Build Coastguard Worker 	};
494*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_context_create_ext create = {
495*d83cc019SAndroid Build Coastguard Worker 		.flags = (I915_CONTEXT_CREATE_FLAGS_SINGLE_TIMELINE |
496*d83cc019SAndroid Build Coastguard Worker 			  I915_CONTEXT_CREATE_FLAGS_USE_EXTENSIONS),
497*d83cc019SAndroid Build Coastguard Worker 	};
498*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_context_param get;
499*d83cc019SAndroid Build Coastguard Worker 
500*d83cc019SAndroid Build Coastguard Worker 	igt_require(create_ext_ioctl(i915, &create) == 0);
501*d83cc019SAndroid Build Coastguard Worker 
502*d83cc019SAndroid Build Coastguard Worker 	create.extensions = to_user_pointer(&p_prio);
503*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(create_ext_ioctl(i915, &create), 0);
504*d83cc019SAndroid Build Coastguard Worker 
505*d83cc019SAndroid Build Coastguard Worker 	memset(&get, 0, sizeof(get));
506*d83cc019SAndroid Build Coastguard Worker 	get.ctx_id = create.ctx_id;
507*d83cc019SAndroid Build Coastguard Worker 	get.param = I915_CONTEXT_PARAM_PRIORITY;
508*d83cc019SAndroid Build Coastguard Worker 	gem_context_get_param(i915, &get);
509*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(get.value, p_prio.param.value);
510*d83cc019SAndroid Build Coastguard Worker 
511*d83cc019SAndroid Build Coastguard Worker 	memset(&get, 0, sizeof(get));
512*d83cc019SAndroid Build Coastguard Worker 	get.ctx_id = create.ctx_id;
513*d83cc019SAndroid Build Coastguard Worker 	get.param = I915_CONTEXT_PARAM_RECOVERABLE;
514*d83cc019SAndroid Build Coastguard Worker 	gem_context_get_param(i915, &get);
515*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(get.value, 0);
516*d83cc019SAndroid Build Coastguard Worker 
517*d83cc019SAndroid Build Coastguard Worker 	check_single_timeline(i915, create.ctx_id, 2);
518*d83cc019SAndroid Build Coastguard Worker 
519*d83cc019SAndroid Build Coastguard Worker 	gem_context_destroy(i915, create.ctx_id);
520*d83cc019SAndroid Build Coastguard Worker #endif /* I915_DEFINE_CONTEXT_PARAM_ENGINES */
521*d83cc019SAndroid Build Coastguard Worker }
522*d83cc019SAndroid Build Coastguard Worker 
523*d83cc019SAndroid Build Coastguard Worker igt_main
524*d83cc019SAndroid Build Coastguard Worker {
525*d83cc019SAndroid Build Coastguard Worker 	const int ncpus = sysconf(_SC_NPROCESSORS_ONLN);
526*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_context_create create;
527*d83cc019SAndroid Build Coastguard Worker 	int fd = -1;
528*d83cc019SAndroid Build Coastguard Worker 
529*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
530*d83cc019SAndroid Build Coastguard Worker 		unsigned engine;
531*d83cc019SAndroid Build Coastguard Worker 
532*d83cc019SAndroid Build Coastguard Worker 		fd = drm_open_driver(DRIVER_INTEL);
533*d83cc019SAndroid Build Coastguard Worker 		igt_require_gem(fd);
534*d83cc019SAndroid Build Coastguard Worker 		gem_require_contexts(fd);
535*d83cc019SAndroid Build Coastguard Worker 
536*d83cc019SAndroid Build Coastguard Worker 		for_each_physical_engine(fd, engine)
537*d83cc019SAndroid Build Coastguard Worker 			all_engines[all_nengine++] = engine;
538*d83cc019SAndroid Build Coastguard Worker 		igt_require(all_nengine);
539*d83cc019SAndroid Build Coastguard Worker 
540*d83cc019SAndroid Build Coastguard Worker 		if (gem_uses_full_ppgtt(fd)) {
541*d83cc019SAndroid Build Coastguard Worker 			ppgtt_nengine = all_nengine;
542*d83cc019SAndroid Build Coastguard Worker 			memcpy(ppgtt_engines,
543*d83cc019SAndroid Build Coastguard Worker 			       all_engines,
544*d83cc019SAndroid Build Coastguard Worker 			       all_nengine * sizeof(all_engines[0]));
545*d83cc019SAndroid Build Coastguard Worker 		} else
546*d83cc019SAndroid Build Coastguard Worker 			ppgtt_engines[ppgtt_nengine++] = 0;
547*d83cc019SAndroid Build Coastguard Worker 
548*d83cc019SAndroid Build Coastguard Worker 		igt_fork_hang_detector(fd);
549*d83cc019SAndroid Build Coastguard Worker 	}
550*d83cc019SAndroid Build Coastguard Worker 
551*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("basic") {
552*d83cc019SAndroid Build Coastguard Worker 		memset(&create, 0, sizeof(create));
553*d83cc019SAndroid Build Coastguard Worker 		create.ctx_id = rand();
554*d83cc019SAndroid Build Coastguard Worker 		create.pad = 0;
555*d83cc019SAndroid Build Coastguard Worker 		igt_assert_eq(create_ioctl(fd, &create), 0);
556*d83cc019SAndroid Build Coastguard Worker 		igt_assert(create.ctx_id != 0);
557*d83cc019SAndroid Build Coastguard Worker 		gem_context_destroy(fd, create.ctx_id);
558*d83cc019SAndroid Build Coastguard Worker 	}
559*d83cc019SAndroid Build Coastguard Worker 
560*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("ext-param")
561*d83cc019SAndroid Build Coastguard Worker 		basic_ext_param(fd);
562*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("iris-pipeline")
563*d83cc019SAndroid Build Coastguard Worker 		iris_pipeline(fd);
564*d83cc019SAndroid Build Coastguard Worker 
565*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("maximum-mem")
566*d83cc019SAndroid Build Coastguard Worker 		maximum(fd, ncpus, CHECK_RAM);
567*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("maximum-swap")
568*d83cc019SAndroid Build Coastguard Worker 		maximum(fd, ncpus, CHECK_RAM | CHECK_SWAP);
569*d83cc019SAndroid Build Coastguard Worker 
570*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("basic-files")
571*d83cc019SAndroid Build Coastguard Worker 		files(fd, 5, 1);
572*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("files")
573*d83cc019SAndroid Build Coastguard Worker 		files(fd, 150, 1);
574*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("forked-files")
575*d83cc019SAndroid Build Coastguard Worker 		files(fd, 150, ncpus);
576*d83cc019SAndroid Build Coastguard Worker 
577*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("active-all")
578*d83cc019SAndroid Build Coastguard Worker 		active(fd, ALL_ENGINES, 120, 1);
579*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("forked-active-all")
580*d83cc019SAndroid Build Coastguard Worker 		active(fd, ALL_ENGINES, 120, ncpus);
581*d83cc019SAndroid Build Coastguard Worker 
582*d83cc019SAndroid Build Coastguard Worker 	for (const struct intel_execution_engine *e = intel_execution_engines;
583*d83cc019SAndroid Build Coastguard Worker 	     e->name; e++) {
584*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("active-%s", e->name)
585*d83cc019SAndroid Build Coastguard Worker 			active(fd, e->exec_id | e->flags, 20, 1);
586*d83cc019SAndroid Build Coastguard Worker 		igt_subtest_f("forked-active-%s", e->name)
587*d83cc019SAndroid Build Coastguard Worker 			active(fd, e->exec_id | e->flags, 20, ncpus);
588*d83cc019SAndroid Build Coastguard Worker 		if (e->exec_id) {
589*d83cc019SAndroid Build Coastguard Worker 			igt_subtest_f("hog-%s", e->name)
590*d83cc019SAndroid Build Coastguard Worker 				active(fd, e->exec_id | e->flags, 20, -1);
591*d83cc019SAndroid Build Coastguard Worker 		}
592*d83cc019SAndroid Build Coastguard Worker 	}
593*d83cc019SAndroid Build Coastguard Worker 
594*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
595*d83cc019SAndroid Build Coastguard Worker 		igt_stop_hang_detector();
596*d83cc019SAndroid Build Coastguard Worker 		close(fd);
597*d83cc019SAndroid Build Coastguard Worker 	}
598*d83cc019SAndroid Build Coastguard Worker }
599