xref: /aosp_15_r20/external/igt-gpu-tools/tests/i915/gem_ppgtt.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2014 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 #include "igt.h"
25*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
26*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
27*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
28*d83cc019SAndroid Build Coastguard Worker #include <sys/ioctl.h>
29*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
30*d83cc019SAndroid Build Coastguard Worker #include <string.h>
31*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
32*d83cc019SAndroid Build Coastguard Worker #include <inttypes.h>
33*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
34*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
35*d83cc019SAndroid Build Coastguard Worker #include <sys/time.h>
36*d83cc019SAndroid Build Coastguard Worker 
37*d83cc019SAndroid Build Coastguard Worker #include <drm.h>
38*d83cc019SAndroid Build Coastguard Worker 
39*d83cc019SAndroid Build Coastguard Worker #include "intel_bufmgr.h"
40*d83cc019SAndroid Build Coastguard Worker #include "igt_debugfs.h"
41*d83cc019SAndroid Build Coastguard Worker 
42*d83cc019SAndroid Build Coastguard Worker #define WIDTH 512
43*d83cc019SAndroid Build Coastguard Worker #define STRIDE (WIDTH*4)
44*d83cc019SAndroid Build Coastguard Worker #define HEIGHT 512
45*d83cc019SAndroid Build Coastguard Worker #define SIZE (HEIGHT*STRIDE)
46*d83cc019SAndroid Build Coastguard Worker 
create_bo(drm_intel_bufmgr * bufmgr,uint32_t pixel)47*d83cc019SAndroid Build Coastguard Worker static drm_intel_bo *create_bo(drm_intel_bufmgr *bufmgr,
48*d83cc019SAndroid Build Coastguard Worker 			       uint32_t pixel)
49*d83cc019SAndroid Build Coastguard Worker {
50*d83cc019SAndroid Build Coastguard Worker 	uint64_t value = (uint64_t)pixel << 32 | pixel, *v;
51*d83cc019SAndroid Build Coastguard Worker 	drm_intel_bo *bo;
52*d83cc019SAndroid Build Coastguard Worker 
53*d83cc019SAndroid Build Coastguard Worker 	bo = drm_intel_bo_alloc(bufmgr, "surface", SIZE, 4096);
54*d83cc019SAndroid Build Coastguard Worker 	igt_assert(bo);
55*d83cc019SAndroid Build Coastguard Worker 
56*d83cc019SAndroid Build Coastguard Worker 	do_or_die(drm_intel_bo_map(bo, 1));
57*d83cc019SAndroid Build Coastguard Worker 	v = bo->virtual;
58*d83cc019SAndroid Build Coastguard Worker 	for (int i = 0; i < SIZE / sizeof(value); i += 8) {
59*d83cc019SAndroid Build Coastguard Worker 		v[i + 0] = value; v[i + 1] = value;
60*d83cc019SAndroid Build Coastguard Worker 		v[i + 2] = value; v[i + 3] = value;
61*d83cc019SAndroid Build Coastguard Worker 		v[i + 4] = value; v[i + 5] = value;
62*d83cc019SAndroid Build Coastguard Worker 		v[i + 6] = value; v[i + 7] = value;
63*d83cc019SAndroid Build Coastguard Worker 	}
64*d83cc019SAndroid Build Coastguard Worker 	drm_intel_bo_unmap(bo);
65*d83cc019SAndroid Build Coastguard Worker 
66*d83cc019SAndroid Build Coastguard Worker 	return bo;
67*d83cc019SAndroid Build Coastguard Worker }
68*d83cc019SAndroid Build Coastguard Worker 
scratch_buf_init(struct igt_buf * buf,drm_intel_bufmgr * bufmgr,uint32_t pixel)69*d83cc019SAndroid Build Coastguard Worker static void scratch_buf_init(struct igt_buf *buf,
70*d83cc019SAndroid Build Coastguard Worker 			     drm_intel_bufmgr *bufmgr,
71*d83cc019SAndroid Build Coastguard Worker 			     uint32_t pixel)
72*d83cc019SAndroid Build Coastguard Worker {
73*d83cc019SAndroid Build Coastguard Worker 	memset(buf, 0, sizeof(*buf));
74*d83cc019SAndroid Build Coastguard Worker 
75*d83cc019SAndroid Build Coastguard Worker 	buf->bo = create_bo(bufmgr, pixel);
76*d83cc019SAndroid Build Coastguard Worker 	buf->stride = STRIDE;
77*d83cc019SAndroid Build Coastguard Worker 	buf->tiling = I915_TILING_NONE;
78*d83cc019SAndroid Build Coastguard Worker 	buf->size = SIZE;
79*d83cc019SAndroid Build Coastguard Worker 	buf->bpp = 32;
80*d83cc019SAndroid Build Coastguard Worker }
81*d83cc019SAndroid Build Coastguard Worker 
scratch_buf_fini(struct igt_buf * buf)82*d83cc019SAndroid Build Coastguard Worker static void scratch_buf_fini(struct igt_buf *buf)
83*d83cc019SAndroid Build Coastguard Worker {
84*d83cc019SAndroid Build Coastguard Worker 	drm_intel_bo_unreference(buf->bo);
85*d83cc019SAndroid Build Coastguard Worker 	memset(buf, 0, sizeof(*buf));
86*d83cc019SAndroid Build Coastguard Worker }
87*d83cc019SAndroid Build Coastguard Worker 
fork_rcs_copy(int timeout,uint32_t final,drm_intel_bo ** dst,int count,unsigned flags)88*d83cc019SAndroid Build Coastguard Worker static void fork_rcs_copy(int timeout, uint32_t final,
89*d83cc019SAndroid Build Coastguard Worker 			  drm_intel_bo **dst, int count,
90*d83cc019SAndroid Build Coastguard Worker 			  unsigned flags)
91*d83cc019SAndroid Build Coastguard Worker #define CREATE_CONTEXT 0x1
92*d83cc019SAndroid Build Coastguard Worker {
93*d83cc019SAndroid Build Coastguard Worker 	igt_render_copyfunc_t render_copy;
94*d83cc019SAndroid Build Coastguard Worker 	uint64_t mem_per_child;
95*d83cc019SAndroid Build Coastguard Worker 	int devid;
96*d83cc019SAndroid Build Coastguard Worker 
97*d83cc019SAndroid Build Coastguard Worker 	mem_per_child = SIZE;
98*d83cc019SAndroid Build Coastguard Worker 	if (flags & CREATE_CONTEXT)
99*d83cc019SAndroid Build Coastguard Worker 		mem_per_child += 2 * 128 * 1024; /* rough context sizes */
100*d83cc019SAndroid Build Coastguard Worker 	intel_require_memory(count, mem_per_child, CHECK_RAM);
101*d83cc019SAndroid Build Coastguard Worker 
102*d83cc019SAndroid Build Coastguard Worker 	for (int child = 0; child < count; child++) {
103*d83cc019SAndroid Build Coastguard Worker 		int fd = drm_open_driver(DRIVER_INTEL);
104*d83cc019SAndroid Build Coastguard Worker 		drm_intel_bufmgr *bufmgr;
105*d83cc019SAndroid Build Coastguard Worker 
106*d83cc019SAndroid Build Coastguard Worker 		devid = intel_get_drm_devid(fd);
107*d83cc019SAndroid Build Coastguard Worker 
108*d83cc019SAndroid Build Coastguard Worker 		bufmgr = drm_intel_bufmgr_gem_init(fd, 4096);
109*d83cc019SAndroid Build Coastguard Worker 		igt_assert(bufmgr);
110*d83cc019SAndroid Build Coastguard Worker 
111*d83cc019SAndroid Build Coastguard Worker 		dst[child] = create_bo(bufmgr, ~0);
112*d83cc019SAndroid Build Coastguard Worker 
113*d83cc019SAndroid Build Coastguard Worker 		if (flags & CREATE_CONTEXT) {
114*d83cc019SAndroid Build Coastguard Worker 			drm_intel_context *ctx;
115*d83cc019SAndroid Build Coastguard Worker 
116*d83cc019SAndroid Build Coastguard Worker 			ctx = drm_intel_gem_context_create(dst[child]->bufmgr);
117*d83cc019SAndroid Build Coastguard Worker 			igt_require(ctx);
118*d83cc019SAndroid Build Coastguard Worker 		}
119*d83cc019SAndroid Build Coastguard Worker 
120*d83cc019SAndroid Build Coastguard Worker 		render_copy = igt_get_render_copyfunc(devid);
121*d83cc019SAndroid Build Coastguard Worker 		igt_require_f(render_copy,
122*d83cc019SAndroid Build Coastguard Worker 			      "no render-copy function\n");
123*d83cc019SAndroid Build Coastguard Worker 	}
124*d83cc019SAndroid Build Coastguard Worker 
125*d83cc019SAndroid Build Coastguard Worker 	igt_fork(child, count) {
126*d83cc019SAndroid Build Coastguard Worker 		struct intel_batchbuffer *batch;
127*d83cc019SAndroid Build Coastguard Worker 		struct igt_buf buf = {};
128*d83cc019SAndroid Build Coastguard Worker 		struct igt_buf src;
129*d83cc019SAndroid Build Coastguard Worker 		unsigned long i;
130*d83cc019SAndroid Build Coastguard Worker 
131*d83cc019SAndroid Build Coastguard Worker 		batch = intel_batchbuffer_alloc(dst[child]->bufmgr,
132*d83cc019SAndroid Build Coastguard Worker 						devid);
133*d83cc019SAndroid Build Coastguard Worker 		igt_assert(batch);
134*d83cc019SAndroid Build Coastguard Worker 
135*d83cc019SAndroid Build Coastguard Worker 		if (flags & CREATE_CONTEXT) {
136*d83cc019SAndroid Build Coastguard Worker 			drm_intel_context *ctx;
137*d83cc019SAndroid Build Coastguard Worker 
138*d83cc019SAndroid Build Coastguard Worker 			ctx = drm_intel_gem_context_create(dst[child]->bufmgr);
139*d83cc019SAndroid Build Coastguard Worker 			intel_batchbuffer_set_context(batch, ctx);
140*d83cc019SAndroid Build Coastguard Worker 		}
141*d83cc019SAndroid Build Coastguard Worker 
142*d83cc019SAndroid Build Coastguard Worker 		buf.bo = dst[child];
143*d83cc019SAndroid Build Coastguard Worker 		buf.stride = STRIDE;
144*d83cc019SAndroid Build Coastguard Worker 		buf.tiling = I915_TILING_NONE;
145*d83cc019SAndroid Build Coastguard Worker 		buf.size = SIZE;
146*d83cc019SAndroid Build Coastguard Worker 		buf.bpp = 32;
147*d83cc019SAndroid Build Coastguard Worker 
148*d83cc019SAndroid Build Coastguard Worker 		i = 0;
149*d83cc019SAndroid Build Coastguard Worker 		igt_until_timeout(timeout) {
150*d83cc019SAndroid Build Coastguard Worker 			scratch_buf_init(&src, dst[child]->bufmgr,
151*d83cc019SAndroid Build Coastguard Worker 					 i++ | child << 16);
152*d83cc019SAndroid Build Coastguard Worker 			render_copy(batch, NULL,
153*d83cc019SAndroid Build Coastguard Worker 				    &src, 0, 0,
154*d83cc019SAndroid Build Coastguard Worker 				    WIDTH, HEIGHT,
155*d83cc019SAndroid Build Coastguard Worker 				    &buf, 0, 0);
156*d83cc019SAndroid Build Coastguard Worker 			scratch_buf_fini(&src);
157*d83cc019SAndroid Build Coastguard Worker 		}
158*d83cc019SAndroid Build Coastguard Worker 
159*d83cc019SAndroid Build Coastguard Worker 		scratch_buf_init(&src, dst[child]->bufmgr,
160*d83cc019SAndroid Build Coastguard Worker 				 final | child << 16);
161*d83cc019SAndroid Build Coastguard Worker 		render_copy(batch, NULL,
162*d83cc019SAndroid Build Coastguard Worker 			    &src, 0, 0,
163*d83cc019SAndroid Build Coastguard Worker 			    WIDTH, HEIGHT,
164*d83cc019SAndroid Build Coastguard Worker 			    &buf, 0, 0);
165*d83cc019SAndroid Build Coastguard Worker 		scratch_buf_fini(&src);
166*d83cc019SAndroid Build Coastguard Worker 	}
167*d83cc019SAndroid Build Coastguard Worker }
168*d83cc019SAndroid Build Coastguard Worker 
fork_bcs_copy(int timeout,uint32_t final,drm_intel_bo ** dst,int count)169*d83cc019SAndroid Build Coastguard Worker static void fork_bcs_copy(int timeout, uint32_t final,
170*d83cc019SAndroid Build Coastguard Worker 			  drm_intel_bo **dst, int count)
171*d83cc019SAndroid Build Coastguard Worker {
172*d83cc019SAndroid Build Coastguard Worker 	int devid;
173*d83cc019SAndroid Build Coastguard Worker 
174*d83cc019SAndroid Build Coastguard Worker 	for (int child = 0; child < count; child++) {
175*d83cc019SAndroid Build Coastguard Worker 		drm_intel_bufmgr *bufmgr;
176*d83cc019SAndroid Build Coastguard Worker 		int fd = drm_open_driver(DRIVER_INTEL);
177*d83cc019SAndroid Build Coastguard Worker 
178*d83cc019SAndroid Build Coastguard Worker 		devid = intel_get_drm_devid(fd);
179*d83cc019SAndroid Build Coastguard Worker 
180*d83cc019SAndroid Build Coastguard Worker 		bufmgr = drm_intel_bufmgr_gem_init(fd, 4096);
181*d83cc019SAndroid Build Coastguard Worker 		igt_assert(bufmgr);
182*d83cc019SAndroid Build Coastguard Worker 
183*d83cc019SAndroid Build Coastguard Worker 		dst[child] = create_bo(bufmgr, ~0);
184*d83cc019SAndroid Build Coastguard Worker 	}
185*d83cc019SAndroid Build Coastguard Worker 
186*d83cc019SAndroid Build Coastguard Worker 	igt_fork(child, count) {
187*d83cc019SAndroid Build Coastguard Worker 		struct intel_batchbuffer *batch;
188*d83cc019SAndroid Build Coastguard Worker 		drm_intel_bo *src[2];
189*d83cc019SAndroid Build Coastguard Worker 		unsigned long i;
190*d83cc019SAndroid Build Coastguard Worker 
191*d83cc019SAndroid Build Coastguard Worker 
192*d83cc019SAndroid Build Coastguard Worker 		batch = intel_batchbuffer_alloc(dst[child]->bufmgr,
193*d83cc019SAndroid Build Coastguard Worker 						devid);
194*d83cc019SAndroid Build Coastguard Worker 		igt_assert(batch);
195*d83cc019SAndroid Build Coastguard Worker 
196*d83cc019SAndroid Build Coastguard Worker 		i = 0;
197*d83cc019SAndroid Build Coastguard Worker 		igt_until_timeout(timeout) {
198*d83cc019SAndroid Build Coastguard Worker 			src[0] = create_bo(dst[child]->bufmgr,
199*d83cc019SAndroid Build Coastguard Worker 					   ~0);
200*d83cc019SAndroid Build Coastguard Worker 			src[1] = create_bo(dst[child]->bufmgr,
201*d83cc019SAndroid Build Coastguard Worker 					   i++ | child << 16);
202*d83cc019SAndroid Build Coastguard Worker 
203*d83cc019SAndroid Build Coastguard Worker 			intel_copy_bo(batch, src[0], src[1], SIZE);
204*d83cc019SAndroid Build Coastguard Worker 			intel_copy_bo(batch, dst[child], src[0], SIZE);
205*d83cc019SAndroid Build Coastguard Worker 
206*d83cc019SAndroid Build Coastguard Worker 			drm_intel_bo_unreference(src[1]);
207*d83cc019SAndroid Build Coastguard Worker 			drm_intel_bo_unreference(src[0]);
208*d83cc019SAndroid Build Coastguard Worker 		}
209*d83cc019SAndroid Build Coastguard Worker 
210*d83cc019SAndroid Build Coastguard Worker 		src[0] = create_bo(dst[child]->bufmgr,
211*d83cc019SAndroid Build Coastguard Worker 				   ~0);
212*d83cc019SAndroid Build Coastguard Worker 		src[1] = create_bo(dst[child]->bufmgr,
213*d83cc019SAndroid Build Coastguard Worker 				   final | child << 16);
214*d83cc019SAndroid Build Coastguard Worker 
215*d83cc019SAndroid Build Coastguard Worker 		intel_copy_bo(batch, src[0], src[1], SIZE);
216*d83cc019SAndroid Build Coastguard Worker 		intel_copy_bo(batch, dst[child], src[0], SIZE);
217*d83cc019SAndroid Build Coastguard Worker 
218*d83cc019SAndroid Build Coastguard Worker 		drm_intel_bo_unreference(src[1]);
219*d83cc019SAndroid Build Coastguard Worker 		drm_intel_bo_unreference(src[0]);
220*d83cc019SAndroid Build Coastguard Worker 	}
221*d83cc019SAndroid Build Coastguard Worker }
222*d83cc019SAndroid Build Coastguard Worker 
surfaces_check(drm_intel_bo ** bo,int count,uint32_t expected)223*d83cc019SAndroid Build Coastguard Worker static void surfaces_check(drm_intel_bo **bo, int count, uint32_t expected)
224*d83cc019SAndroid Build Coastguard Worker {
225*d83cc019SAndroid Build Coastguard Worker 	for (int child = 0; child < count; child++) {
226*d83cc019SAndroid Build Coastguard Worker 		uint32_t *ptr;
227*d83cc019SAndroid Build Coastguard Worker 
228*d83cc019SAndroid Build Coastguard Worker 		do_or_die(drm_intel_bo_map(bo[child], 0));
229*d83cc019SAndroid Build Coastguard Worker 		ptr = bo[child]->virtual;
230*d83cc019SAndroid Build Coastguard Worker 		for (int j = 0; j < SIZE/4; j++)
231*d83cc019SAndroid Build Coastguard Worker 			igt_assert_eq(ptr[j], expected | child << 16);
232*d83cc019SAndroid Build Coastguard Worker 		drm_intel_bo_unmap(bo[child]);
233*d83cc019SAndroid Build Coastguard Worker 	}
234*d83cc019SAndroid Build Coastguard Worker }
235*d83cc019SAndroid Build Coastguard Worker 
exec_and_get_offset(int fd,uint32_t batch)236*d83cc019SAndroid Build Coastguard Worker static uint64_t exec_and_get_offset(int fd, uint32_t batch)
237*d83cc019SAndroid Build Coastguard Worker {
238*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_execbuffer2 execbuf;
239*d83cc019SAndroid Build Coastguard Worker 	struct drm_i915_gem_exec_object2 exec[1];
240*d83cc019SAndroid Build Coastguard Worker 	uint32_t batch_data[2] = { MI_BATCH_BUFFER_END };
241*d83cc019SAndroid Build Coastguard Worker 
242*d83cc019SAndroid Build Coastguard Worker 	gem_write(fd, batch, 0, batch_data, sizeof(batch_data));
243*d83cc019SAndroid Build Coastguard Worker 
244*d83cc019SAndroid Build Coastguard Worker 	memset(exec, 0, sizeof(exec));
245*d83cc019SAndroid Build Coastguard Worker 	exec[0].handle = batch;
246*d83cc019SAndroid Build Coastguard Worker 
247*d83cc019SAndroid Build Coastguard Worker 	memset(&execbuf, 0, sizeof(execbuf));
248*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffers_ptr = to_user_pointer(exec);
249*d83cc019SAndroid Build Coastguard Worker 	execbuf.buffer_count = 1;
250*d83cc019SAndroid Build Coastguard Worker 
251*d83cc019SAndroid Build Coastguard Worker 	gem_execbuf(fd, &execbuf);
252*d83cc019SAndroid Build Coastguard Worker 	igt_assert_neq(exec[0].offset, -1);
253*d83cc019SAndroid Build Coastguard Worker 
254*d83cc019SAndroid Build Coastguard Worker 	return exec[0].offset;
255*d83cc019SAndroid Build Coastguard Worker }
256*d83cc019SAndroid Build Coastguard Worker 
flink_and_close(void)257*d83cc019SAndroid Build Coastguard Worker static void flink_and_close(void)
258*d83cc019SAndroid Build Coastguard Worker {
259*d83cc019SAndroid Build Coastguard Worker 	uint32_t fd, fd2;
260*d83cc019SAndroid Build Coastguard Worker 	uint32_t bo, flinked_bo, new_bo, name;
261*d83cc019SAndroid Build Coastguard Worker 	uint64_t offset, offset_new;
262*d83cc019SAndroid Build Coastguard Worker 
263*d83cc019SAndroid Build Coastguard Worker 	fd = drm_open_driver(DRIVER_INTEL);
264*d83cc019SAndroid Build Coastguard Worker 	igt_require(gem_uses_full_ppgtt(fd));
265*d83cc019SAndroid Build Coastguard Worker 
266*d83cc019SAndroid Build Coastguard Worker 	bo = gem_create(fd, 4096);
267*d83cc019SAndroid Build Coastguard Worker 	name = gem_flink(fd, bo);
268*d83cc019SAndroid Build Coastguard Worker 
269*d83cc019SAndroid Build Coastguard Worker 	fd2 = drm_open_driver(DRIVER_INTEL);
270*d83cc019SAndroid Build Coastguard Worker 
271*d83cc019SAndroid Build Coastguard Worker 	flinked_bo = gem_open(fd2, name);
272*d83cc019SAndroid Build Coastguard Worker 	offset = exec_and_get_offset(fd2, flinked_bo);
273*d83cc019SAndroid Build Coastguard Worker 	gem_sync(fd2, flinked_bo);
274*d83cc019SAndroid Build Coastguard Worker 	gem_close(fd2, flinked_bo);
275*d83cc019SAndroid Build Coastguard Worker 
276*d83cc019SAndroid Build Coastguard Worker 	igt_drop_caches_set(fd, DROP_RETIRE | DROP_IDLE);
277*d83cc019SAndroid Build Coastguard Worker 
278*d83cc019SAndroid Build Coastguard Worker 	/* the flinked bo VMA should have been cleared now, so a new bo of the
279*d83cc019SAndroid Build Coastguard Worker 	 * same size should get the same offset
280*d83cc019SAndroid Build Coastguard Worker 	 */
281*d83cc019SAndroid Build Coastguard Worker 	new_bo = gem_create(fd2, 4096);
282*d83cc019SAndroid Build Coastguard Worker 	offset_new = exec_and_get_offset(fd2, new_bo);
283*d83cc019SAndroid Build Coastguard Worker 	gem_close(fd2, new_bo);
284*d83cc019SAndroid Build Coastguard Worker 
285*d83cc019SAndroid Build Coastguard Worker 	igt_assert_eq(offset, offset_new);
286*d83cc019SAndroid Build Coastguard Worker 
287*d83cc019SAndroid Build Coastguard Worker 	gem_close(fd, bo);
288*d83cc019SAndroid Build Coastguard Worker 	close(fd);
289*d83cc019SAndroid Build Coastguard Worker 	close(fd2);
290*d83cc019SAndroid Build Coastguard Worker }
291*d83cc019SAndroid Build Coastguard Worker 
292*d83cc019SAndroid Build Coastguard Worker #define N_CHILD 8
293*d83cc019SAndroid Build Coastguard Worker igt_main
294*d83cc019SAndroid Build Coastguard Worker {
295*d83cc019SAndroid Build Coastguard Worker 	igt_fixture {
296*d83cc019SAndroid Build Coastguard Worker 		int fd = drm_open_driver(DRIVER_INTEL);
297*d83cc019SAndroid Build Coastguard Worker 		igt_require_gem(fd);
298*d83cc019SAndroid Build Coastguard Worker 		close(fd);
299*d83cc019SAndroid Build Coastguard Worker 	}
300*d83cc019SAndroid Build Coastguard Worker 
301*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("blt-vs-render-ctx0") {
302*d83cc019SAndroid Build Coastguard Worker 		drm_intel_bo *bcs[1], *rcs[N_CHILD];
303*d83cc019SAndroid Build Coastguard Worker 
304*d83cc019SAndroid Build Coastguard Worker 		fork_bcs_copy(30, 0x4000, bcs, 1);
305*d83cc019SAndroid Build Coastguard Worker 		fork_rcs_copy(30, 0x8000 / N_CHILD, rcs, N_CHILD, 0);
306*d83cc019SAndroid Build Coastguard Worker 
307*d83cc019SAndroid Build Coastguard Worker 		igt_waitchildren();
308*d83cc019SAndroid Build Coastguard Worker 
309*d83cc019SAndroid Build Coastguard Worker 		surfaces_check(bcs, 1, 0x4000);
310*d83cc019SAndroid Build Coastguard Worker 		surfaces_check(rcs, N_CHILD, 0x8000 / N_CHILD);
311*d83cc019SAndroid Build Coastguard Worker 	}
312*d83cc019SAndroid Build Coastguard Worker 
313*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("blt-vs-render-ctxN") {
314*d83cc019SAndroid Build Coastguard Worker 		drm_intel_bo *bcs[1], *rcs[N_CHILD];
315*d83cc019SAndroid Build Coastguard Worker 
316*d83cc019SAndroid Build Coastguard Worker 		fork_rcs_copy(30, 0x8000 / N_CHILD, rcs, N_CHILD, CREATE_CONTEXT);
317*d83cc019SAndroid Build Coastguard Worker 		fork_bcs_copy(30, 0x4000, bcs, 1);
318*d83cc019SAndroid Build Coastguard Worker 
319*d83cc019SAndroid Build Coastguard Worker 		igt_waitchildren();
320*d83cc019SAndroid Build Coastguard Worker 
321*d83cc019SAndroid Build Coastguard Worker 		surfaces_check(bcs, 1, 0x4000);
322*d83cc019SAndroid Build Coastguard Worker 		surfaces_check(rcs, N_CHILD, 0x8000 / N_CHILD);
323*d83cc019SAndroid Build Coastguard Worker 	}
324*d83cc019SAndroid Build Coastguard Worker 
325*d83cc019SAndroid Build Coastguard Worker 	igt_subtest("flink-and-close-vma-leak")
326*d83cc019SAndroid Build Coastguard Worker 		flink_and_close();
327*d83cc019SAndroid Build Coastguard Worker }
328