1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2016 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 "igt_vgem.h"
26*d83cc019SAndroid Build Coastguard Worker
27*d83cc019SAndroid Build Coastguard Worker #include <sys/ioctl.h>
28*d83cc019SAndroid Build Coastguard Worker #include <sys/poll.h>
29*d83cc019SAndroid Build Coastguard Worker #include <time.h>
30*d83cc019SAndroid Build Coastguard Worker
31*d83cc019SAndroid Build Coastguard Worker IGT_TEST_DESCRIPTION("Basic check of polling for prime/vgem fences.");
32*d83cc019SAndroid Build Coastguard Worker
test_read(int vgem,int i915)33*d83cc019SAndroid Build Coastguard Worker static void test_read(int vgem, int i915)
34*d83cc019SAndroid Build Coastguard Worker {
35*d83cc019SAndroid Build Coastguard Worker struct vgem_bo scratch;
36*d83cc019SAndroid Build Coastguard Worker uint32_t handle;
37*d83cc019SAndroid Build Coastguard Worker uint32_t *ptr;
38*d83cc019SAndroid Build Coastguard Worker int dmabuf, i;
39*d83cc019SAndroid Build Coastguard Worker
40*d83cc019SAndroid Build Coastguard Worker scratch.width = 1024;
41*d83cc019SAndroid Build Coastguard Worker scratch.height = 1024;
42*d83cc019SAndroid Build Coastguard Worker scratch.bpp = 32;
43*d83cc019SAndroid Build Coastguard Worker vgem_create(vgem, &scratch);
44*d83cc019SAndroid Build Coastguard Worker
45*d83cc019SAndroid Build Coastguard Worker dmabuf = prime_handle_to_fd(vgem, scratch.handle);
46*d83cc019SAndroid Build Coastguard Worker handle = prime_fd_to_handle(i915, dmabuf);
47*d83cc019SAndroid Build Coastguard Worker close(dmabuf);
48*d83cc019SAndroid Build Coastguard Worker
49*d83cc019SAndroid Build Coastguard Worker ptr = vgem_mmap(vgem, &scratch, PROT_WRITE);
50*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++)
51*d83cc019SAndroid Build Coastguard Worker ptr[1024*i] = i;
52*d83cc019SAndroid Build Coastguard Worker munmap(ptr, scratch.size);
53*d83cc019SAndroid Build Coastguard Worker gem_close(vgem, scratch.handle);
54*d83cc019SAndroid Build Coastguard Worker
55*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++) {
56*d83cc019SAndroid Build Coastguard Worker uint32_t tmp;
57*d83cc019SAndroid Build Coastguard Worker gem_read(i915, handle, 4096*i, &tmp, sizeof(tmp));
58*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(tmp, i);
59*d83cc019SAndroid Build Coastguard Worker }
60*d83cc019SAndroid Build Coastguard Worker gem_close(i915, handle);
61*d83cc019SAndroid Build Coastguard Worker }
62*d83cc019SAndroid Build Coastguard Worker
test_fence_read(int i915,int vgem)63*d83cc019SAndroid Build Coastguard Worker static void test_fence_read(int i915, int vgem)
64*d83cc019SAndroid Build Coastguard Worker {
65*d83cc019SAndroid Build Coastguard Worker struct vgem_bo scratch;
66*d83cc019SAndroid Build Coastguard Worker uint32_t handle;
67*d83cc019SAndroid Build Coastguard Worker uint32_t *ptr;
68*d83cc019SAndroid Build Coastguard Worker uint32_t fence;
69*d83cc019SAndroid Build Coastguard Worker int dmabuf, i;
70*d83cc019SAndroid Build Coastguard Worker int master[2], slave[2];
71*d83cc019SAndroid Build Coastguard Worker
72*d83cc019SAndroid Build Coastguard Worker igt_assert(pipe(master) == 0);
73*d83cc019SAndroid Build Coastguard Worker igt_assert(pipe(slave) == 0);
74*d83cc019SAndroid Build Coastguard Worker
75*d83cc019SAndroid Build Coastguard Worker scratch.width = 1024;
76*d83cc019SAndroid Build Coastguard Worker scratch.height = 1024;
77*d83cc019SAndroid Build Coastguard Worker scratch.bpp = 32;
78*d83cc019SAndroid Build Coastguard Worker vgem_create(vgem, &scratch);
79*d83cc019SAndroid Build Coastguard Worker
80*d83cc019SAndroid Build Coastguard Worker dmabuf = prime_handle_to_fd(vgem, scratch.handle);
81*d83cc019SAndroid Build Coastguard Worker handle = prime_fd_to_handle(i915, dmabuf);
82*d83cc019SAndroid Build Coastguard Worker close(dmabuf);
83*d83cc019SAndroid Build Coastguard Worker
84*d83cc019SAndroid Build Coastguard Worker igt_fork(child, 1) {
85*d83cc019SAndroid Build Coastguard Worker close(master[0]);
86*d83cc019SAndroid Build Coastguard Worker close(slave[1]);
87*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++) {
88*d83cc019SAndroid Build Coastguard Worker uint32_t tmp;
89*d83cc019SAndroid Build Coastguard Worker gem_read(i915, handle, 4096*i, &tmp, sizeof(tmp));
90*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(tmp, 0);
91*d83cc019SAndroid Build Coastguard Worker }
92*d83cc019SAndroid Build Coastguard Worker write(master[1], &child, sizeof(child));
93*d83cc019SAndroid Build Coastguard Worker read(slave[0], &child, sizeof(child));
94*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++) {
95*d83cc019SAndroid Build Coastguard Worker uint32_t tmp;
96*d83cc019SAndroid Build Coastguard Worker gem_read(i915, handle, 4096*i, &tmp, sizeof(tmp));
97*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(tmp, i);
98*d83cc019SAndroid Build Coastguard Worker }
99*d83cc019SAndroid Build Coastguard Worker gem_close(i915, handle);
100*d83cc019SAndroid Build Coastguard Worker }
101*d83cc019SAndroid Build Coastguard Worker
102*d83cc019SAndroid Build Coastguard Worker close(master[1]);
103*d83cc019SAndroid Build Coastguard Worker close(slave[0]);
104*d83cc019SAndroid Build Coastguard Worker read(master[0], &i, sizeof(i));
105*d83cc019SAndroid Build Coastguard Worker fence = vgem_fence_attach(vgem, &scratch, VGEM_FENCE_WRITE);
106*d83cc019SAndroid Build Coastguard Worker write(slave[1], &i, sizeof(i));
107*d83cc019SAndroid Build Coastguard Worker
108*d83cc019SAndroid Build Coastguard Worker ptr = vgem_mmap(vgem, &scratch, PROT_WRITE);
109*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++)
110*d83cc019SAndroid Build Coastguard Worker ptr[1024*i] = i;
111*d83cc019SAndroid Build Coastguard Worker munmap(ptr, scratch.size);
112*d83cc019SAndroid Build Coastguard Worker vgem_fence_signal(vgem, fence);
113*d83cc019SAndroid Build Coastguard Worker gem_close(vgem, scratch.handle);
114*d83cc019SAndroid Build Coastguard Worker
115*d83cc019SAndroid Build Coastguard Worker igt_waitchildren();
116*d83cc019SAndroid Build Coastguard Worker close(master[0]);
117*d83cc019SAndroid Build Coastguard Worker close(slave[1]);
118*d83cc019SAndroid Build Coastguard Worker }
119*d83cc019SAndroid Build Coastguard Worker
test_fence_mmap(int i915,int vgem)120*d83cc019SAndroid Build Coastguard Worker static void test_fence_mmap(int i915, int vgem)
121*d83cc019SAndroid Build Coastguard Worker {
122*d83cc019SAndroid Build Coastguard Worker struct vgem_bo scratch;
123*d83cc019SAndroid Build Coastguard Worker uint32_t handle;
124*d83cc019SAndroid Build Coastguard Worker uint32_t *ptr;
125*d83cc019SAndroid Build Coastguard Worker uint32_t fence;
126*d83cc019SAndroid Build Coastguard Worker int dmabuf, i;
127*d83cc019SAndroid Build Coastguard Worker int master[2], slave[2];
128*d83cc019SAndroid Build Coastguard Worker
129*d83cc019SAndroid Build Coastguard Worker igt_assert(pipe(master) == 0);
130*d83cc019SAndroid Build Coastguard Worker igt_assert(pipe(slave) == 0);
131*d83cc019SAndroid Build Coastguard Worker
132*d83cc019SAndroid Build Coastguard Worker scratch.width = 1024;
133*d83cc019SAndroid Build Coastguard Worker scratch.height = 1024;
134*d83cc019SAndroid Build Coastguard Worker scratch.bpp = 32;
135*d83cc019SAndroid Build Coastguard Worker vgem_create(vgem, &scratch);
136*d83cc019SAndroid Build Coastguard Worker
137*d83cc019SAndroid Build Coastguard Worker dmabuf = prime_handle_to_fd(vgem, scratch.handle);
138*d83cc019SAndroid Build Coastguard Worker handle = prime_fd_to_handle(i915, dmabuf);
139*d83cc019SAndroid Build Coastguard Worker close(dmabuf);
140*d83cc019SAndroid Build Coastguard Worker
141*d83cc019SAndroid Build Coastguard Worker igt_fork(child, 1) {
142*d83cc019SAndroid Build Coastguard Worker close(master[0]);
143*d83cc019SAndroid Build Coastguard Worker close(slave[1]);
144*d83cc019SAndroid Build Coastguard Worker ptr = gem_mmap__gtt(i915, handle, 4096*1024, PROT_READ);
145*d83cc019SAndroid Build Coastguard Worker
146*d83cc019SAndroid Build Coastguard Worker gem_set_domain(i915, handle, I915_GEM_DOMAIN_GTT, 0);
147*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++)
148*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(ptr[1024*i], 0);
149*d83cc019SAndroid Build Coastguard Worker
150*d83cc019SAndroid Build Coastguard Worker write(master[1], &child, sizeof(child));
151*d83cc019SAndroid Build Coastguard Worker read(slave[0], &child, sizeof(child));
152*d83cc019SAndroid Build Coastguard Worker
153*d83cc019SAndroid Build Coastguard Worker gem_set_domain(i915, handle, I915_GEM_DOMAIN_GTT, 0);
154*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++)
155*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(ptr[1024*i], i);
156*d83cc019SAndroid Build Coastguard Worker
157*d83cc019SAndroid Build Coastguard Worker gem_close(i915, handle);
158*d83cc019SAndroid Build Coastguard Worker }
159*d83cc019SAndroid Build Coastguard Worker
160*d83cc019SAndroid Build Coastguard Worker close(master[1]);
161*d83cc019SAndroid Build Coastguard Worker close(slave[0]);
162*d83cc019SAndroid Build Coastguard Worker read(master[0], &i, sizeof(i));
163*d83cc019SAndroid Build Coastguard Worker fence = vgem_fence_attach(vgem, &scratch, VGEM_FENCE_WRITE);
164*d83cc019SAndroid Build Coastguard Worker write(slave[1], &i, sizeof(i));
165*d83cc019SAndroid Build Coastguard Worker
166*d83cc019SAndroid Build Coastguard Worker ptr = vgem_mmap(vgem, &scratch, PROT_WRITE);
167*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++)
168*d83cc019SAndroid Build Coastguard Worker ptr[1024*i] = i;
169*d83cc019SAndroid Build Coastguard Worker munmap(ptr, scratch.size);
170*d83cc019SAndroid Build Coastguard Worker vgem_fence_signal(vgem, fence);
171*d83cc019SAndroid Build Coastguard Worker gem_close(vgem, scratch.handle);
172*d83cc019SAndroid Build Coastguard Worker
173*d83cc019SAndroid Build Coastguard Worker igt_waitchildren();
174*d83cc019SAndroid Build Coastguard Worker close(master[0]);
175*d83cc019SAndroid Build Coastguard Worker close(slave[1]);
176*d83cc019SAndroid Build Coastguard Worker }
177*d83cc019SAndroid Build Coastguard Worker
test_write(int vgem,int i915)178*d83cc019SAndroid Build Coastguard Worker static void test_write(int vgem, int i915)
179*d83cc019SAndroid Build Coastguard Worker {
180*d83cc019SAndroid Build Coastguard Worker struct vgem_bo scratch;
181*d83cc019SAndroid Build Coastguard Worker uint32_t handle;
182*d83cc019SAndroid Build Coastguard Worker uint32_t *ptr;
183*d83cc019SAndroid Build Coastguard Worker int dmabuf, i;
184*d83cc019SAndroid Build Coastguard Worker
185*d83cc019SAndroid Build Coastguard Worker scratch.width = 1024;
186*d83cc019SAndroid Build Coastguard Worker scratch.height = 1024;
187*d83cc019SAndroid Build Coastguard Worker scratch.bpp = 32;
188*d83cc019SAndroid Build Coastguard Worker vgem_create(vgem, &scratch);
189*d83cc019SAndroid Build Coastguard Worker
190*d83cc019SAndroid Build Coastguard Worker dmabuf = prime_handle_to_fd(vgem, scratch.handle);
191*d83cc019SAndroid Build Coastguard Worker handle = prime_fd_to_handle(i915, dmabuf);
192*d83cc019SAndroid Build Coastguard Worker close(dmabuf);
193*d83cc019SAndroid Build Coastguard Worker
194*d83cc019SAndroid Build Coastguard Worker ptr = vgem_mmap(vgem, &scratch, PROT_READ);
195*d83cc019SAndroid Build Coastguard Worker gem_close(vgem, scratch.handle);
196*d83cc019SAndroid Build Coastguard Worker
197*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++)
198*d83cc019SAndroid Build Coastguard Worker gem_write(i915, handle, 4096*i, &i, sizeof(i));
199*d83cc019SAndroid Build Coastguard Worker gem_close(i915, handle);
200*d83cc019SAndroid Build Coastguard Worker
201*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++)
202*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(ptr[1024*i], i);
203*d83cc019SAndroid Build Coastguard Worker munmap(ptr, scratch.size);
204*d83cc019SAndroid Build Coastguard Worker }
205*d83cc019SAndroid Build Coastguard Worker
test_gtt(int vgem,int i915)206*d83cc019SAndroid Build Coastguard Worker static void test_gtt(int vgem, int i915)
207*d83cc019SAndroid Build Coastguard Worker {
208*d83cc019SAndroid Build Coastguard Worker struct vgem_bo scratch;
209*d83cc019SAndroid Build Coastguard Worker uint32_t handle;
210*d83cc019SAndroid Build Coastguard Worker uint32_t *ptr;
211*d83cc019SAndroid Build Coastguard Worker int dmabuf, i;
212*d83cc019SAndroid Build Coastguard Worker
213*d83cc019SAndroid Build Coastguard Worker scratch.width = 1024;
214*d83cc019SAndroid Build Coastguard Worker scratch.height = 1024;
215*d83cc019SAndroid Build Coastguard Worker scratch.bpp = 32;
216*d83cc019SAndroid Build Coastguard Worker vgem_create(vgem, &scratch);
217*d83cc019SAndroid Build Coastguard Worker
218*d83cc019SAndroid Build Coastguard Worker dmabuf = prime_handle_to_fd(vgem, scratch.handle);
219*d83cc019SAndroid Build Coastguard Worker handle = prime_fd_to_handle(i915, dmabuf);
220*d83cc019SAndroid Build Coastguard Worker close(dmabuf);
221*d83cc019SAndroid Build Coastguard Worker
222*d83cc019SAndroid Build Coastguard Worker ptr = gem_mmap__gtt(i915, handle, scratch.size, PROT_WRITE);
223*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++)
224*d83cc019SAndroid Build Coastguard Worker ptr[1024*i] = i;
225*d83cc019SAndroid Build Coastguard Worker munmap(ptr, scratch.size);
226*d83cc019SAndroid Build Coastguard Worker
227*d83cc019SAndroid Build Coastguard Worker ptr = vgem_mmap(vgem, &scratch, PROT_READ | PROT_WRITE);
228*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++) {
229*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(ptr[1024*i], i);
230*d83cc019SAndroid Build Coastguard Worker ptr[1024*i] = ~i;
231*d83cc019SAndroid Build Coastguard Worker }
232*d83cc019SAndroid Build Coastguard Worker munmap(ptr, scratch.size);
233*d83cc019SAndroid Build Coastguard Worker
234*d83cc019SAndroid Build Coastguard Worker ptr = gem_mmap__gtt(i915, handle, scratch.size, PROT_READ);
235*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++)
236*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(ptr[1024*i], ~i);
237*d83cc019SAndroid Build Coastguard Worker munmap(ptr, scratch.size);
238*d83cc019SAndroid Build Coastguard Worker
239*d83cc019SAndroid Build Coastguard Worker gem_close(i915, handle);
240*d83cc019SAndroid Build Coastguard Worker gem_close(vgem, scratch.handle);
241*d83cc019SAndroid Build Coastguard Worker }
242*d83cc019SAndroid Build Coastguard Worker
test_shrink(int vgem,int i915)243*d83cc019SAndroid Build Coastguard Worker static void test_shrink(int vgem, int i915)
244*d83cc019SAndroid Build Coastguard Worker {
245*d83cc019SAndroid Build Coastguard Worker struct vgem_bo scratch = {
246*d83cc019SAndroid Build Coastguard Worker .width = 1024,
247*d83cc019SAndroid Build Coastguard Worker .height = 1024,
248*d83cc019SAndroid Build Coastguard Worker .bpp = 32
249*d83cc019SAndroid Build Coastguard Worker };
250*d83cc019SAndroid Build Coastguard Worker int dmabuf;
251*d83cc019SAndroid Build Coastguard Worker
252*d83cc019SAndroid Build Coastguard Worker vgem_create(vgem, &scratch);
253*d83cc019SAndroid Build Coastguard Worker
254*d83cc019SAndroid Build Coastguard Worker dmabuf = prime_handle_to_fd(vgem, scratch.handle);
255*d83cc019SAndroid Build Coastguard Worker gem_close(vgem, scratch.handle);
256*d83cc019SAndroid Build Coastguard Worker
257*d83cc019SAndroid Build Coastguard Worker scratch.handle = prime_fd_to_handle(i915, dmabuf);
258*d83cc019SAndroid Build Coastguard Worker close(dmabuf);
259*d83cc019SAndroid Build Coastguard Worker
260*d83cc019SAndroid Build Coastguard Worker /* Populate the i915_bo->pages. */
261*d83cc019SAndroid Build Coastguard Worker gem_set_domain(i915, scratch.handle, I915_GEM_DOMAIN_GTT, 0);
262*d83cc019SAndroid Build Coastguard Worker
263*d83cc019SAndroid Build Coastguard Worker /* Now evict them, establishing the link from i915:shrinker to vgem. */
264*d83cc019SAndroid Build Coastguard Worker igt_drop_caches_set(i915, DROP_SHRINK_ALL);
265*d83cc019SAndroid Build Coastguard Worker
266*d83cc019SAndroid Build Coastguard Worker gem_close(i915, scratch.handle);
267*d83cc019SAndroid Build Coastguard Worker }
268*d83cc019SAndroid Build Coastguard Worker
is_coherent(int i915)269*d83cc019SAndroid Build Coastguard Worker static bool is_coherent(int i915)
270*d83cc019SAndroid Build Coastguard Worker {
271*d83cc019SAndroid Build Coastguard Worker int val = 1; /* by default, we assume GTT is coherent, hence the test */
272*d83cc019SAndroid Build Coastguard Worker struct drm_i915_getparam gp = {
273*d83cc019SAndroid Build Coastguard Worker gp.param = 52, /* GTT_COHERENT */
274*d83cc019SAndroid Build Coastguard Worker gp.value = &val,
275*d83cc019SAndroid Build Coastguard Worker };
276*d83cc019SAndroid Build Coastguard Worker
277*d83cc019SAndroid Build Coastguard Worker ioctl(i915, DRM_IOCTL_I915_GETPARAM, &gp);
278*d83cc019SAndroid Build Coastguard Worker return val;
279*d83cc019SAndroid Build Coastguard Worker }
280*d83cc019SAndroid Build Coastguard Worker
test_gtt_interleaved(int vgem,int i915)281*d83cc019SAndroid Build Coastguard Worker static void test_gtt_interleaved(int vgem, int i915)
282*d83cc019SAndroid Build Coastguard Worker {
283*d83cc019SAndroid Build Coastguard Worker struct vgem_bo scratch;
284*d83cc019SAndroid Build Coastguard Worker uint32_t handle;
285*d83cc019SAndroid Build Coastguard Worker uint32_t *ptr, *gtt;
286*d83cc019SAndroid Build Coastguard Worker int dmabuf, i;
287*d83cc019SAndroid Build Coastguard Worker
288*d83cc019SAndroid Build Coastguard Worker igt_require(is_coherent(i915));
289*d83cc019SAndroid Build Coastguard Worker
290*d83cc019SAndroid Build Coastguard Worker scratch.width = 1024;
291*d83cc019SAndroid Build Coastguard Worker scratch.height = 1024;
292*d83cc019SAndroid Build Coastguard Worker scratch.bpp = 32;
293*d83cc019SAndroid Build Coastguard Worker vgem_create(vgem, &scratch);
294*d83cc019SAndroid Build Coastguard Worker
295*d83cc019SAndroid Build Coastguard Worker dmabuf = prime_handle_to_fd(vgem, scratch.handle);
296*d83cc019SAndroid Build Coastguard Worker handle = prime_fd_to_handle(i915, dmabuf);
297*d83cc019SAndroid Build Coastguard Worker close(dmabuf);
298*d83cc019SAndroid Build Coastguard Worker
299*d83cc019SAndroid Build Coastguard Worker /* This assumes that GTT is perfectedly coherent. On certain machines,
300*d83cc019SAndroid Build Coastguard Worker * it is possible for a direct acces to bypass the GTT indirection.
301*d83cc019SAndroid Build Coastguard Worker *
302*d83cc019SAndroid Build Coastguard Worker * This test may fail. It tells us how far userspace can trust
303*d83cc019SAndroid Build Coastguard Worker * concurrent dmabuf/i915 access. In the future, we may have a kernel
304*d83cc019SAndroid Build Coastguard Worker * param to indicate whether or not this interleaving is possible.
305*d83cc019SAndroid Build Coastguard Worker * However, the mmaps may be passed around to third parties that do
306*d83cc019SAndroid Build Coastguard Worker * not know about the shortcommings...
307*d83cc019SAndroid Build Coastguard Worker */
308*d83cc019SAndroid Build Coastguard Worker ptr = vgem_mmap(vgem, &scratch, PROT_WRITE);
309*d83cc019SAndroid Build Coastguard Worker gtt = gem_mmap__gtt(i915, handle, scratch.size, PROT_WRITE);
310*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++) {
311*d83cc019SAndroid Build Coastguard Worker gtt[1024*i] = i;
312*d83cc019SAndroid Build Coastguard Worker /* The read from WC should act as a flush for the GTT wcb */
313*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(ptr[1024*i], i);
314*d83cc019SAndroid Build Coastguard Worker
315*d83cc019SAndroid Build Coastguard Worker ptr[1024*i] = ~i;
316*d83cc019SAndroid Build Coastguard Worker /* The read from GTT should act as a flush for the WC wcb */
317*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(gtt[1024*i], ~i);
318*d83cc019SAndroid Build Coastguard Worker }
319*d83cc019SAndroid Build Coastguard Worker munmap(gtt, scratch.size);
320*d83cc019SAndroid Build Coastguard Worker munmap(ptr, scratch.size);
321*d83cc019SAndroid Build Coastguard Worker
322*d83cc019SAndroid Build Coastguard Worker gem_close(i915, handle);
323*d83cc019SAndroid Build Coastguard Worker gem_close(vgem, scratch.handle);
324*d83cc019SAndroid Build Coastguard Worker }
325*d83cc019SAndroid Build Coastguard Worker
prime_busy(int fd,bool excl)326*d83cc019SAndroid Build Coastguard Worker static bool prime_busy(int fd, bool excl)
327*d83cc019SAndroid Build Coastguard Worker {
328*d83cc019SAndroid Build Coastguard Worker struct pollfd pfd = { .fd = fd, .events = excl ? POLLOUT : POLLIN };
329*d83cc019SAndroid Build Coastguard Worker return poll(&pfd, 1, 0) == 0;
330*d83cc019SAndroid Build Coastguard Worker }
331*d83cc019SAndroid Build Coastguard Worker
work(int i915,int dmabuf,unsigned ring,uint32_t flags)332*d83cc019SAndroid Build Coastguard Worker static void work(int i915, int dmabuf, unsigned ring, uint32_t flags)
333*d83cc019SAndroid Build Coastguard Worker {
334*d83cc019SAndroid Build Coastguard Worker const int SCRATCH = 0;
335*d83cc019SAndroid Build Coastguard Worker const int BATCH = 1;
336*d83cc019SAndroid Build Coastguard Worker const int gen = intel_gen(intel_get_drm_devid(i915));
337*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_exec_object2 obj[2];
338*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_relocation_entry store[1024+1];
339*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_execbuffer2 execbuf;
340*d83cc019SAndroid Build Coastguard Worker unsigned size = ALIGN(ARRAY_SIZE(store)*16 + 4, 4096);
341*d83cc019SAndroid Build Coastguard Worker bool read_busy, write_busy;
342*d83cc019SAndroid Build Coastguard Worker uint32_t *batch, *bbe;
343*d83cc019SAndroid Build Coastguard Worker int i, count;
344*d83cc019SAndroid Build Coastguard Worker
345*d83cc019SAndroid Build Coastguard Worker memset(&execbuf, 0, sizeof(execbuf));
346*d83cc019SAndroid Build Coastguard Worker execbuf.buffers_ptr = (uintptr_t)obj;
347*d83cc019SAndroid Build Coastguard Worker execbuf.buffer_count = 2;
348*d83cc019SAndroid Build Coastguard Worker execbuf.flags = ring | flags;
349*d83cc019SAndroid Build Coastguard Worker if (gen < 6)
350*d83cc019SAndroid Build Coastguard Worker execbuf.flags |= I915_EXEC_SECURE;
351*d83cc019SAndroid Build Coastguard Worker
352*d83cc019SAndroid Build Coastguard Worker memset(obj, 0, sizeof(obj));
353*d83cc019SAndroid Build Coastguard Worker obj[SCRATCH].handle = prime_fd_to_handle(i915, dmabuf);
354*d83cc019SAndroid Build Coastguard Worker
355*d83cc019SAndroid Build Coastguard Worker obj[BATCH].handle = gem_create(i915, size);
356*d83cc019SAndroid Build Coastguard Worker obj[BATCH].relocs_ptr = (uintptr_t)store;
357*d83cc019SAndroid Build Coastguard Worker obj[BATCH].relocation_count = ARRAY_SIZE(store);
358*d83cc019SAndroid Build Coastguard Worker memset(store, 0, sizeof(store));
359*d83cc019SAndroid Build Coastguard Worker
360*d83cc019SAndroid Build Coastguard Worker batch = gem_mmap__wc(i915, obj[BATCH].handle, 0, size, PROT_WRITE);
361*d83cc019SAndroid Build Coastguard Worker gem_set_domain(i915, obj[BATCH].handle,
362*d83cc019SAndroid Build Coastguard Worker I915_GEM_DOMAIN_GTT, I915_GEM_DOMAIN_GTT);
363*d83cc019SAndroid Build Coastguard Worker
364*d83cc019SAndroid Build Coastguard Worker i = 0;
365*d83cc019SAndroid Build Coastguard Worker for (count = 0; count < 1024; count++) {
366*d83cc019SAndroid Build Coastguard Worker store[count].target_handle = obj[SCRATCH].handle;
367*d83cc019SAndroid Build Coastguard Worker store[count].presumed_offset = -1;
368*d83cc019SAndroid Build Coastguard Worker store[count].offset = sizeof(uint32_t) * (i + 1);
369*d83cc019SAndroid Build Coastguard Worker store[count].delta = sizeof(uint32_t) * count;
370*d83cc019SAndroid Build Coastguard Worker store[count].read_domains = I915_GEM_DOMAIN_INSTRUCTION;
371*d83cc019SAndroid Build Coastguard Worker store[count].write_domain = I915_GEM_DOMAIN_INSTRUCTION;
372*d83cc019SAndroid Build Coastguard Worker batch[i] = MI_STORE_DWORD_IMM | (gen < 6 ? 1 << 22 : 0);
373*d83cc019SAndroid Build Coastguard Worker if (gen >= 8) {
374*d83cc019SAndroid Build Coastguard Worker batch[++i] = 0;
375*d83cc019SAndroid Build Coastguard Worker batch[++i] = 0;
376*d83cc019SAndroid Build Coastguard Worker } else if (gen >= 4) {
377*d83cc019SAndroid Build Coastguard Worker batch[++i] = 0;
378*d83cc019SAndroid Build Coastguard Worker batch[++i] = 0;
379*d83cc019SAndroid Build Coastguard Worker store[count].offset += sizeof(uint32_t);
380*d83cc019SAndroid Build Coastguard Worker } else {
381*d83cc019SAndroid Build Coastguard Worker batch[i]--;
382*d83cc019SAndroid Build Coastguard Worker batch[++i] = 0;
383*d83cc019SAndroid Build Coastguard Worker }
384*d83cc019SAndroid Build Coastguard Worker batch[++i] = count;
385*d83cc019SAndroid Build Coastguard Worker i++;
386*d83cc019SAndroid Build Coastguard Worker }
387*d83cc019SAndroid Build Coastguard Worker
388*d83cc019SAndroid Build Coastguard Worker bbe = &batch[i];
389*d83cc019SAndroid Build Coastguard Worker store[count].target_handle = obj[BATCH].handle; /* recurse */
390*d83cc019SAndroid Build Coastguard Worker store[count].presumed_offset = 0;
391*d83cc019SAndroid Build Coastguard Worker store[count].offset = sizeof(uint32_t) * (i + 1);
392*d83cc019SAndroid Build Coastguard Worker store[count].delta = 0;
393*d83cc019SAndroid Build Coastguard Worker store[count].read_domains = I915_GEM_DOMAIN_COMMAND;
394*d83cc019SAndroid Build Coastguard Worker store[count].write_domain = 0;
395*d83cc019SAndroid Build Coastguard Worker batch[i] = MI_BATCH_BUFFER_START;
396*d83cc019SAndroid Build Coastguard Worker if (gen >= 8) {
397*d83cc019SAndroid Build Coastguard Worker batch[i] |= 1 << 8 | 1;
398*d83cc019SAndroid Build Coastguard Worker batch[++i] = 0;
399*d83cc019SAndroid Build Coastguard Worker batch[++i] = 0;
400*d83cc019SAndroid Build Coastguard Worker } else if (gen >= 6) {
401*d83cc019SAndroid Build Coastguard Worker batch[i] |= 1 << 8;
402*d83cc019SAndroid Build Coastguard Worker batch[++i] = 0;
403*d83cc019SAndroid Build Coastguard Worker } else {
404*d83cc019SAndroid Build Coastguard Worker batch[i] |= 2 << 6;
405*d83cc019SAndroid Build Coastguard Worker batch[++i] = 0;
406*d83cc019SAndroid Build Coastguard Worker if (gen < 4) {
407*d83cc019SAndroid Build Coastguard Worker batch[i] |= 1;
408*d83cc019SAndroid Build Coastguard Worker store[count].delta = 1;
409*d83cc019SAndroid Build Coastguard Worker }
410*d83cc019SAndroid Build Coastguard Worker }
411*d83cc019SAndroid Build Coastguard Worker i++;
412*d83cc019SAndroid Build Coastguard Worker igt_assert(i < size/sizeof(*batch));
413*d83cc019SAndroid Build Coastguard Worker igt_require(__gem_execbuf(i915, &execbuf) == 0);
414*d83cc019SAndroid Build Coastguard Worker gem_close(i915, obj[BATCH].handle);
415*d83cc019SAndroid Build Coastguard Worker gem_close(i915, obj[SCRATCH].handle);
416*d83cc019SAndroid Build Coastguard Worker
417*d83cc019SAndroid Build Coastguard Worker write_busy = prime_busy(dmabuf, false);
418*d83cc019SAndroid Build Coastguard Worker read_busy = prime_busy(dmabuf, true);
419*d83cc019SAndroid Build Coastguard Worker
420*d83cc019SAndroid Build Coastguard Worker *bbe = MI_BATCH_BUFFER_END;
421*d83cc019SAndroid Build Coastguard Worker __sync_synchronize();
422*d83cc019SAndroid Build Coastguard Worker munmap(batch, size);
423*d83cc019SAndroid Build Coastguard Worker
424*d83cc019SAndroid Build Coastguard Worker igt_assert(read_busy && write_busy);
425*d83cc019SAndroid Build Coastguard Worker }
426*d83cc019SAndroid Build Coastguard Worker
test_busy(int i915,int vgem,unsigned ring,uint32_t flags)427*d83cc019SAndroid Build Coastguard Worker static void test_busy(int i915, int vgem, unsigned ring, uint32_t flags)
428*d83cc019SAndroid Build Coastguard Worker {
429*d83cc019SAndroid Build Coastguard Worker struct vgem_bo scratch;
430*d83cc019SAndroid Build Coastguard Worker struct timespec tv;
431*d83cc019SAndroid Build Coastguard Worker uint32_t *ptr;
432*d83cc019SAndroid Build Coastguard Worker int dmabuf;
433*d83cc019SAndroid Build Coastguard Worker int i;
434*d83cc019SAndroid Build Coastguard Worker
435*d83cc019SAndroid Build Coastguard Worker scratch.width = 1024;
436*d83cc019SAndroid Build Coastguard Worker scratch.height = 1;
437*d83cc019SAndroid Build Coastguard Worker scratch.bpp = 32;
438*d83cc019SAndroid Build Coastguard Worker vgem_create(vgem, &scratch);
439*d83cc019SAndroid Build Coastguard Worker dmabuf = prime_handle_to_fd(vgem, scratch.handle);
440*d83cc019SAndroid Build Coastguard Worker
441*d83cc019SAndroid Build Coastguard Worker work(i915, dmabuf, ring, flags);
442*d83cc019SAndroid Build Coastguard Worker
443*d83cc019SAndroid Build Coastguard Worker /* Calling busy in a loop should be enough to flush the rendering */
444*d83cc019SAndroid Build Coastguard Worker memset(&tv, 0, sizeof(tv));
445*d83cc019SAndroid Build Coastguard Worker while (prime_busy(dmabuf, false))
446*d83cc019SAndroid Build Coastguard Worker igt_assert(igt_seconds_elapsed(&tv) < 10);
447*d83cc019SAndroid Build Coastguard Worker
448*d83cc019SAndroid Build Coastguard Worker ptr = vgem_mmap(vgem, &scratch, PROT_READ);
449*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++)
450*d83cc019SAndroid Build Coastguard Worker igt_assert_eq_u32(ptr[i], i);
451*d83cc019SAndroid Build Coastguard Worker munmap(ptr, 4096);
452*d83cc019SAndroid Build Coastguard Worker
453*d83cc019SAndroid Build Coastguard Worker gem_close(vgem, scratch.handle);
454*d83cc019SAndroid Build Coastguard Worker close(dmabuf);
455*d83cc019SAndroid Build Coastguard Worker }
456*d83cc019SAndroid Build Coastguard Worker
test_wait(int i915,int vgem,unsigned ring,uint32_t flags)457*d83cc019SAndroid Build Coastguard Worker static void test_wait(int i915, int vgem, unsigned ring, uint32_t flags)
458*d83cc019SAndroid Build Coastguard Worker {
459*d83cc019SAndroid Build Coastguard Worker struct vgem_bo scratch;
460*d83cc019SAndroid Build Coastguard Worker struct pollfd pfd;
461*d83cc019SAndroid Build Coastguard Worker uint32_t *ptr;
462*d83cc019SAndroid Build Coastguard Worker int i;
463*d83cc019SAndroid Build Coastguard Worker
464*d83cc019SAndroid Build Coastguard Worker scratch.width = 1024;
465*d83cc019SAndroid Build Coastguard Worker scratch.height = 1;
466*d83cc019SAndroid Build Coastguard Worker scratch.bpp = 32;
467*d83cc019SAndroid Build Coastguard Worker vgem_create(vgem, &scratch);
468*d83cc019SAndroid Build Coastguard Worker pfd.fd = prime_handle_to_fd(vgem, scratch.handle);
469*d83cc019SAndroid Build Coastguard Worker
470*d83cc019SAndroid Build Coastguard Worker work(i915, pfd.fd, ring, flags);
471*d83cc019SAndroid Build Coastguard Worker
472*d83cc019SAndroid Build Coastguard Worker pfd.events = POLLIN;
473*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(poll(&pfd, 1, 10000), 1);
474*d83cc019SAndroid Build Coastguard Worker
475*d83cc019SAndroid Build Coastguard Worker ptr = vgem_mmap(vgem, &scratch, PROT_READ);
476*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++)
477*d83cc019SAndroid Build Coastguard Worker igt_assert_eq_u32(ptr[i], i);
478*d83cc019SAndroid Build Coastguard Worker munmap(ptr, 4096);
479*d83cc019SAndroid Build Coastguard Worker
480*d83cc019SAndroid Build Coastguard Worker gem_close(vgem, scratch.handle);
481*d83cc019SAndroid Build Coastguard Worker close(pfd.fd);
482*d83cc019SAndroid Build Coastguard Worker }
483*d83cc019SAndroid Build Coastguard Worker
test_sync(int i915,int vgem,unsigned ring,uint32_t flags)484*d83cc019SAndroid Build Coastguard Worker static void test_sync(int i915, int vgem, unsigned ring, uint32_t flags)
485*d83cc019SAndroid Build Coastguard Worker {
486*d83cc019SAndroid Build Coastguard Worker struct vgem_bo scratch;
487*d83cc019SAndroid Build Coastguard Worker uint32_t *ptr;
488*d83cc019SAndroid Build Coastguard Worker int dmabuf;
489*d83cc019SAndroid Build Coastguard Worker int i;
490*d83cc019SAndroid Build Coastguard Worker
491*d83cc019SAndroid Build Coastguard Worker scratch.width = 1024;
492*d83cc019SAndroid Build Coastguard Worker scratch.height = 1;
493*d83cc019SAndroid Build Coastguard Worker scratch.bpp = 32;
494*d83cc019SAndroid Build Coastguard Worker vgem_create(vgem, &scratch);
495*d83cc019SAndroid Build Coastguard Worker dmabuf = prime_handle_to_fd(vgem, scratch.handle);
496*d83cc019SAndroid Build Coastguard Worker
497*d83cc019SAndroid Build Coastguard Worker ptr = mmap(NULL, scratch.size, PROT_READ, MAP_SHARED, dmabuf, 0);
498*d83cc019SAndroid Build Coastguard Worker igt_assert(ptr != MAP_FAILED);
499*d83cc019SAndroid Build Coastguard Worker gem_close(vgem, scratch.handle);
500*d83cc019SAndroid Build Coastguard Worker
501*d83cc019SAndroid Build Coastguard Worker work(i915, dmabuf, ring, flags);
502*d83cc019SAndroid Build Coastguard Worker
503*d83cc019SAndroid Build Coastguard Worker prime_sync_start(dmabuf, false);
504*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++)
505*d83cc019SAndroid Build Coastguard Worker igt_assert_eq_u32(ptr[i], i);
506*d83cc019SAndroid Build Coastguard Worker
507*d83cc019SAndroid Build Coastguard Worker prime_sync_end(dmabuf, false);
508*d83cc019SAndroid Build Coastguard Worker close(dmabuf);
509*d83cc019SAndroid Build Coastguard Worker
510*d83cc019SAndroid Build Coastguard Worker munmap(ptr, scratch.size);
511*d83cc019SAndroid Build Coastguard Worker }
512*d83cc019SAndroid Build Coastguard Worker
test_fence_wait(int i915,int vgem,unsigned ring,unsigned flags)513*d83cc019SAndroid Build Coastguard Worker static void test_fence_wait(int i915, int vgem, unsigned ring, unsigned flags)
514*d83cc019SAndroid Build Coastguard Worker {
515*d83cc019SAndroid Build Coastguard Worker struct vgem_bo scratch;
516*d83cc019SAndroid Build Coastguard Worker uint32_t fence;
517*d83cc019SAndroid Build Coastguard Worker uint32_t *ptr;
518*d83cc019SAndroid Build Coastguard Worker int dmabuf;
519*d83cc019SAndroid Build Coastguard Worker
520*d83cc019SAndroid Build Coastguard Worker scratch.width = 1024;
521*d83cc019SAndroid Build Coastguard Worker scratch.height = 1;
522*d83cc019SAndroid Build Coastguard Worker scratch.bpp = 32;
523*d83cc019SAndroid Build Coastguard Worker vgem_create(vgem, &scratch);
524*d83cc019SAndroid Build Coastguard Worker
525*d83cc019SAndroid Build Coastguard Worker dmabuf = prime_handle_to_fd(vgem, scratch.handle);
526*d83cc019SAndroid Build Coastguard Worker fence = vgem_fence_attach(vgem, &scratch, VGEM_FENCE_WRITE);
527*d83cc019SAndroid Build Coastguard Worker igt_assert(prime_busy(dmabuf, false));
528*d83cc019SAndroid Build Coastguard Worker gem_close(vgem, scratch.handle);
529*d83cc019SAndroid Build Coastguard Worker
530*d83cc019SAndroid Build Coastguard Worker ptr = mmap(NULL, scratch.size, PROT_READ, MAP_SHARED, dmabuf, 0);
531*d83cc019SAndroid Build Coastguard Worker igt_assert(ptr != MAP_FAILED);
532*d83cc019SAndroid Build Coastguard Worker
533*d83cc019SAndroid Build Coastguard Worker igt_fork(child, 1)
534*d83cc019SAndroid Build Coastguard Worker work(i915, dmabuf, ring, flags);
535*d83cc019SAndroid Build Coastguard Worker
536*d83cc019SAndroid Build Coastguard Worker sleep(1);
537*d83cc019SAndroid Build Coastguard Worker
538*d83cc019SAndroid Build Coastguard Worker /* Check for invalidly completing the task early */
539*d83cc019SAndroid Build Coastguard Worker for (int i = 0; i < 1024; i++)
540*d83cc019SAndroid Build Coastguard Worker igt_assert_eq_u32(ptr[i], 0);
541*d83cc019SAndroid Build Coastguard Worker
542*d83cc019SAndroid Build Coastguard Worker igt_assert(prime_busy(dmabuf, false));
543*d83cc019SAndroid Build Coastguard Worker vgem_fence_signal(vgem, fence);
544*d83cc019SAndroid Build Coastguard Worker igt_waitchildren();
545*d83cc019SAndroid Build Coastguard Worker
546*d83cc019SAndroid Build Coastguard Worker /* But after signaling and waiting, it should be done */
547*d83cc019SAndroid Build Coastguard Worker prime_sync_start(dmabuf, false);
548*d83cc019SAndroid Build Coastguard Worker for (int i = 0; i < 1024; i++)
549*d83cc019SAndroid Build Coastguard Worker igt_assert_eq_u32(ptr[i], i);
550*d83cc019SAndroid Build Coastguard Worker prime_sync_end(dmabuf, false);
551*d83cc019SAndroid Build Coastguard Worker
552*d83cc019SAndroid Build Coastguard Worker close(dmabuf);
553*d83cc019SAndroid Build Coastguard Worker
554*d83cc019SAndroid Build Coastguard Worker munmap(ptr, scratch.size);
555*d83cc019SAndroid Build Coastguard Worker }
556*d83cc019SAndroid Build Coastguard Worker
test_fence_hang(int i915,int vgem,unsigned flags)557*d83cc019SAndroid Build Coastguard Worker static void test_fence_hang(int i915, int vgem, unsigned flags)
558*d83cc019SAndroid Build Coastguard Worker {
559*d83cc019SAndroid Build Coastguard Worker struct vgem_bo scratch;
560*d83cc019SAndroid Build Coastguard Worker uint32_t *ptr;
561*d83cc019SAndroid Build Coastguard Worker int dmabuf;
562*d83cc019SAndroid Build Coastguard Worker int i;
563*d83cc019SAndroid Build Coastguard Worker
564*d83cc019SAndroid Build Coastguard Worker scratch.width = 1024;
565*d83cc019SAndroid Build Coastguard Worker scratch.height = 1;
566*d83cc019SAndroid Build Coastguard Worker scratch.bpp = 32;
567*d83cc019SAndroid Build Coastguard Worker vgem_create(vgem, &scratch);
568*d83cc019SAndroid Build Coastguard Worker dmabuf = prime_handle_to_fd(vgem, scratch.handle);
569*d83cc019SAndroid Build Coastguard Worker vgem_fence_attach(vgem, &scratch, flags | WIP_VGEM_FENCE_NOTIMEOUT);
570*d83cc019SAndroid Build Coastguard Worker
571*d83cc019SAndroid Build Coastguard Worker ptr = mmap(NULL, scratch.size, PROT_READ, MAP_SHARED, dmabuf, 0);
572*d83cc019SAndroid Build Coastguard Worker igt_assert(ptr != MAP_FAILED);
573*d83cc019SAndroid Build Coastguard Worker gem_close(vgem, scratch.handle);
574*d83cc019SAndroid Build Coastguard Worker
575*d83cc019SAndroid Build Coastguard Worker work(i915, dmabuf, I915_EXEC_DEFAULT, 0);
576*d83cc019SAndroid Build Coastguard Worker
577*d83cc019SAndroid Build Coastguard Worker /* The work should have been cancelled */
578*d83cc019SAndroid Build Coastguard Worker
579*d83cc019SAndroid Build Coastguard Worker prime_sync_start(dmabuf, false);
580*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < 1024; i++)
581*d83cc019SAndroid Build Coastguard Worker igt_assert_eq_u32(ptr[i], 0);
582*d83cc019SAndroid Build Coastguard Worker prime_sync_end(dmabuf, false);
583*d83cc019SAndroid Build Coastguard Worker close(dmabuf);
584*d83cc019SAndroid Build Coastguard Worker
585*d83cc019SAndroid Build Coastguard Worker munmap(ptr, scratch.size);
586*d83cc019SAndroid Build Coastguard Worker }
587*d83cc019SAndroid Build Coastguard Worker
has_prime_export(int fd)588*d83cc019SAndroid Build Coastguard Worker static bool has_prime_export(int fd)
589*d83cc019SAndroid Build Coastguard Worker {
590*d83cc019SAndroid Build Coastguard Worker uint64_t value;
591*d83cc019SAndroid Build Coastguard Worker
592*d83cc019SAndroid Build Coastguard Worker if (drmGetCap(fd, DRM_CAP_PRIME, &value))
593*d83cc019SAndroid Build Coastguard Worker return false;
594*d83cc019SAndroid Build Coastguard Worker
595*d83cc019SAndroid Build Coastguard Worker return value & DRM_PRIME_CAP_EXPORT;
596*d83cc019SAndroid Build Coastguard Worker }
597*d83cc019SAndroid Build Coastguard Worker
has_prime_import(int fd)598*d83cc019SAndroid Build Coastguard Worker static bool has_prime_import(int fd)
599*d83cc019SAndroid Build Coastguard Worker {
600*d83cc019SAndroid Build Coastguard Worker uint64_t value;
601*d83cc019SAndroid Build Coastguard Worker
602*d83cc019SAndroid Build Coastguard Worker if (drmGetCap(fd, DRM_CAP_PRIME, &value))
603*d83cc019SAndroid Build Coastguard Worker return false;
604*d83cc019SAndroid Build Coastguard Worker
605*d83cc019SAndroid Build Coastguard Worker return value & DRM_PRIME_CAP_IMPORT;
606*d83cc019SAndroid Build Coastguard Worker }
607*d83cc019SAndroid Build Coastguard Worker
set_fb_on_crtc(int fd,int pipe,struct vgem_bo * bo,uint32_t fb_id)608*d83cc019SAndroid Build Coastguard Worker static uint32_t set_fb_on_crtc(int fd, int pipe, struct vgem_bo *bo, uint32_t fb_id)
609*d83cc019SAndroid Build Coastguard Worker {
610*d83cc019SAndroid Build Coastguard Worker drmModeRes *resources = drmModeGetResources(fd);
611*d83cc019SAndroid Build Coastguard Worker struct drm_mode_modeinfo *modes = malloc(4096*sizeof(*modes));
612*d83cc019SAndroid Build Coastguard Worker uint32_t encoders[32];
613*d83cc019SAndroid Build Coastguard Worker
614*d83cc019SAndroid Build Coastguard Worker for (int o = 0; o < resources->count_connectors; o++) {
615*d83cc019SAndroid Build Coastguard Worker struct drm_mode_get_connector conn;
616*d83cc019SAndroid Build Coastguard Worker struct drm_mode_crtc set;
617*d83cc019SAndroid Build Coastguard Worker int e, m;
618*d83cc019SAndroid Build Coastguard Worker
619*d83cc019SAndroid Build Coastguard Worker memset(&conn, 0, sizeof(conn));
620*d83cc019SAndroid Build Coastguard Worker conn.connector_id = resources->connectors[o];
621*d83cc019SAndroid Build Coastguard Worker drmIoctl(fd, DRM_IOCTL_MODE_GETCONNECTOR, &conn);
622*d83cc019SAndroid Build Coastguard Worker if (!conn.count_modes)
623*d83cc019SAndroid Build Coastguard Worker continue;
624*d83cc019SAndroid Build Coastguard Worker
625*d83cc019SAndroid Build Coastguard Worker igt_assert(conn.count_modes <= 4096);
626*d83cc019SAndroid Build Coastguard Worker igt_assert(conn.count_encoders <= 32);
627*d83cc019SAndroid Build Coastguard Worker
628*d83cc019SAndroid Build Coastguard Worker conn.modes_ptr = (uintptr_t)modes;
629*d83cc019SAndroid Build Coastguard Worker conn.encoders_ptr = (uintptr_t)encoders;
630*d83cc019SAndroid Build Coastguard Worker conn.count_props = 0;
631*d83cc019SAndroid Build Coastguard Worker do_or_die(drmIoctl(fd, DRM_IOCTL_MODE_GETCONNECTOR, &conn));
632*d83cc019SAndroid Build Coastguard Worker
633*d83cc019SAndroid Build Coastguard Worker for (e = 0; e < conn.count_encoders; e++) {
634*d83cc019SAndroid Build Coastguard Worker struct drm_mode_get_encoder enc;
635*d83cc019SAndroid Build Coastguard Worker
636*d83cc019SAndroid Build Coastguard Worker memset(&enc, 0, sizeof(enc));
637*d83cc019SAndroid Build Coastguard Worker enc.encoder_id = encoders[e];
638*d83cc019SAndroid Build Coastguard Worker drmIoctl(fd, DRM_IOCTL_MODE_GETENCODER, &enc);
639*d83cc019SAndroid Build Coastguard Worker if (enc.possible_crtcs & (1 << pipe))
640*d83cc019SAndroid Build Coastguard Worker break;
641*d83cc019SAndroid Build Coastguard Worker }
642*d83cc019SAndroid Build Coastguard Worker if (e == conn.count_encoders)
643*d83cc019SAndroid Build Coastguard Worker continue;
644*d83cc019SAndroid Build Coastguard Worker
645*d83cc019SAndroid Build Coastguard Worker for (m = 0; m < conn.count_modes; m++) {
646*d83cc019SAndroid Build Coastguard Worker if (modes[m].hdisplay <= bo->width &&
647*d83cc019SAndroid Build Coastguard Worker modes[m].vdisplay <= bo->height)
648*d83cc019SAndroid Build Coastguard Worker break;
649*d83cc019SAndroid Build Coastguard Worker }
650*d83cc019SAndroid Build Coastguard Worker if (m == conn.count_modes)
651*d83cc019SAndroid Build Coastguard Worker continue;
652*d83cc019SAndroid Build Coastguard Worker
653*d83cc019SAndroid Build Coastguard Worker memset(&set, 0, sizeof(set));
654*d83cc019SAndroid Build Coastguard Worker set.crtc_id = resources->crtcs[pipe];
655*d83cc019SAndroid Build Coastguard Worker set.fb_id = fb_id;
656*d83cc019SAndroid Build Coastguard Worker set.set_connectors_ptr = (uintptr_t)&conn.connector_id;
657*d83cc019SAndroid Build Coastguard Worker set.count_connectors = 1;
658*d83cc019SAndroid Build Coastguard Worker set.mode = modes[m];
659*d83cc019SAndroid Build Coastguard Worker set.mode_valid = 1;
660*d83cc019SAndroid Build Coastguard Worker if (drmIoctl(fd, DRM_IOCTL_MODE_SETCRTC, &set) == 0) {
661*d83cc019SAndroid Build Coastguard Worker drmModeFreeResources(resources);
662*d83cc019SAndroid Build Coastguard Worker return set.crtc_id;
663*d83cc019SAndroid Build Coastguard Worker }
664*d83cc019SAndroid Build Coastguard Worker }
665*d83cc019SAndroid Build Coastguard Worker
666*d83cc019SAndroid Build Coastguard Worker drmModeFreeResources(resources);
667*d83cc019SAndroid Build Coastguard Worker return 0;
668*d83cc019SAndroid Build Coastguard Worker }
669*d83cc019SAndroid Build Coastguard Worker
pipe_select(int pipe)670*d83cc019SAndroid Build Coastguard Worker static inline uint32_t pipe_select(int pipe)
671*d83cc019SAndroid Build Coastguard Worker {
672*d83cc019SAndroid Build Coastguard Worker if (pipe > 1)
673*d83cc019SAndroid Build Coastguard Worker return pipe << DRM_VBLANK_HIGH_CRTC_SHIFT;
674*d83cc019SAndroid Build Coastguard Worker else if (pipe > 0)
675*d83cc019SAndroid Build Coastguard Worker return DRM_VBLANK_SECONDARY;
676*d83cc019SAndroid Build Coastguard Worker else
677*d83cc019SAndroid Build Coastguard Worker return 0;
678*d83cc019SAndroid Build Coastguard Worker }
679*d83cc019SAndroid Build Coastguard Worker
get_vblank(int fd,int pipe,unsigned flags)680*d83cc019SAndroid Build Coastguard Worker static unsigned get_vblank(int fd, int pipe, unsigned flags)
681*d83cc019SAndroid Build Coastguard Worker {
682*d83cc019SAndroid Build Coastguard Worker union drm_wait_vblank vbl;
683*d83cc019SAndroid Build Coastguard Worker
684*d83cc019SAndroid Build Coastguard Worker memset(&vbl, 0, sizeof(vbl));
685*d83cc019SAndroid Build Coastguard Worker vbl.request.type = DRM_VBLANK_RELATIVE | pipe_select(pipe) | flags;
686*d83cc019SAndroid Build Coastguard Worker if (drmIoctl(fd, DRM_IOCTL_WAIT_VBLANK, &vbl))
687*d83cc019SAndroid Build Coastguard Worker return 0;
688*d83cc019SAndroid Build Coastguard Worker
689*d83cc019SAndroid Build Coastguard Worker return vbl.reply.sequence;
690*d83cc019SAndroid Build Coastguard Worker }
691*d83cc019SAndroid Build Coastguard Worker
flip_to_vgem(int i915,int vgem,struct vgem_bo * bo,uint32_t fb_id,uint32_t crtc_id,unsigned hang,const char * name)692*d83cc019SAndroid Build Coastguard Worker static void flip_to_vgem(int i915, int vgem,
693*d83cc019SAndroid Build Coastguard Worker struct vgem_bo *bo,
694*d83cc019SAndroid Build Coastguard Worker uint32_t fb_id,
695*d83cc019SAndroid Build Coastguard Worker uint32_t crtc_id,
696*d83cc019SAndroid Build Coastguard Worker unsigned hang,
697*d83cc019SAndroid Build Coastguard Worker const char *name)
698*d83cc019SAndroid Build Coastguard Worker {
699*d83cc019SAndroid Build Coastguard Worker struct pollfd pfd = { i915, POLLIN };
700*d83cc019SAndroid Build Coastguard Worker struct drm_event_vblank vbl;
701*d83cc019SAndroid Build Coastguard Worker uint32_t fence;
702*d83cc019SAndroid Build Coastguard Worker
703*d83cc019SAndroid Build Coastguard Worker fence = vgem_fence_attach(vgem, bo, VGEM_FENCE_WRITE | hang);
704*d83cc019SAndroid Build Coastguard Worker
705*d83cc019SAndroid Build Coastguard Worker igt_fork(child, 1) { /* Use a child in case we block uninterruptibly */
706*d83cc019SAndroid Build Coastguard Worker /* Check we don't block nor flip before the fence is ready */
707*d83cc019SAndroid Build Coastguard Worker do_or_die(drmModePageFlip(i915, crtc_id, fb_id,
708*d83cc019SAndroid Build Coastguard Worker DRM_MODE_PAGE_FLIP_EVENT, &fb_id));
709*d83cc019SAndroid Build Coastguard Worker for (int n = 0; n < 5; n++) { /* 5 frames should be <100ms */
710*d83cc019SAndroid Build Coastguard Worker igt_assert_f(poll(&pfd, 1, 0) == 0,
711*d83cc019SAndroid Build Coastguard Worker "flip to %s completed whilst busy\n",
712*d83cc019SAndroid Build Coastguard Worker name);
713*d83cc019SAndroid Build Coastguard Worker get_vblank(i915, 0, DRM_VBLANK_NEXTONMISS);
714*d83cc019SAndroid Build Coastguard Worker }
715*d83cc019SAndroid Build Coastguard Worker }
716*d83cc019SAndroid Build Coastguard Worker igt_waitchildren_timeout(2, "flip blocked by waiting for busy vgem fence");
717*d83cc019SAndroid Build Coastguard Worker
718*d83cc019SAndroid Build Coastguard Worker /* And then the flip is completed as soon as it is ready */
719*d83cc019SAndroid Build Coastguard Worker if (!hang) {
720*d83cc019SAndroid Build Coastguard Worker unsigned long miss;
721*d83cc019SAndroid Build Coastguard Worker
722*d83cc019SAndroid Build Coastguard Worker /* Signal fence at the start of the next vblank */
723*d83cc019SAndroid Build Coastguard Worker get_vblank(i915, 0, DRM_VBLANK_NEXTONMISS);
724*d83cc019SAndroid Build Coastguard Worker vgem_fence_signal(vgem, fence);
725*d83cc019SAndroid Build Coastguard Worker
726*d83cc019SAndroid Build Coastguard Worker miss = 0;
727*d83cc019SAndroid Build Coastguard Worker igt_until_timeout(5) {
728*d83cc019SAndroid Build Coastguard Worker get_vblank(i915, 0, DRM_VBLANK_NEXTONMISS);
729*d83cc019SAndroid Build Coastguard Worker if (poll(&pfd, 1, 0))
730*d83cc019SAndroid Build Coastguard Worker break;
731*d83cc019SAndroid Build Coastguard Worker miss++;
732*d83cc019SAndroid Build Coastguard Worker }
733*d83cc019SAndroid Build Coastguard Worker if (miss > 1) {
734*d83cc019SAndroid Build Coastguard Worker igt_warn("Missed %lu vblanks after signaling before flip was completed\n",
735*d83cc019SAndroid Build Coastguard Worker miss);
736*d83cc019SAndroid Build Coastguard Worker }
737*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(poll(&pfd, 1, 0), 1);
738*d83cc019SAndroid Build Coastguard Worker }
739*d83cc019SAndroid Build Coastguard Worker
740*d83cc019SAndroid Build Coastguard Worker /* Even if hung, the flip must complete *eventually* */
741*d83cc019SAndroid Build Coastguard Worker igt_set_timeout(20, "flip blocked by hanging vgem fence"); /* XXX lower fail threshold? */
742*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(read(i915, &vbl, sizeof(vbl)), sizeof(vbl));
743*d83cc019SAndroid Build Coastguard Worker igt_reset_timeout();
744*d83cc019SAndroid Build Coastguard Worker }
745*d83cc019SAndroid Build Coastguard Worker
test_flip(int i915,int vgem,unsigned hang)746*d83cc019SAndroid Build Coastguard Worker static void test_flip(int i915, int vgem, unsigned hang)
747*d83cc019SAndroid Build Coastguard Worker {
748*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode = NULL;
749*d83cc019SAndroid Build Coastguard Worker uint32_t fb_id[2], handle[2], crtc_id;
750*d83cc019SAndroid Build Coastguard Worker igt_display_t display;
751*d83cc019SAndroid Build Coastguard Worker igt_output_t *output;
752*d83cc019SAndroid Build Coastguard Worker struct vgem_bo bo[2];
753*d83cc019SAndroid Build Coastguard Worker enum pipe pipe;
754*d83cc019SAndroid Build Coastguard Worker
755*d83cc019SAndroid Build Coastguard Worker igt_display_require(&display, i915);
756*d83cc019SAndroid Build Coastguard Worker igt_display_require_output(&display);
757*d83cc019SAndroid Build Coastguard Worker
758*d83cc019SAndroid Build Coastguard Worker for_each_pipe_with_valid_output(&display, pipe, output) {
759*d83cc019SAndroid Build Coastguard Worker mode = igt_output_get_mode(output);
760*d83cc019SAndroid Build Coastguard Worker break;
761*d83cc019SAndroid Build Coastguard Worker }
762*d83cc019SAndroid Build Coastguard Worker
763*d83cc019SAndroid Build Coastguard Worker igt_assert(mode);
764*d83cc019SAndroid Build Coastguard Worker
765*d83cc019SAndroid Build Coastguard Worker for (int i = 0; i < 2; i++) {
766*d83cc019SAndroid Build Coastguard Worker uint32_t strides[4] = {};
767*d83cc019SAndroid Build Coastguard Worker uint32_t offsets[4] = {};
768*d83cc019SAndroid Build Coastguard Worker int fd;
769*d83cc019SAndroid Build Coastguard Worker
770*d83cc019SAndroid Build Coastguard Worker bo[i].width = mode->hdisplay;
771*d83cc019SAndroid Build Coastguard Worker bo[i].height = mode->vdisplay;
772*d83cc019SAndroid Build Coastguard Worker bo[i].bpp = 32;
773*d83cc019SAndroid Build Coastguard Worker vgem_create(vgem, &bo[i]);
774*d83cc019SAndroid Build Coastguard Worker
775*d83cc019SAndroid Build Coastguard Worker fd = prime_handle_to_fd(vgem, bo[i].handle);
776*d83cc019SAndroid Build Coastguard Worker handle[i] = prime_fd_to_handle(i915, fd);
777*d83cc019SAndroid Build Coastguard Worker igt_assert(handle[i]);
778*d83cc019SAndroid Build Coastguard Worker close(fd);
779*d83cc019SAndroid Build Coastguard Worker
780*d83cc019SAndroid Build Coastguard Worker strides[0] = bo[i].pitch;
781*d83cc019SAndroid Build Coastguard Worker
782*d83cc019SAndroid Build Coastguard Worker /* May skip if i915 has no displays */
783*d83cc019SAndroid Build Coastguard Worker igt_require(__kms_addfb(i915, handle[i],
784*d83cc019SAndroid Build Coastguard Worker bo[i].width, bo[i].height,
785*d83cc019SAndroid Build Coastguard Worker DRM_FORMAT_XRGB8888, I915_TILING_NONE,
786*d83cc019SAndroid Build Coastguard Worker strides, offsets, 1,
787*d83cc019SAndroid Build Coastguard Worker LOCAL_DRM_MODE_FB_MODIFIERS,
788*d83cc019SAndroid Build Coastguard Worker &fb_id[i]) == 0);
789*d83cc019SAndroid Build Coastguard Worker igt_assert(fb_id[i]);
790*d83cc019SAndroid Build Coastguard Worker }
791*d83cc019SAndroid Build Coastguard Worker
792*d83cc019SAndroid Build Coastguard Worker igt_require((crtc_id = set_fb_on_crtc(i915, 0, &bo[0], fb_id[0])));
793*d83cc019SAndroid Build Coastguard Worker
794*d83cc019SAndroid Build Coastguard Worker /* Bind both fb for use by flipping */
795*d83cc019SAndroid Build Coastguard Worker for (int i = 1; i >= 0; i--) {
796*d83cc019SAndroid Build Coastguard Worker struct drm_event_vblank vbl;
797*d83cc019SAndroid Build Coastguard Worker
798*d83cc019SAndroid Build Coastguard Worker do_or_die(drmModePageFlip(i915, crtc_id, fb_id[i],
799*d83cc019SAndroid Build Coastguard Worker DRM_MODE_PAGE_FLIP_EVENT, &fb_id[i]));
800*d83cc019SAndroid Build Coastguard Worker igt_assert_eq(read(i915, &vbl, sizeof(vbl)), sizeof(vbl));
801*d83cc019SAndroid Build Coastguard Worker }
802*d83cc019SAndroid Build Coastguard Worker
803*d83cc019SAndroid Build Coastguard Worker /* Schedule a flip to wait upon the frontbuffer vgem being written */
804*d83cc019SAndroid Build Coastguard Worker flip_to_vgem(i915, vgem, &bo[0], fb_id[0], crtc_id, hang, "front");
805*d83cc019SAndroid Build Coastguard Worker
806*d83cc019SAndroid Build Coastguard Worker /* Schedule a flip to wait upon the backbuffer vgem being written */
807*d83cc019SAndroid Build Coastguard Worker flip_to_vgem(i915, vgem, &bo[1], fb_id[1], crtc_id, hang, "back");
808*d83cc019SAndroid Build Coastguard Worker
809*d83cc019SAndroid Build Coastguard Worker for (int i = 0; i < 2; i++) {
810*d83cc019SAndroid Build Coastguard Worker do_or_die(drmModeRmFB(i915, fb_id[i]));
811*d83cc019SAndroid Build Coastguard Worker gem_close(i915, handle[i]);
812*d83cc019SAndroid Build Coastguard Worker gem_close(vgem, bo[i].handle);
813*d83cc019SAndroid Build Coastguard Worker }
814*d83cc019SAndroid Build Coastguard Worker }
815*d83cc019SAndroid Build Coastguard Worker
816*d83cc019SAndroid Build Coastguard Worker igt_main
817*d83cc019SAndroid Build Coastguard Worker {
818*d83cc019SAndroid Build Coastguard Worker const struct intel_execution_engine *e;
819*d83cc019SAndroid Build Coastguard Worker int i915 = -1;
820*d83cc019SAndroid Build Coastguard Worker int vgem = -1;
821*d83cc019SAndroid Build Coastguard Worker
822*d83cc019SAndroid Build Coastguard Worker igt_fixture {
823*d83cc019SAndroid Build Coastguard Worker vgem = drm_open_driver(DRIVER_VGEM);
824*d83cc019SAndroid Build Coastguard Worker igt_require(has_prime_export(vgem));
825*d83cc019SAndroid Build Coastguard Worker
826*d83cc019SAndroid Build Coastguard Worker i915 = drm_open_driver_master(DRIVER_INTEL);
827*d83cc019SAndroid Build Coastguard Worker igt_require_gem(i915);
828*d83cc019SAndroid Build Coastguard Worker igt_require(has_prime_import(i915));
829*d83cc019SAndroid Build Coastguard Worker gem_require_mmap_wc(i915);
830*d83cc019SAndroid Build Coastguard Worker }
831*d83cc019SAndroid Build Coastguard Worker
832*d83cc019SAndroid Build Coastguard Worker igt_subtest("basic-read")
833*d83cc019SAndroid Build Coastguard Worker test_read(vgem, i915);
834*d83cc019SAndroid Build Coastguard Worker
835*d83cc019SAndroid Build Coastguard Worker igt_subtest("basic-write")
836*d83cc019SAndroid Build Coastguard Worker test_write(vgem, i915);
837*d83cc019SAndroid Build Coastguard Worker
838*d83cc019SAndroid Build Coastguard Worker igt_subtest("basic-gtt")
839*d83cc019SAndroid Build Coastguard Worker test_gtt(vgem, i915);
840*d83cc019SAndroid Build Coastguard Worker
841*d83cc019SAndroid Build Coastguard Worker igt_subtest("shrink")
842*d83cc019SAndroid Build Coastguard Worker test_shrink(vgem, i915);
843*d83cc019SAndroid Build Coastguard Worker
844*d83cc019SAndroid Build Coastguard Worker igt_subtest("coherency-gtt")
845*d83cc019SAndroid Build Coastguard Worker test_gtt_interleaved(vgem, i915);
846*d83cc019SAndroid Build Coastguard Worker
847*d83cc019SAndroid Build Coastguard Worker for (e = intel_execution_engines; e->name; e++) {
848*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%ssync-%s",
849*d83cc019SAndroid Build Coastguard Worker e->exec_id == 0 ? "basic-" : "",
850*d83cc019SAndroid Build Coastguard Worker e->name) {
851*d83cc019SAndroid Build Coastguard Worker gem_require_ring(i915, e->exec_id | e->flags);
852*d83cc019SAndroid Build Coastguard Worker igt_require(gem_can_store_dword(i915, e->exec_id | e->flags));
853*d83cc019SAndroid Build Coastguard Worker
854*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(i915);
855*d83cc019SAndroid Build Coastguard Worker test_sync(i915, vgem, e->exec_id, e->flags);
856*d83cc019SAndroid Build Coastguard Worker }
857*d83cc019SAndroid Build Coastguard Worker }
858*d83cc019SAndroid Build Coastguard Worker
859*d83cc019SAndroid Build Coastguard Worker for (e = intel_execution_engines; e->name; e++) {
860*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%sbusy-%s",
861*d83cc019SAndroid Build Coastguard Worker e->exec_id == 0 ? "basic-" : "",
862*d83cc019SAndroid Build Coastguard Worker e->name) {
863*d83cc019SAndroid Build Coastguard Worker gem_require_ring(i915, e->exec_id | e->flags);
864*d83cc019SAndroid Build Coastguard Worker igt_require(gem_can_store_dword(i915, e->exec_id | e->flags));
865*d83cc019SAndroid Build Coastguard Worker
866*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(i915);
867*d83cc019SAndroid Build Coastguard Worker test_busy(i915, vgem, e->exec_id, e->flags);
868*d83cc019SAndroid Build Coastguard Worker }
869*d83cc019SAndroid Build Coastguard Worker }
870*d83cc019SAndroid Build Coastguard Worker
871*d83cc019SAndroid Build Coastguard Worker for (e = intel_execution_engines; e->name; e++) {
872*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%swait-%s",
873*d83cc019SAndroid Build Coastguard Worker e->exec_id == 0 ? "basic-" : "",
874*d83cc019SAndroid Build Coastguard Worker e->name) {
875*d83cc019SAndroid Build Coastguard Worker gem_require_ring(i915, e->exec_id | e->flags);
876*d83cc019SAndroid Build Coastguard Worker igt_require(gem_can_store_dword(i915, e->exec_id | e->flags));
877*d83cc019SAndroid Build Coastguard Worker
878*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(i915);
879*d83cc019SAndroid Build Coastguard Worker test_wait(i915, vgem, e->exec_id, e->flags);
880*d83cc019SAndroid Build Coastguard Worker }
881*d83cc019SAndroid Build Coastguard Worker }
882*d83cc019SAndroid Build Coastguard Worker
883*d83cc019SAndroid Build Coastguard Worker /* Fence testing */
884*d83cc019SAndroid Build Coastguard Worker igt_subtest_group {
885*d83cc019SAndroid Build Coastguard Worker igt_fixture {
886*d83cc019SAndroid Build Coastguard Worker igt_require(vgem_has_fences(vgem));
887*d83cc019SAndroid Build Coastguard Worker }
888*d83cc019SAndroid Build Coastguard Worker
889*d83cc019SAndroid Build Coastguard Worker igt_subtest("basic-fence-read")
890*d83cc019SAndroid Build Coastguard Worker test_fence_read(i915, vgem);
891*d83cc019SAndroid Build Coastguard Worker igt_subtest("basic-fence-mmap")
892*d83cc019SAndroid Build Coastguard Worker test_fence_mmap(i915, vgem);
893*d83cc019SAndroid Build Coastguard Worker
894*d83cc019SAndroid Build Coastguard Worker for (e = intel_execution_engines; e->name; e++) {
895*d83cc019SAndroid Build Coastguard Worker igt_subtest_f("%sfence-wait-%s",
896*d83cc019SAndroid Build Coastguard Worker e->exec_id == 0 ? "basic-" : "",
897*d83cc019SAndroid Build Coastguard Worker e->name) {
898*d83cc019SAndroid Build Coastguard Worker gem_require_ring(i915, e->exec_id | e->flags);
899*d83cc019SAndroid Build Coastguard Worker igt_require(gem_can_store_dword(i915, e->exec_id | e->flags));
900*d83cc019SAndroid Build Coastguard Worker
901*d83cc019SAndroid Build Coastguard Worker gem_quiescent_gpu(i915);
902*d83cc019SAndroid Build Coastguard Worker test_fence_wait(i915, vgem, e->exec_id, e->flags);
903*d83cc019SAndroid Build Coastguard Worker }
904*d83cc019SAndroid Build Coastguard Worker }
905*d83cc019SAndroid Build Coastguard Worker
906*d83cc019SAndroid Build Coastguard Worker igt_subtest("basic-fence-flip")
907*d83cc019SAndroid Build Coastguard Worker test_flip(i915, vgem, 0);
908*d83cc019SAndroid Build Coastguard Worker
909*d83cc019SAndroid Build Coastguard Worker igt_subtest_group {
910*d83cc019SAndroid Build Coastguard Worker igt_fixture {
911*d83cc019SAndroid Build Coastguard Worker igt_require(vgem_fence_has_flag(vgem, WIP_VGEM_FENCE_NOTIMEOUT));
912*d83cc019SAndroid Build Coastguard Worker }
913*d83cc019SAndroid Build Coastguard Worker
914*d83cc019SAndroid Build Coastguard Worker igt_subtest("fence-read-hang")
915*d83cc019SAndroid Build Coastguard Worker test_fence_hang(i915, vgem, 0);
916*d83cc019SAndroid Build Coastguard Worker igt_subtest("fence-write-hang")
917*d83cc019SAndroid Build Coastguard Worker test_fence_hang(i915, vgem, VGEM_FENCE_WRITE);
918*d83cc019SAndroid Build Coastguard Worker
919*d83cc019SAndroid Build Coastguard Worker igt_subtest("fence-flip-hang")
920*d83cc019SAndroid Build Coastguard Worker test_flip(i915, vgem, WIP_VGEM_FENCE_NOTIMEOUT);
921*d83cc019SAndroid Build Coastguard Worker }
922*d83cc019SAndroid Build Coastguard Worker }
923*d83cc019SAndroid Build Coastguard Worker
924*d83cc019SAndroid Build Coastguard Worker igt_fixture {
925*d83cc019SAndroid Build Coastguard Worker close(i915);
926*d83cc019SAndroid Build Coastguard Worker close(vgem);
927*d83cc019SAndroid Build Coastguard Worker }
928*d83cc019SAndroid Build Coastguard Worker }
929