1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2012,2013 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 * Chris Wilson <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker *
26*d83cc019SAndroid Build Coastguard Worker */
27*d83cc019SAndroid Build Coastguard Worker
28*d83cc019SAndroid Build Coastguard Worker /* Exercises the basic execbuffer using the handle LUT interface */
29*d83cc019SAndroid Build Coastguard Worker
30*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
31*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
32*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
33*d83cc019SAndroid Build Coastguard Worker #include <string.h>
34*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
35*d83cc019SAndroid Build Coastguard Worker #include <inttypes.h>
36*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
37*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
38*d83cc019SAndroid Build Coastguard Worker #include <sys/time.h>
39*d83cc019SAndroid Build Coastguard Worker #include "drm.h"
40*d83cc019SAndroid Build Coastguard Worker
41*d83cc019SAndroid Build Coastguard Worker IGT_TEST_DESCRIPTION("Exercises the basic execbuffer using the handle LUT"
42*d83cc019SAndroid Build Coastguard Worker " interface.");
43*d83cc019SAndroid Build Coastguard Worker
44*d83cc019SAndroid Build Coastguard Worker #define BATCH_SIZE (1024*1024)
45*d83cc019SAndroid Build Coastguard Worker
46*d83cc019SAndroid Build Coastguard Worker #define LOCAL_I915_EXEC_HANDLE_LUT (1<<12)
47*d83cc019SAndroid Build Coastguard Worker
48*d83cc019SAndroid Build Coastguard Worker #define NORMAL 0
49*d83cc019SAndroid Build Coastguard Worker #define USE_LUT 0x1
50*d83cc019SAndroid Build Coastguard Worker #define BROKEN 0x2
51*d83cc019SAndroid Build Coastguard Worker
exec(int fd,uint32_t handle,unsigned int flags)52*d83cc019SAndroid Build Coastguard Worker static int exec(int fd, uint32_t handle, unsigned int flags)
53*d83cc019SAndroid Build Coastguard Worker {
54*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_execbuffer2 execbuf;
55*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_exec_object2 gem_exec[1];
56*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_relocation_entry gem_reloc[1];
57*d83cc019SAndroid Build Coastguard Worker
58*d83cc019SAndroid Build Coastguard Worker gem_reloc[0].offset = 1024;
59*d83cc019SAndroid Build Coastguard Worker gem_reloc[0].delta = 0;
60*d83cc019SAndroid Build Coastguard Worker gem_reloc[0].target_handle =
61*d83cc019SAndroid Build Coastguard Worker !!(flags & USE_LUT) ^ !!(flags & BROKEN) ? 0 : handle;
62*d83cc019SAndroid Build Coastguard Worker gem_reloc[0].read_domains = I915_GEM_DOMAIN_RENDER;
63*d83cc019SAndroid Build Coastguard Worker gem_reloc[0].write_domain = 0;
64*d83cc019SAndroid Build Coastguard Worker gem_reloc[0].presumed_offset = 0;
65*d83cc019SAndroid Build Coastguard Worker
66*d83cc019SAndroid Build Coastguard Worker gem_exec[0].handle = handle;
67*d83cc019SAndroid Build Coastguard Worker gem_exec[0].relocation_count = 1;
68*d83cc019SAndroid Build Coastguard Worker gem_exec[0].relocs_ptr = to_user_pointer(gem_reloc);
69*d83cc019SAndroid Build Coastguard Worker gem_exec[0].alignment = 0;
70*d83cc019SAndroid Build Coastguard Worker gem_exec[0].offset = 0;
71*d83cc019SAndroid Build Coastguard Worker gem_exec[0].flags = 0;
72*d83cc019SAndroid Build Coastguard Worker gem_exec[0].rsvd1 = 0;
73*d83cc019SAndroid Build Coastguard Worker gem_exec[0].rsvd2 = 0;
74*d83cc019SAndroid Build Coastguard Worker
75*d83cc019SAndroid Build Coastguard Worker execbuf.buffers_ptr = to_user_pointer(gem_exec);
76*d83cc019SAndroid Build Coastguard Worker execbuf.buffer_count = 1;
77*d83cc019SAndroid Build Coastguard Worker execbuf.batch_start_offset = 0;
78*d83cc019SAndroid Build Coastguard Worker execbuf.batch_len = 8;
79*d83cc019SAndroid Build Coastguard Worker execbuf.cliprects_ptr = 0;
80*d83cc019SAndroid Build Coastguard Worker execbuf.num_cliprects = 0;
81*d83cc019SAndroid Build Coastguard Worker execbuf.DR1 = 0;
82*d83cc019SAndroid Build Coastguard Worker execbuf.DR4 = 0;
83*d83cc019SAndroid Build Coastguard Worker execbuf.flags = flags & USE_LUT ? LOCAL_I915_EXEC_HANDLE_LUT : 0;
84*d83cc019SAndroid Build Coastguard Worker i915_execbuffer2_set_context_id(execbuf, 0);
85*d83cc019SAndroid Build Coastguard Worker execbuf.rsvd2 = 0;
86*d83cc019SAndroid Build Coastguard Worker
87*d83cc019SAndroid Build Coastguard Worker return __gem_execbuf(fd, &execbuf);
88*d83cc019SAndroid Build Coastguard Worker }
89*d83cc019SAndroid Build Coastguard Worker
many_exec(int fd,uint32_t batch,int num_exec,int num_reloc,unsigned flags)90*d83cc019SAndroid Build Coastguard Worker static int many_exec(int fd, uint32_t batch, int num_exec, int num_reloc, unsigned flags)
91*d83cc019SAndroid Build Coastguard Worker {
92*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_execbuffer2 execbuf;
93*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_exec_object2 *gem_exec;
94*d83cc019SAndroid Build Coastguard Worker struct drm_i915_gem_relocation_entry *gem_reloc;
95*d83cc019SAndroid Build Coastguard Worker unsigned max_handle = batch;
96*d83cc019SAndroid Build Coastguard Worker int ret, n;
97*d83cc019SAndroid Build Coastguard Worker
98*d83cc019SAndroid Build Coastguard Worker gem_exec = calloc(num_exec+1, sizeof(*gem_exec));
99*d83cc019SAndroid Build Coastguard Worker gem_reloc = calloc(num_reloc, sizeof(*gem_reloc));
100*d83cc019SAndroid Build Coastguard Worker igt_assert(gem_exec && gem_reloc);
101*d83cc019SAndroid Build Coastguard Worker
102*d83cc019SAndroid Build Coastguard Worker for (n = 0; n < num_exec; n++) {
103*d83cc019SAndroid Build Coastguard Worker gem_exec[n].handle = gem_create(fd, 4096);
104*d83cc019SAndroid Build Coastguard Worker if (gem_exec[n].handle > max_handle)
105*d83cc019SAndroid Build Coastguard Worker max_handle = gem_exec[n].handle;
106*d83cc019SAndroid Build Coastguard Worker gem_exec[n].relocation_count = 0;
107*d83cc019SAndroid Build Coastguard Worker gem_exec[n].relocs_ptr = 0;
108*d83cc019SAndroid Build Coastguard Worker gem_exec[n].alignment = 0;
109*d83cc019SAndroid Build Coastguard Worker gem_exec[n].offset = 0;
110*d83cc019SAndroid Build Coastguard Worker gem_exec[n].flags = 0;
111*d83cc019SAndroid Build Coastguard Worker gem_exec[n].rsvd1 = 0;
112*d83cc019SAndroid Build Coastguard Worker gem_exec[n].rsvd2 = 0;
113*d83cc019SAndroid Build Coastguard Worker }
114*d83cc019SAndroid Build Coastguard Worker
115*d83cc019SAndroid Build Coastguard Worker gem_exec[n].handle = batch;
116*d83cc019SAndroid Build Coastguard Worker gem_exec[n].relocation_count = num_reloc;
117*d83cc019SAndroid Build Coastguard Worker gem_exec[n].relocs_ptr = to_user_pointer(gem_reloc);
118*d83cc019SAndroid Build Coastguard Worker
119*d83cc019SAndroid Build Coastguard Worker if (flags & USE_LUT)
120*d83cc019SAndroid Build Coastguard Worker max_handle = num_exec + 1;
121*d83cc019SAndroid Build Coastguard Worker max_handle++;
122*d83cc019SAndroid Build Coastguard Worker
123*d83cc019SAndroid Build Coastguard Worker for (n = 0; n < num_reloc; n++) {
124*d83cc019SAndroid Build Coastguard Worker uint32_t target;
125*d83cc019SAndroid Build Coastguard Worker
126*d83cc019SAndroid Build Coastguard Worker if (flags & BROKEN) {
127*d83cc019SAndroid Build Coastguard Worker target = -(rand() % 4096) - 1;
128*d83cc019SAndroid Build Coastguard Worker } else {
129*d83cc019SAndroid Build Coastguard Worker target = rand() % (num_exec + 1);
130*d83cc019SAndroid Build Coastguard Worker if ((flags & USE_LUT) == 0)
131*d83cc019SAndroid Build Coastguard Worker target = gem_exec[target].handle;
132*d83cc019SAndroid Build Coastguard Worker }
133*d83cc019SAndroid Build Coastguard Worker
134*d83cc019SAndroid Build Coastguard Worker gem_reloc[n].offset = 1024;
135*d83cc019SAndroid Build Coastguard Worker gem_reloc[n].delta = 0;
136*d83cc019SAndroid Build Coastguard Worker gem_reloc[n].target_handle = target;
137*d83cc019SAndroid Build Coastguard Worker gem_reloc[n].read_domains = I915_GEM_DOMAIN_RENDER;
138*d83cc019SAndroid Build Coastguard Worker gem_reloc[n].write_domain = 0;
139*d83cc019SAndroid Build Coastguard Worker gem_reloc[n].presumed_offset = 0;
140*d83cc019SAndroid Build Coastguard Worker }
141*d83cc019SAndroid Build Coastguard Worker
142*d83cc019SAndroid Build Coastguard Worker execbuf.buffers_ptr = to_user_pointer(gem_exec);
143*d83cc019SAndroid Build Coastguard Worker execbuf.buffer_count = num_exec + 1;
144*d83cc019SAndroid Build Coastguard Worker execbuf.batch_start_offset = 0;
145*d83cc019SAndroid Build Coastguard Worker execbuf.batch_len = 8;
146*d83cc019SAndroid Build Coastguard Worker execbuf.cliprects_ptr = 0;
147*d83cc019SAndroid Build Coastguard Worker execbuf.num_cliprects = 0;
148*d83cc019SAndroid Build Coastguard Worker execbuf.DR1 = 0;
149*d83cc019SAndroid Build Coastguard Worker execbuf.DR4 = 0;
150*d83cc019SAndroid Build Coastguard Worker execbuf.flags = flags & USE_LUT ? LOCAL_I915_EXEC_HANDLE_LUT : 0;
151*d83cc019SAndroid Build Coastguard Worker i915_execbuffer2_set_context_id(execbuf, 0);
152*d83cc019SAndroid Build Coastguard Worker execbuf.rsvd2 = 0;
153*d83cc019SAndroid Build Coastguard Worker
154*d83cc019SAndroid Build Coastguard Worker ret = __gem_execbuf(fd, &execbuf);
155*d83cc019SAndroid Build Coastguard Worker
156*d83cc019SAndroid Build Coastguard Worker for (n = 0; n < num_exec; n++)
157*d83cc019SAndroid Build Coastguard Worker gem_close(fd, gem_exec[n].handle);
158*d83cc019SAndroid Build Coastguard Worker
159*d83cc019SAndroid Build Coastguard Worker free(gem_exec);
160*d83cc019SAndroid Build Coastguard Worker free(gem_reloc);
161*d83cc019SAndroid Build Coastguard Worker
162*d83cc019SAndroid Build Coastguard Worker return ret;
163*d83cc019SAndroid Build Coastguard Worker }
164*d83cc019SAndroid Build Coastguard Worker
165*d83cc019SAndroid Build Coastguard Worker #define fail(x) igt_assert((x) == -ENOENT)
166*d83cc019SAndroid Build Coastguard Worker #define pass(x) igt_assert((x) == 0)
167*d83cc019SAndroid Build Coastguard Worker
168*d83cc019SAndroid Build Coastguard Worker igt_simple_main
169*d83cc019SAndroid Build Coastguard Worker {
170*d83cc019SAndroid Build Coastguard Worker uint32_t batch[2] = {MI_BATCH_BUFFER_END};
171*d83cc019SAndroid Build Coastguard Worker uint32_t handle;
172*d83cc019SAndroid Build Coastguard Worker int fd, i;
173*d83cc019SAndroid Build Coastguard Worker
174*d83cc019SAndroid Build Coastguard Worker fd = drm_open_driver(DRIVER_INTEL);
175*d83cc019SAndroid Build Coastguard Worker
176*d83cc019SAndroid Build Coastguard Worker handle = gem_create(fd, 4096);
177*d83cc019SAndroid Build Coastguard Worker gem_write(fd, handle, 0, batch, sizeof(batch));
178*d83cc019SAndroid Build Coastguard Worker
179*d83cc019SAndroid Build Coastguard Worker do_or_die(exec(fd, handle, NORMAL));
180*d83cc019SAndroid Build Coastguard Worker fail(exec(fd, handle, BROKEN));
181*d83cc019SAndroid Build Coastguard Worker
182*d83cc019SAndroid Build Coastguard Worker igt_skip_on(exec(fd, handle, USE_LUT));
183*d83cc019SAndroid Build Coastguard Worker
184*d83cc019SAndroid Build Coastguard Worker do_or_die(exec(fd, handle, USE_LUT));
185*d83cc019SAndroid Build Coastguard Worker fail(exec(fd, handle, USE_LUT | BROKEN));
186*d83cc019SAndroid Build Coastguard Worker
187*d83cc019SAndroid Build Coastguard Worker for (i = 2; i <= SLOW_QUICK(65536, 8); i *= 2) {
188*d83cc019SAndroid Build Coastguard Worker if (many_exec(fd, handle, i+1, i+1, NORMAL) == -ENOSPC)
189*d83cc019SAndroid Build Coastguard Worker break;
190*d83cc019SAndroid Build Coastguard Worker
191*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i-1, i-1, NORMAL));
192*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i-1, i, NORMAL));
193*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i-1, i+1, NORMAL));
194*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i, i-1, NORMAL));
195*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i, i, NORMAL));
196*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i, i+1, NORMAL));
197*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i+1, i-1, NORMAL));
198*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i+1, i, NORMAL));
199*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i+1, i+1, NORMAL));
200*d83cc019SAndroid Build Coastguard Worker
201*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i-1, i-1, NORMAL | BROKEN));
202*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i-1, i, NORMAL | BROKEN));
203*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i-1, i+1, NORMAL | BROKEN));
204*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i, i-1, NORMAL | BROKEN));
205*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i, i, NORMAL | BROKEN));
206*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i, i+1, NORMAL | BROKEN));
207*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i+1, i-1, NORMAL | BROKEN));
208*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i+1, i, NORMAL | BROKEN));
209*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i+1, i+1, NORMAL | BROKEN));
210*d83cc019SAndroid Build Coastguard Worker
211*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i-1, i-1, USE_LUT));
212*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i-1, i, USE_LUT));
213*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i-1, i+1, USE_LUT));
214*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i, i-1, USE_LUT));
215*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i, i, USE_LUT));
216*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i, i+1, USE_LUT));
217*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i+1, i-1, USE_LUT));
218*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i+1, i, USE_LUT));
219*d83cc019SAndroid Build Coastguard Worker pass(many_exec(fd, handle, i+1, i+1, USE_LUT));
220*d83cc019SAndroid Build Coastguard Worker
221*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i-1, i-1, USE_LUT | BROKEN));
222*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i-1, i, USE_LUT | BROKEN));
223*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i-1, i+1, USE_LUT | BROKEN));
224*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i, i-1, USE_LUT | BROKEN));
225*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i, i, USE_LUT | BROKEN));
226*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i, i+1, USE_LUT | BROKEN));
227*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i+1, i-1, USE_LUT | BROKEN));
228*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i+1, i, USE_LUT | BROKEN));
229*d83cc019SAndroid Build Coastguard Worker fail(many_exec(fd, handle, i+1, i+1, USE_LUT | BROKEN));
230*d83cc019SAndroid Build Coastguard Worker }
231*d83cc019SAndroid Build Coastguard Worker }
232