1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2011 Daniel Vetter
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 * Daniel Vetter <[email protected]>
25*d83cc019SAndroid Build Coastguard Worker *
26*d83cc019SAndroid Build Coastguard Worker * Partially based upon gem_tiled_fence_blits.c
27*d83cc019SAndroid Build Coastguard Worker */
28*d83cc019SAndroid Build Coastguard Worker
29*d83cc019SAndroid Build Coastguard Worker /** @file gem_stress.c
30*d83cc019SAndroid Build Coastguard Worker *
31*d83cc019SAndroid Build Coastguard Worker * This is a general gem coherency test. It's designed to eventually replicate
32*d83cc019SAndroid Build Coastguard Worker * any possible sequence of access patterns. It works by copying a set of tiles
33*d83cc019SAndroid Build Coastguard Worker * between two sets of backing buffer objects, randomly permutating the assinged
34*d83cc019SAndroid Build Coastguard Worker * position on each copy operations.
35*d83cc019SAndroid Build Coastguard Worker *
36*d83cc019SAndroid Build Coastguard Worker * The copy operation are done in tiny portions (to reduce any race windows
37*d83cc019SAndroid Build Coastguard Worker * for corruptions, hence increasing the chances for observing one) and are
38*d83cc019SAndroid Build Coastguard Worker * constantly switched between all means to copy stuff (fenced blitter, unfenced
39*d83cc019SAndroid Build Coastguard Worker * render, mmap, pwrite/read).
40*d83cc019SAndroid Build Coastguard Worker *
41*d83cc019SAndroid Build Coastguard Worker * After every complete move of a set tiling parameters of a buffer are randomly
42*d83cc019SAndroid Build Coastguard Worker * changed to simulate the effects of libdrm caching.
43*d83cc019SAndroid Build Coastguard Worker *
44*d83cc019SAndroid Build Coastguard Worker * Buffers are 1mb big to nicely fit into fences on gen2/3. A few are further
45*d83cc019SAndroid Build Coastguard Worker * split up to test relaxed fencing. Using this to push the average working set
46*d83cc019SAndroid Build Coastguard Worker * size over the available gtt space forces objects to be mapped as unfenceable
47*d83cc019SAndroid Build Coastguard Worker * (and as a side-effect tests gtt map/unmap coherency).
48*d83cc019SAndroid Build Coastguard Worker *
49*d83cc019SAndroid Build Coastguard Worker * In short: designed for maximum evilness.
50*d83cc019SAndroid Build Coastguard Worker */
51*d83cc019SAndroid Build Coastguard Worker
52*d83cc019SAndroid Build Coastguard Worker #include "igt.h"
53*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
54*d83cc019SAndroid Build Coastguard Worker #include <sys/ioctl.h>
55*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
56*d83cc019SAndroid Build Coastguard Worker #include <string.h>
57*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
58*d83cc019SAndroid Build Coastguard Worker #include <inttypes.h>
59*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
60*d83cc019SAndroid Build Coastguard Worker #include <sys/stat.h>
61*d83cc019SAndroid Build Coastguard Worker #include <sys/time.h>
62*d83cc019SAndroid Build Coastguard Worker
63*d83cc019SAndroid Build Coastguard Worker #include <drm.h>
64*d83cc019SAndroid Build Coastguard Worker
65*d83cc019SAndroid Build Coastguard Worker #include "intel_bufmgr.h"
66*d83cc019SAndroid Build Coastguard Worker
67*d83cc019SAndroid Build Coastguard Worker IGT_TEST_DESCRIPTION("General gem coherency test.");
68*d83cc019SAndroid Build Coastguard Worker
69*d83cc019SAndroid Build Coastguard Worker #define CMD_POLY_STIPPLE_OFFSET 0x7906
70*d83cc019SAndroid Build Coastguard Worker
71*d83cc019SAndroid Build Coastguard Worker #define DUCTAPE 0xdead0001
72*d83cc019SAndroid Build Coastguard Worker #define TILESZ 0xdead0002
73*d83cc019SAndroid Build Coastguard Worker #define CHCK_RENDER 0xdead0003
74*d83cc019SAndroid Build Coastguard Worker
75*d83cc019SAndroid Build Coastguard Worker /** TODO:
76*d83cc019SAndroid Build Coastguard Worker * - beat on relaxed fencing (i.e. mappable/fenceable tracking in the kernel)
77*d83cc019SAndroid Build Coastguard Worker * - render copy (to check fence tracking and cache coherency management by the
78*d83cc019SAndroid Build Coastguard Worker * kernel)
79*d83cc019SAndroid Build Coastguard Worker * - multi-threading: probably just a wrapper script to launch multiple
80*d83cc019SAndroid Build Coastguard Worker * instances + an option to accordingly reduce the working set
81*d83cc019SAndroid Build Coastguard Worker * - gen6 inter-ring coherency (needs render copy, first)
82*d83cc019SAndroid Build Coastguard Worker * - variable buffer size
83*d83cc019SAndroid Build Coastguard Worker * - add an option to fork a second process that randomly sends signals to the
84*d83cc019SAndroid Build Coastguard Worker * first one (to check consistency of the kernel recovery paths)
85*d83cc019SAndroid Build Coastguard Worker */
86*d83cc019SAndroid Build Coastguard Worker
87*d83cc019SAndroid Build Coastguard Worker drm_intel_bufmgr *bufmgr;
88*d83cc019SAndroid Build Coastguard Worker struct intel_batchbuffer *batch;
89*d83cc019SAndroid Build Coastguard Worker int drm_fd;
90*d83cc019SAndroid Build Coastguard Worker int devid;
91*d83cc019SAndroid Build Coastguard Worker int num_fences;
92*d83cc019SAndroid Build Coastguard Worker
93*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *busy_bo;
94*d83cc019SAndroid Build Coastguard Worker
95*d83cc019SAndroid Build Coastguard Worker struct option_struct {
96*d83cc019SAndroid Build Coastguard Worker unsigned scratch_buf_size;
97*d83cc019SAndroid Build Coastguard Worker unsigned max_dimension;
98*d83cc019SAndroid Build Coastguard Worker unsigned num_buffers;
99*d83cc019SAndroid Build Coastguard Worker int trace_tile;
100*d83cc019SAndroid Build Coastguard Worker int no_hw;
101*d83cc019SAndroid Build Coastguard Worker int gpu_busy_load;
102*d83cc019SAndroid Build Coastguard Worker int use_render;
103*d83cc019SAndroid Build Coastguard Worker int use_blt;
104*d83cc019SAndroid Build Coastguard Worker int forced_tiling;
105*d83cc019SAndroid Build Coastguard Worker int use_cpu_maps;
106*d83cc019SAndroid Build Coastguard Worker int total_rounds;
107*d83cc019SAndroid Build Coastguard Worker int fail;
108*d83cc019SAndroid Build Coastguard Worker int tiles_per_buf;
109*d83cc019SAndroid Build Coastguard Worker int ducttape;
110*d83cc019SAndroid Build Coastguard Worker int tile_size;
111*d83cc019SAndroid Build Coastguard Worker int check_render_cpyfn;
112*d83cc019SAndroid Build Coastguard Worker int use_signal_helper;
113*d83cc019SAndroid Build Coastguard Worker };
114*d83cc019SAndroid Build Coastguard Worker
115*d83cc019SAndroid Build Coastguard Worker #define MAX_BUFS 4096
116*d83cc019SAndroid Build Coastguard Worker #define SCRATCH_BUF_SIZE 1024*1024
117*d83cc019SAndroid Build Coastguard Worker #define BUSY_BUF_SIZE (256*4096)
118*d83cc019SAndroid Build Coastguard Worker #define TILE_BYTES(size) ((size)*(size)*sizeof(uint32_t))
119*d83cc019SAndroid Build Coastguard Worker
120*d83cc019SAndroid Build Coastguard Worker struct option_struct options = {
121*d83cc019SAndroid Build Coastguard Worker .scratch_buf_size = BUSY_BUF_SIZE,
122*d83cc019SAndroid Build Coastguard Worker .no_hw = 0,
123*d83cc019SAndroid Build Coastguard Worker .use_signal_helper = 1,
124*d83cc019SAndroid Build Coastguard Worker .gpu_busy_load = 0,
125*d83cc019SAndroid Build Coastguard Worker .num_buffers = 0,
126*d83cc019SAndroid Build Coastguard Worker .trace_tile = -1,
127*d83cc019SAndroid Build Coastguard Worker .use_render = 1,
128*d83cc019SAndroid Build Coastguard Worker .use_blt = 1,
129*d83cc019SAndroid Build Coastguard Worker .forced_tiling = -1,
130*d83cc019SAndroid Build Coastguard Worker .use_cpu_maps = 0,
131*d83cc019SAndroid Build Coastguard Worker .total_rounds = 512,
132*d83cc019SAndroid Build Coastguard Worker .fail = 1,
133*d83cc019SAndroid Build Coastguard Worker .ducttape = 1,
134*d83cc019SAndroid Build Coastguard Worker .tile_size = 16,
135*d83cc019SAndroid Build Coastguard Worker .tiles_per_buf = BUSY_BUF_SIZE / TILE_BYTES(16),
136*d83cc019SAndroid Build Coastguard Worker .check_render_cpyfn = 0,
137*d83cc019SAndroid Build Coastguard Worker };
138*d83cc019SAndroid Build Coastguard Worker
139*d83cc019SAndroid Build Coastguard Worker static struct igt_buf buffers[2][MAX_BUFS];
140*d83cc019SAndroid Build Coastguard Worker /* tile i is at logical position tile_permutation[i] */
141*d83cc019SAndroid Build Coastguard Worker static unsigned *tile_permutation;
142*d83cc019SAndroid Build Coastguard Worker static unsigned num_buffers = 0;
143*d83cc019SAndroid Build Coastguard Worker static unsigned current_set = 0;
144*d83cc019SAndroid Build Coastguard Worker static unsigned target_set = 0;
145*d83cc019SAndroid Build Coastguard Worker static unsigned num_total_tiles = 0;
146*d83cc019SAndroid Build Coastguard Worker
147*d83cc019SAndroid Build Coastguard Worker int fence_storm = 0;
148*d83cc019SAndroid Build Coastguard Worker static int gpu_busy_load = 10;
149*d83cc019SAndroid Build Coastguard Worker
150*d83cc019SAndroid Build Coastguard Worker struct {
151*d83cc019SAndroid Build Coastguard Worker unsigned num_failed;
152*d83cc019SAndroid Build Coastguard Worker unsigned max_failed_reads;
153*d83cc019SAndroid Build Coastguard Worker } stats;
154*d83cc019SAndroid Build Coastguard Worker
tile2xy(struct igt_buf * buf,unsigned tile,unsigned * x,unsigned * y)155*d83cc019SAndroid Build Coastguard Worker static void tile2xy(struct igt_buf *buf, unsigned tile, unsigned *x, unsigned *y)
156*d83cc019SAndroid Build Coastguard Worker {
157*d83cc019SAndroid Build Coastguard Worker igt_assert(tile < buf->num_tiles);
158*d83cc019SAndroid Build Coastguard Worker *x = (tile*options.tile_size) % (buf->stride/sizeof(uint32_t));
159*d83cc019SAndroid Build Coastguard Worker *y = ((tile*options.tile_size) / (buf->stride/sizeof(uint32_t))) * options.tile_size;
160*d83cc019SAndroid Build Coastguard Worker }
161*d83cc019SAndroid Build Coastguard Worker
emit_blt(drm_intel_bo * src_bo,uint32_t src_tiling,unsigned src_pitch,unsigned src_x,unsigned src_y,unsigned w,unsigned h,drm_intel_bo * dst_bo,uint32_t dst_tiling,unsigned dst_pitch,unsigned dst_x,unsigned dst_y)162*d83cc019SAndroid Build Coastguard Worker static void emit_blt(drm_intel_bo *src_bo, uint32_t src_tiling, unsigned src_pitch,
163*d83cc019SAndroid Build Coastguard Worker unsigned src_x, unsigned src_y, unsigned w, unsigned h,
164*d83cc019SAndroid Build Coastguard Worker drm_intel_bo *dst_bo, uint32_t dst_tiling, unsigned dst_pitch,
165*d83cc019SAndroid Build Coastguard Worker unsigned dst_x, unsigned dst_y)
166*d83cc019SAndroid Build Coastguard Worker {
167*d83cc019SAndroid Build Coastguard Worker uint32_t cmd_bits = 0;
168*d83cc019SAndroid Build Coastguard Worker
169*d83cc019SAndroid Build Coastguard Worker if (IS_965(devid) && src_tiling) {
170*d83cc019SAndroid Build Coastguard Worker src_pitch /= 4;
171*d83cc019SAndroid Build Coastguard Worker cmd_bits |= XY_SRC_COPY_BLT_SRC_TILED;
172*d83cc019SAndroid Build Coastguard Worker }
173*d83cc019SAndroid Build Coastguard Worker
174*d83cc019SAndroid Build Coastguard Worker if (IS_965(devid) && dst_tiling) {
175*d83cc019SAndroid Build Coastguard Worker dst_pitch /= 4;
176*d83cc019SAndroid Build Coastguard Worker cmd_bits |= XY_SRC_COPY_BLT_DST_TILED;
177*d83cc019SAndroid Build Coastguard Worker }
178*d83cc019SAndroid Build Coastguard Worker
179*d83cc019SAndroid Build Coastguard Worker /* copy lower half to upper half */
180*d83cc019SAndroid Build Coastguard Worker BLIT_COPY_BATCH_START(cmd_bits);
181*d83cc019SAndroid Build Coastguard Worker OUT_BATCH((3 << 24) | /* 32 bits */
182*d83cc019SAndroid Build Coastguard Worker (0xcc << 16) | /* copy ROP */
183*d83cc019SAndroid Build Coastguard Worker dst_pitch);
184*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(dst_y << 16 | dst_x);
185*d83cc019SAndroid Build Coastguard Worker OUT_BATCH((dst_y+h) << 16 | (dst_x+w));
186*d83cc019SAndroid Build Coastguard Worker OUT_RELOC_FENCED(dst_bo, I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);
187*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(src_y << 16 | src_x);
188*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(src_pitch);
189*d83cc019SAndroid Build Coastguard Worker OUT_RELOC_FENCED(src_bo, I915_GEM_DOMAIN_RENDER, 0, 0);
190*d83cc019SAndroid Build Coastguard Worker ADVANCE_BATCH();
191*d83cc019SAndroid Build Coastguard Worker
192*d83cc019SAndroid Build Coastguard Worker if (batch->gen >= 6) {
193*d83cc019SAndroid Build Coastguard Worker BEGIN_BATCH(3, 0);
194*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(XY_SETUP_CLIP_BLT_CMD);
195*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
196*d83cc019SAndroid Build Coastguard Worker OUT_BATCH(0);
197*d83cc019SAndroid Build Coastguard Worker ADVANCE_BATCH();
198*d83cc019SAndroid Build Coastguard Worker }
199*d83cc019SAndroid Build Coastguard Worker }
200*d83cc019SAndroid Build Coastguard Worker
201*d83cc019SAndroid Build Coastguard Worker /* All this gem trashing wastes too much cpu time, so give the gpu something to
202*d83cc019SAndroid Build Coastguard Worker * do to increase changes for races. */
keep_gpu_busy(void)203*d83cc019SAndroid Build Coastguard Worker static void keep_gpu_busy(void)
204*d83cc019SAndroid Build Coastguard Worker {
205*d83cc019SAndroid Build Coastguard Worker int tmp;
206*d83cc019SAndroid Build Coastguard Worker
207*d83cc019SAndroid Build Coastguard Worker tmp = 1 << gpu_busy_load;
208*d83cc019SAndroid Build Coastguard Worker igt_assert_lte(tmp, 1024);
209*d83cc019SAndroid Build Coastguard Worker
210*d83cc019SAndroid Build Coastguard Worker emit_blt(busy_bo, 0, 4096, 0, 0, tmp, 128,
211*d83cc019SAndroid Build Coastguard Worker busy_bo, 0, 4096, 0, 128);
212*d83cc019SAndroid Build Coastguard Worker }
213*d83cc019SAndroid Build Coastguard Worker
set_to_cpu_domain(struct igt_buf * buf,int writing)214*d83cc019SAndroid Build Coastguard Worker static void set_to_cpu_domain(struct igt_buf *buf, int writing)
215*d83cc019SAndroid Build Coastguard Worker {
216*d83cc019SAndroid Build Coastguard Worker gem_set_domain(drm_fd, buf->bo->handle, I915_GEM_DOMAIN_CPU,
217*d83cc019SAndroid Build Coastguard Worker writing ? I915_GEM_DOMAIN_CPU : 0);
218*d83cc019SAndroid Build Coastguard Worker }
219*d83cc019SAndroid Build Coastguard Worker
220*d83cc019SAndroid Build Coastguard Worker static unsigned int copyfunc_seq = 0;
221*d83cc019SAndroid Build Coastguard Worker static void (*copyfunc)(struct igt_buf *src, unsigned src_x, unsigned src_y,
222*d83cc019SAndroid Build Coastguard Worker struct igt_buf *dst, unsigned dst_x, unsigned dst_y,
223*d83cc019SAndroid Build Coastguard Worker unsigned logical_tile_no);
224*d83cc019SAndroid Build Coastguard Worker
225*d83cc019SAndroid Build Coastguard Worker /* stride, x, y in units of uint32_t! */
cpucpy2d(uint32_t * src,unsigned src_stride,unsigned src_x,unsigned src_y,uint32_t * dst,unsigned dst_stride,unsigned dst_x,unsigned dst_y,unsigned logical_tile_no)226*d83cc019SAndroid Build Coastguard Worker static void cpucpy2d(uint32_t *src, unsigned src_stride, unsigned src_x, unsigned src_y,
227*d83cc019SAndroid Build Coastguard Worker uint32_t *dst, unsigned dst_stride, unsigned dst_x, unsigned dst_y,
228*d83cc019SAndroid Build Coastguard Worker unsigned logical_tile_no)
229*d83cc019SAndroid Build Coastguard Worker {
230*d83cc019SAndroid Build Coastguard Worker int i, j;
231*d83cc019SAndroid Build Coastguard Worker int failed = 0;
232*d83cc019SAndroid Build Coastguard Worker
233*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < options.tile_size; i++) {
234*d83cc019SAndroid Build Coastguard Worker for (j = 0; j < options.tile_size; j++) {
235*d83cc019SAndroid Build Coastguard Worker unsigned dst_ofs = dst_x + j + dst_stride * (dst_y + i);
236*d83cc019SAndroid Build Coastguard Worker unsigned src_ofs = src_x + j + src_stride * (src_y + i);
237*d83cc019SAndroid Build Coastguard Worker unsigned expect = logical_tile_no*options.tile_size*options.tile_size
238*d83cc019SAndroid Build Coastguard Worker + i*options.tile_size + j;
239*d83cc019SAndroid Build Coastguard Worker uint32_t tmp = src[src_ofs];
240*d83cc019SAndroid Build Coastguard Worker if (tmp != expect) {
241*d83cc019SAndroid Build Coastguard Worker igt_info("mismatch at tile %i pos %i, read %i, expected %i, diff %i\n", logical_tile_no, i * options.tile_size + j, tmp, expect, (int)tmp - expect);
242*d83cc019SAndroid Build Coastguard Worker igt_fail_on(options.trace_tile >= 0 && options.fail);
243*d83cc019SAndroid Build Coastguard Worker failed++;
244*d83cc019SAndroid Build Coastguard Worker }
245*d83cc019SAndroid Build Coastguard Worker /* when not aborting, correct any errors */
246*d83cc019SAndroid Build Coastguard Worker dst[dst_ofs] = expect;
247*d83cc019SAndroid Build Coastguard Worker }
248*d83cc019SAndroid Build Coastguard Worker }
249*d83cc019SAndroid Build Coastguard Worker igt_fail_on(failed && options.fail);
250*d83cc019SAndroid Build Coastguard Worker
251*d83cc019SAndroid Build Coastguard Worker if (failed > stats.max_failed_reads)
252*d83cc019SAndroid Build Coastguard Worker stats.max_failed_reads = failed;
253*d83cc019SAndroid Build Coastguard Worker if (failed)
254*d83cc019SAndroid Build Coastguard Worker stats.num_failed++;
255*d83cc019SAndroid Build Coastguard Worker }
256*d83cc019SAndroid Build Coastguard Worker
cpu_copyfunc(struct igt_buf * src,unsigned src_x,unsigned src_y,struct igt_buf * dst,unsigned dst_x,unsigned dst_y,unsigned logical_tile_no)257*d83cc019SAndroid Build Coastguard Worker static void cpu_copyfunc(struct igt_buf *src, unsigned src_x, unsigned src_y,
258*d83cc019SAndroid Build Coastguard Worker struct igt_buf *dst, unsigned dst_x, unsigned dst_y,
259*d83cc019SAndroid Build Coastguard Worker unsigned logical_tile_no)
260*d83cc019SAndroid Build Coastguard Worker {
261*d83cc019SAndroid Build Coastguard Worker igt_assert(batch->ptr == batch->buffer);
262*d83cc019SAndroid Build Coastguard Worker
263*d83cc019SAndroid Build Coastguard Worker if (options.ducttape)
264*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_wait_rendering(dst->bo);
265*d83cc019SAndroid Build Coastguard Worker
266*d83cc019SAndroid Build Coastguard Worker if (options.use_cpu_maps) {
267*d83cc019SAndroid Build Coastguard Worker set_to_cpu_domain(src, 0);
268*d83cc019SAndroid Build Coastguard Worker set_to_cpu_domain(dst, 1);
269*d83cc019SAndroid Build Coastguard Worker }
270*d83cc019SAndroid Build Coastguard Worker
271*d83cc019SAndroid Build Coastguard Worker cpucpy2d(src->data, src->stride/sizeof(uint32_t), src_x, src_y,
272*d83cc019SAndroid Build Coastguard Worker dst->data, dst->stride/sizeof(uint32_t), dst_x, dst_y,
273*d83cc019SAndroid Build Coastguard Worker logical_tile_no);
274*d83cc019SAndroid Build Coastguard Worker }
275*d83cc019SAndroid Build Coastguard Worker
prw_copyfunc(struct igt_buf * src,unsigned src_x,unsigned src_y,struct igt_buf * dst,unsigned dst_x,unsigned dst_y,unsigned logical_tile_no)276*d83cc019SAndroid Build Coastguard Worker static void prw_copyfunc(struct igt_buf *src, unsigned src_x, unsigned src_y,
277*d83cc019SAndroid Build Coastguard Worker struct igt_buf *dst, unsigned dst_x, unsigned dst_y,
278*d83cc019SAndroid Build Coastguard Worker unsigned logical_tile_no)
279*d83cc019SAndroid Build Coastguard Worker {
280*d83cc019SAndroid Build Coastguard Worker uint32_t tmp_tile[options.tile_size*options.tile_size];
281*d83cc019SAndroid Build Coastguard Worker int i;
282*d83cc019SAndroid Build Coastguard Worker
283*d83cc019SAndroid Build Coastguard Worker igt_assert(batch->ptr == batch->buffer);
284*d83cc019SAndroid Build Coastguard Worker
285*d83cc019SAndroid Build Coastguard Worker if (options.ducttape)
286*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_wait_rendering(dst->bo);
287*d83cc019SAndroid Build Coastguard Worker
288*d83cc019SAndroid Build Coastguard Worker if (src->tiling == I915_TILING_NONE) {
289*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < options.tile_size; i++) {
290*d83cc019SAndroid Build Coastguard Worker unsigned ofs = src_x*sizeof(uint32_t) + src->stride*(src_y + i);
291*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_get_subdata(src->bo, ofs,
292*d83cc019SAndroid Build Coastguard Worker options.tile_size*sizeof(uint32_t),
293*d83cc019SAndroid Build Coastguard Worker tmp_tile + options.tile_size*i);
294*d83cc019SAndroid Build Coastguard Worker }
295*d83cc019SAndroid Build Coastguard Worker } else {
296*d83cc019SAndroid Build Coastguard Worker if (options.use_cpu_maps)
297*d83cc019SAndroid Build Coastguard Worker set_to_cpu_domain(src, 0);
298*d83cc019SAndroid Build Coastguard Worker
299*d83cc019SAndroid Build Coastguard Worker cpucpy2d(src->data, src->stride/sizeof(uint32_t), src_x, src_y,
300*d83cc019SAndroid Build Coastguard Worker tmp_tile, options.tile_size, 0, 0, logical_tile_no);
301*d83cc019SAndroid Build Coastguard Worker }
302*d83cc019SAndroid Build Coastguard Worker
303*d83cc019SAndroid Build Coastguard Worker if (dst->tiling == I915_TILING_NONE) {
304*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < options.tile_size; i++) {
305*d83cc019SAndroid Build Coastguard Worker unsigned ofs = dst_x*sizeof(uint32_t) + dst->stride*(dst_y + i);
306*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_subdata(dst->bo, ofs,
307*d83cc019SAndroid Build Coastguard Worker options.tile_size*sizeof(uint32_t),
308*d83cc019SAndroid Build Coastguard Worker tmp_tile + options.tile_size*i);
309*d83cc019SAndroid Build Coastguard Worker }
310*d83cc019SAndroid Build Coastguard Worker } else {
311*d83cc019SAndroid Build Coastguard Worker if (options.use_cpu_maps)
312*d83cc019SAndroid Build Coastguard Worker set_to_cpu_domain(dst, 1);
313*d83cc019SAndroid Build Coastguard Worker
314*d83cc019SAndroid Build Coastguard Worker cpucpy2d(tmp_tile, options.tile_size, 0, 0,
315*d83cc019SAndroid Build Coastguard Worker dst->data, dst->stride/sizeof(uint32_t), dst_x, dst_y,
316*d83cc019SAndroid Build Coastguard Worker logical_tile_no);
317*d83cc019SAndroid Build Coastguard Worker }
318*d83cc019SAndroid Build Coastguard Worker }
319*d83cc019SAndroid Build Coastguard Worker
blitter_copyfunc(struct igt_buf * src,unsigned src_x,unsigned src_y,struct igt_buf * dst,unsigned dst_x,unsigned dst_y,unsigned logical_tile_no)320*d83cc019SAndroid Build Coastguard Worker static void blitter_copyfunc(struct igt_buf *src, unsigned src_x, unsigned src_y,
321*d83cc019SAndroid Build Coastguard Worker struct igt_buf *dst, unsigned dst_x, unsigned dst_y,
322*d83cc019SAndroid Build Coastguard Worker unsigned logical_tile_no)
323*d83cc019SAndroid Build Coastguard Worker {
324*d83cc019SAndroid Build Coastguard Worker static unsigned keep_gpu_busy_counter = 0;
325*d83cc019SAndroid Build Coastguard Worker
326*d83cc019SAndroid Build Coastguard Worker /* check both edges of the fence usage */
327*d83cc019SAndroid Build Coastguard Worker if (keep_gpu_busy_counter & 1 && !fence_storm)
328*d83cc019SAndroid Build Coastguard Worker keep_gpu_busy();
329*d83cc019SAndroid Build Coastguard Worker
330*d83cc019SAndroid Build Coastguard Worker emit_blt(src->bo, src->tiling, src->stride, src_x, src_y,
331*d83cc019SAndroid Build Coastguard Worker options.tile_size, options.tile_size,
332*d83cc019SAndroid Build Coastguard Worker dst->bo, dst->tiling, dst->stride, dst_x, dst_y);
333*d83cc019SAndroid Build Coastguard Worker
334*d83cc019SAndroid Build Coastguard Worker if (!(keep_gpu_busy_counter & 1) && !fence_storm)
335*d83cc019SAndroid Build Coastguard Worker keep_gpu_busy();
336*d83cc019SAndroid Build Coastguard Worker
337*d83cc019SAndroid Build Coastguard Worker keep_gpu_busy_counter++;
338*d83cc019SAndroid Build Coastguard Worker
339*d83cc019SAndroid Build Coastguard Worker if (src->tiling)
340*d83cc019SAndroid Build Coastguard Worker fence_storm--;
341*d83cc019SAndroid Build Coastguard Worker if (dst->tiling)
342*d83cc019SAndroid Build Coastguard Worker fence_storm--;
343*d83cc019SAndroid Build Coastguard Worker
344*d83cc019SAndroid Build Coastguard Worker if (fence_storm <= 1) {
345*d83cc019SAndroid Build Coastguard Worker fence_storm = 0;
346*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush(batch);
347*d83cc019SAndroid Build Coastguard Worker }
348*d83cc019SAndroid Build Coastguard Worker }
349*d83cc019SAndroid Build Coastguard Worker
render_copyfunc(struct igt_buf * src,unsigned src_x,unsigned src_y,struct igt_buf * dst,unsigned dst_x,unsigned dst_y,unsigned logical_tile_no)350*d83cc019SAndroid Build Coastguard Worker static void render_copyfunc(struct igt_buf *src, unsigned src_x, unsigned src_y,
351*d83cc019SAndroid Build Coastguard Worker struct igt_buf *dst, unsigned dst_x, unsigned dst_y,
352*d83cc019SAndroid Build Coastguard Worker unsigned logical_tile_no)
353*d83cc019SAndroid Build Coastguard Worker {
354*d83cc019SAndroid Build Coastguard Worker static unsigned keep_gpu_busy_counter = 0;
355*d83cc019SAndroid Build Coastguard Worker igt_render_copyfunc_t rendercopy = igt_get_render_copyfunc(devid);
356*d83cc019SAndroid Build Coastguard Worker
357*d83cc019SAndroid Build Coastguard Worker /* check both edges of the fence usage */
358*d83cc019SAndroid Build Coastguard Worker if (keep_gpu_busy_counter & 1)
359*d83cc019SAndroid Build Coastguard Worker keep_gpu_busy();
360*d83cc019SAndroid Build Coastguard Worker
361*d83cc019SAndroid Build Coastguard Worker if (rendercopy) {
362*d83cc019SAndroid Build Coastguard Worker /*
363*d83cc019SAndroid Build Coastguard Worker * Flush outstanding blts so that they don't end up on
364*d83cc019SAndroid Build Coastguard Worker * the render ring when that's not allowed (gen6+).
365*d83cc019SAndroid Build Coastguard Worker */
366*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush(batch);
367*d83cc019SAndroid Build Coastguard Worker rendercopy(batch, NULL, src, src_x, src_y,
368*d83cc019SAndroid Build Coastguard Worker options.tile_size, options.tile_size,
369*d83cc019SAndroid Build Coastguard Worker dst, dst_x, dst_y);
370*d83cc019SAndroid Build Coastguard Worker } else
371*d83cc019SAndroid Build Coastguard Worker blitter_copyfunc(src, src_x, src_y,
372*d83cc019SAndroid Build Coastguard Worker dst, dst_x, dst_y,
373*d83cc019SAndroid Build Coastguard Worker logical_tile_no);
374*d83cc019SAndroid Build Coastguard Worker if (!(keep_gpu_busy_counter & 1))
375*d83cc019SAndroid Build Coastguard Worker keep_gpu_busy();
376*d83cc019SAndroid Build Coastguard Worker
377*d83cc019SAndroid Build Coastguard Worker keep_gpu_busy_counter++;
378*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush(batch);
379*d83cc019SAndroid Build Coastguard Worker }
380*d83cc019SAndroid Build Coastguard Worker
next_copyfunc(int tile)381*d83cc019SAndroid Build Coastguard Worker static void next_copyfunc(int tile)
382*d83cc019SAndroid Build Coastguard Worker {
383*d83cc019SAndroid Build Coastguard Worker if (fence_storm) {
384*d83cc019SAndroid Build Coastguard Worker if (tile == options.trace_tile)
385*d83cc019SAndroid Build Coastguard Worker igt_info(" using fence storm\n");
386*d83cc019SAndroid Build Coastguard Worker return;
387*d83cc019SAndroid Build Coastguard Worker }
388*d83cc019SAndroid Build Coastguard Worker
389*d83cc019SAndroid Build Coastguard Worker if (copyfunc_seq % 61 == 0
390*d83cc019SAndroid Build Coastguard Worker && options.forced_tiling != I915_TILING_NONE) {
391*d83cc019SAndroid Build Coastguard Worker if (tile == options.trace_tile)
392*d83cc019SAndroid Build Coastguard Worker igt_info(" using fence storm\n");
393*d83cc019SAndroid Build Coastguard Worker fence_storm = num_fences;
394*d83cc019SAndroid Build Coastguard Worker copyfunc = blitter_copyfunc;
395*d83cc019SAndroid Build Coastguard Worker } else if (copyfunc_seq % 17 == 0) {
396*d83cc019SAndroid Build Coastguard Worker if (tile == options.trace_tile)
397*d83cc019SAndroid Build Coastguard Worker igt_info(" using cpu\n");
398*d83cc019SAndroid Build Coastguard Worker copyfunc = cpu_copyfunc;
399*d83cc019SAndroid Build Coastguard Worker } else if (copyfunc_seq % 19 == 0) {
400*d83cc019SAndroid Build Coastguard Worker if (tile == options.trace_tile)
401*d83cc019SAndroid Build Coastguard Worker igt_info(" using prw\n");
402*d83cc019SAndroid Build Coastguard Worker copyfunc = prw_copyfunc;
403*d83cc019SAndroid Build Coastguard Worker } else if (copyfunc_seq % 3 == 0 && options.use_render) {
404*d83cc019SAndroid Build Coastguard Worker if (tile == options.trace_tile)
405*d83cc019SAndroid Build Coastguard Worker igt_info(" using render\n");
406*d83cc019SAndroid Build Coastguard Worker copyfunc = render_copyfunc;
407*d83cc019SAndroid Build Coastguard Worker } else if (options.use_blt){
408*d83cc019SAndroid Build Coastguard Worker if (tile == options.trace_tile)
409*d83cc019SAndroid Build Coastguard Worker igt_info(" using blitter\n");
410*d83cc019SAndroid Build Coastguard Worker copyfunc = blitter_copyfunc;
411*d83cc019SAndroid Build Coastguard Worker } else if (options.use_render){
412*d83cc019SAndroid Build Coastguard Worker if (tile == options.trace_tile)
413*d83cc019SAndroid Build Coastguard Worker igt_info(" using render\n");
414*d83cc019SAndroid Build Coastguard Worker copyfunc = render_copyfunc;
415*d83cc019SAndroid Build Coastguard Worker } else {
416*d83cc019SAndroid Build Coastguard Worker copyfunc = cpu_copyfunc;
417*d83cc019SAndroid Build Coastguard Worker }
418*d83cc019SAndroid Build Coastguard Worker
419*d83cc019SAndroid Build Coastguard Worker copyfunc_seq++;
420*d83cc019SAndroid Build Coastguard Worker }
421*d83cc019SAndroid Build Coastguard Worker
fan_out(void)422*d83cc019SAndroid Build Coastguard Worker static void fan_out(void)
423*d83cc019SAndroid Build Coastguard Worker {
424*d83cc019SAndroid Build Coastguard Worker uint32_t tmp_tile[options.tile_size*options.tile_size];
425*d83cc019SAndroid Build Coastguard Worker uint32_t seq = 0;
426*d83cc019SAndroid Build Coastguard Worker int i, k;
427*d83cc019SAndroid Build Coastguard Worker unsigned tile, buf_idx, x, y;
428*d83cc019SAndroid Build Coastguard Worker
429*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < num_total_tiles; i++) {
430*d83cc019SAndroid Build Coastguard Worker tile = i;
431*d83cc019SAndroid Build Coastguard Worker buf_idx = tile / options.tiles_per_buf;
432*d83cc019SAndroid Build Coastguard Worker tile %= options.tiles_per_buf;
433*d83cc019SAndroid Build Coastguard Worker
434*d83cc019SAndroid Build Coastguard Worker tile2xy(&buffers[current_set][buf_idx], tile, &x, &y);
435*d83cc019SAndroid Build Coastguard Worker
436*d83cc019SAndroid Build Coastguard Worker for (k = 0; k < options.tile_size*options.tile_size; k++)
437*d83cc019SAndroid Build Coastguard Worker tmp_tile[k] = seq++;
438*d83cc019SAndroid Build Coastguard Worker
439*d83cc019SAndroid Build Coastguard Worker if (options.use_cpu_maps)
440*d83cc019SAndroid Build Coastguard Worker set_to_cpu_domain(&buffers[current_set][buf_idx], 1);
441*d83cc019SAndroid Build Coastguard Worker
442*d83cc019SAndroid Build Coastguard Worker cpucpy2d(tmp_tile, options.tile_size, 0, 0,
443*d83cc019SAndroid Build Coastguard Worker buffers[current_set][buf_idx].data,
444*d83cc019SAndroid Build Coastguard Worker buffers[current_set][buf_idx].stride / sizeof(uint32_t),
445*d83cc019SAndroid Build Coastguard Worker x, y, i);
446*d83cc019SAndroid Build Coastguard Worker }
447*d83cc019SAndroid Build Coastguard Worker
448*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < num_total_tiles; i++)
449*d83cc019SAndroid Build Coastguard Worker tile_permutation[i] = i;
450*d83cc019SAndroid Build Coastguard Worker }
451*d83cc019SAndroid Build Coastguard Worker
fan_in_and_check(void)452*d83cc019SAndroid Build Coastguard Worker static void fan_in_and_check(void)
453*d83cc019SAndroid Build Coastguard Worker {
454*d83cc019SAndroid Build Coastguard Worker uint32_t tmp_tile[options.tile_size*options.tile_size];
455*d83cc019SAndroid Build Coastguard Worker unsigned tile, buf_idx, x, y;
456*d83cc019SAndroid Build Coastguard Worker int i;
457*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < num_total_tiles; i++) {
458*d83cc019SAndroid Build Coastguard Worker tile = tile_permutation[i];
459*d83cc019SAndroid Build Coastguard Worker buf_idx = tile / options.tiles_per_buf;
460*d83cc019SAndroid Build Coastguard Worker tile %= options.tiles_per_buf;
461*d83cc019SAndroid Build Coastguard Worker
462*d83cc019SAndroid Build Coastguard Worker tile2xy(&buffers[current_set][buf_idx], tile, &x, &y);
463*d83cc019SAndroid Build Coastguard Worker
464*d83cc019SAndroid Build Coastguard Worker if (options.use_cpu_maps)
465*d83cc019SAndroid Build Coastguard Worker set_to_cpu_domain(&buffers[current_set][buf_idx], 0);
466*d83cc019SAndroid Build Coastguard Worker
467*d83cc019SAndroid Build Coastguard Worker cpucpy2d(buffers[current_set][buf_idx].data,
468*d83cc019SAndroid Build Coastguard Worker buffers[current_set][buf_idx].stride / sizeof(uint32_t),
469*d83cc019SAndroid Build Coastguard Worker x, y,
470*d83cc019SAndroid Build Coastguard Worker tmp_tile, options.tile_size, 0, 0,
471*d83cc019SAndroid Build Coastguard Worker i);
472*d83cc019SAndroid Build Coastguard Worker }
473*d83cc019SAndroid Build Coastguard Worker }
474*d83cc019SAndroid Build Coastguard Worker
sanitize_stride(struct igt_buf * buf)475*d83cc019SAndroid Build Coastguard Worker static void sanitize_stride(struct igt_buf *buf)
476*d83cc019SAndroid Build Coastguard Worker {
477*d83cc019SAndroid Build Coastguard Worker
478*d83cc019SAndroid Build Coastguard Worker if (igt_buf_height(buf) > options.max_dimension)
479*d83cc019SAndroid Build Coastguard Worker buf->stride = buf->size / options.max_dimension;
480*d83cc019SAndroid Build Coastguard Worker
481*d83cc019SAndroid Build Coastguard Worker if (igt_buf_height(buf) < options.tile_size)
482*d83cc019SAndroid Build Coastguard Worker buf->stride = buf->size / options.tile_size;
483*d83cc019SAndroid Build Coastguard Worker
484*d83cc019SAndroid Build Coastguard Worker if (igt_buf_width(buf) < options.tile_size)
485*d83cc019SAndroid Build Coastguard Worker buf->stride = options.tile_size * sizeof(uint32_t);
486*d83cc019SAndroid Build Coastguard Worker
487*d83cc019SAndroid Build Coastguard Worker igt_assert(buf->stride <= 8192);
488*d83cc019SAndroid Build Coastguard Worker igt_assert(igt_buf_width(buf) <= options.max_dimension);
489*d83cc019SAndroid Build Coastguard Worker igt_assert(igt_buf_height(buf) <= options.max_dimension);
490*d83cc019SAndroid Build Coastguard Worker
491*d83cc019SAndroid Build Coastguard Worker igt_assert(igt_buf_width(buf) >= options.tile_size);
492*d83cc019SAndroid Build Coastguard Worker igt_assert(igt_buf_height(buf) >= options.tile_size);
493*d83cc019SAndroid Build Coastguard Worker
494*d83cc019SAndroid Build Coastguard Worker }
495*d83cc019SAndroid Build Coastguard Worker
init_buffer(struct igt_buf * buf,unsigned size)496*d83cc019SAndroid Build Coastguard Worker static void init_buffer(struct igt_buf *buf, unsigned size)
497*d83cc019SAndroid Build Coastguard Worker {
498*d83cc019SAndroid Build Coastguard Worker memset(buf, 0, sizeof(*buf));
499*d83cc019SAndroid Build Coastguard Worker
500*d83cc019SAndroid Build Coastguard Worker buf->bo = drm_intel_bo_alloc(bufmgr, "tiled bo", size, 4096);
501*d83cc019SAndroid Build Coastguard Worker buf->size = size;
502*d83cc019SAndroid Build Coastguard Worker igt_assert(buf->bo);
503*d83cc019SAndroid Build Coastguard Worker buf->tiling = I915_TILING_NONE;
504*d83cc019SAndroid Build Coastguard Worker buf->stride = 4096;
505*d83cc019SAndroid Build Coastguard Worker buf->bpp = 32;
506*d83cc019SAndroid Build Coastguard Worker
507*d83cc019SAndroid Build Coastguard Worker sanitize_stride(buf);
508*d83cc019SAndroid Build Coastguard Worker
509*d83cc019SAndroid Build Coastguard Worker if (options.no_hw)
510*d83cc019SAndroid Build Coastguard Worker buf->data = malloc(size);
511*d83cc019SAndroid Build Coastguard Worker else {
512*d83cc019SAndroid Build Coastguard Worker if (options.use_cpu_maps)
513*d83cc019SAndroid Build Coastguard Worker drm_intel_bo_map(buf->bo, 1);
514*d83cc019SAndroid Build Coastguard Worker else
515*d83cc019SAndroid Build Coastguard Worker drm_intel_gem_bo_map_gtt(buf->bo);
516*d83cc019SAndroid Build Coastguard Worker buf->data = buf->bo->virtual;
517*d83cc019SAndroid Build Coastguard Worker }
518*d83cc019SAndroid Build Coastguard Worker
519*d83cc019SAndroid Build Coastguard Worker buf->num_tiles = options.tiles_per_buf;
520*d83cc019SAndroid Build Coastguard Worker }
521*d83cc019SAndroid Build Coastguard Worker
exchange_buf(void * array,unsigned i,unsigned j)522*d83cc019SAndroid Build Coastguard Worker static void exchange_buf(void *array, unsigned i, unsigned j)
523*d83cc019SAndroid Build Coastguard Worker {
524*d83cc019SAndroid Build Coastguard Worker struct igt_buf *buf_arr, tmp;
525*d83cc019SAndroid Build Coastguard Worker buf_arr = array;
526*d83cc019SAndroid Build Coastguard Worker
527*d83cc019SAndroid Build Coastguard Worker memcpy(&tmp, &buf_arr[i], sizeof(struct igt_buf));
528*d83cc019SAndroid Build Coastguard Worker memcpy(&buf_arr[i], &buf_arr[j], sizeof(struct igt_buf));
529*d83cc019SAndroid Build Coastguard Worker memcpy(&buf_arr[j], &tmp, sizeof(struct igt_buf));
530*d83cc019SAndroid Build Coastguard Worker }
531*d83cc019SAndroid Build Coastguard Worker
532*d83cc019SAndroid Build Coastguard Worker
init_set(unsigned set)533*d83cc019SAndroid Build Coastguard Worker static void init_set(unsigned set)
534*d83cc019SAndroid Build Coastguard Worker {
535*d83cc019SAndroid Build Coastguard Worker long int r;
536*d83cc019SAndroid Build Coastguard Worker int i;
537*d83cc019SAndroid Build Coastguard Worker
538*d83cc019SAndroid Build Coastguard Worker igt_permute_array(buffers[set], num_buffers, exchange_buf);
539*d83cc019SAndroid Build Coastguard Worker
540*d83cc019SAndroid Build Coastguard Worker if (current_set == 1 && options.gpu_busy_load == 0) {
541*d83cc019SAndroid Build Coastguard Worker gpu_busy_load++;
542*d83cc019SAndroid Build Coastguard Worker if (gpu_busy_load > 10)
543*d83cc019SAndroid Build Coastguard Worker gpu_busy_load = 6;
544*d83cc019SAndroid Build Coastguard Worker }
545*d83cc019SAndroid Build Coastguard Worker
546*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < num_buffers; i++) {
547*d83cc019SAndroid Build Coastguard Worker r = random();
548*d83cc019SAndroid Build Coastguard Worker if ((r & 3) != 0)
549*d83cc019SAndroid Build Coastguard Worker continue;
550*d83cc019SAndroid Build Coastguard Worker r >>= 2;
551*d83cc019SAndroid Build Coastguard Worker
552*d83cc019SAndroid Build Coastguard Worker if ((r & 3) != 0)
553*d83cc019SAndroid Build Coastguard Worker buffers[set][i].tiling = I915_TILING_X;
554*d83cc019SAndroid Build Coastguard Worker else
555*d83cc019SAndroid Build Coastguard Worker buffers[set][i].tiling = I915_TILING_NONE;
556*d83cc019SAndroid Build Coastguard Worker r >>= 2;
557*d83cc019SAndroid Build Coastguard Worker if (options.forced_tiling >= 0)
558*d83cc019SAndroid Build Coastguard Worker buffers[set][i].tiling = options.forced_tiling;
559*d83cc019SAndroid Build Coastguard Worker
560*d83cc019SAndroid Build Coastguard Worker if (buffers[set][i].tiling == I915_TILING_NONE) {
561*d83cc019SAndroid Build Coastguard Worker /* min 64 byte stride */
562*d83cc019SAndroid Build Coastguard Worker r %= 8;
563*d83cc019SAndroid Build Coastguard Worker buffers[set][i].stride = 64 * (1 << r);
564*d83cc019SAndroid Build Coastguard Worker } else if (IS_GEN2(devid)) {
565*d83cc019SAndroid Build Coastguard Worker /* min 128 byte stride */
566*d83cc019SAndroid Build Coastguard Worker r %= 7;
567*d83cc019SAndroid Build Coastguard Worker buffers[set][i].stride = 128 * (1 << r);
568*d83cc019SAndroid Build Coastguard Worker } else {
569*d83cc019SAndroid Build Coastguard Worker /* min 512 byte stride */
570*d83cc019SAndroid Build Coastguard Worker r %= 5;
571*d83cc019SAndroid Build Coastguard Worker buffers[set][i].stride = 512 * (1 << r);
572*d83cc019SAndroid Build Coastguard Worker }
573*d83cc019SAndroid Build Coastguard Worker
574*d83cc019SAndroid Build Coastguard Worker sanitize_stride(&buffers[set][i]);
575*d83cc019SAndroid Build Coastguard Worker
576*d83cc019SAndroid Build Coastguard Worker gem_set_tiling(drm_fd, buffers[set][i].bo->handle,
577*d83cc019SAndroid Build Coastguard Worker buffers[set][i].tiling,
578*d83cc019SAndroid Build Coastguard Worker buffers[set][i].stride);
579*d83cc019SAndroid Build Coastguard Worker
580*d83cc019SAndroid Build Coastguard Worker if (options.trace_tile != -1 && i == options.trace_tile/options.tiles_per_buf)
581*d83cc019SAndroid Build Coastguard Worker igt_info("changing buffer %i containing tile %i: tiling %i, stride %i\n", i, options.trace_tile, buffers[set][i].tiling, buffers[set][i].stride);
582*d83cc019SAndroid Build Coastguard Worker }
583*d83cc019SAndroid Build Coastguard Worker }
584*d83cc019SAndroid Build Coastguard Worker
exchange_uint(void * array,unsigned i,unsigned j)585*d83cc019SAndroid Build Coastguard Worker static void exchange_uint(void *array, unsigned i, unsigned j)
586*d83cc019SAndroid Build Coastguard Worker {
587*d83cc019SAndroid Build Coastguard Worker unsigned *i_arr = array;
588*d83cc019SAndroid Build Coastguard Worker
589*d83cc019SAndroid Build Coastguard Worker igt_swap(i_arr[i], i_arr[j]);
590*d83cc019SAndroid Build Coastguard Worker }
591*d83cc019SAndroid Build Coastguard Worker
copy_tiles(unsigned * permutation)592*d83cc019SAndroid Build Coastguard Worker static void copy_tiles(unsigned *permutation)
593*d83cc019SAndroid Build Coastguard Worker {
594*d83cc019SAndroid Build Coastguard Worker unsigned src_tile, src_buf_idx, src_x, src_y;
595*d83cc019SAndroid Build Coastguard Worker unsigned dst_tile, dst_buf_idx, dst_x, dst_y;
596*d83cc019SAndroid Build Coastguard Worker struct igt_buf *src_buf, *dst_buf;
597*d83cc019SAndroid Build Coastguard Worker int i, idx;
598*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < num_total_tiles; i++) {
599*d83cc019SAndroid Build Coastguard Worker /* tile_permutation is independent of current_permutation, so
600*d83cc019SAndroid Build Coastguard Worker * abuse it to randomize the order of the src bos */
601*d83cc019SAndroid Build Coastguard Worker idx = tile_permutation[i];
602*d83cc019SAndroid Build Coastguard Worker src_buf_idx = idx / options.tiles_per_buf;
603*d83cc019SAndroid Build Coastguard Worker src_tile = idx % options.tiles_per_buf;
604*d83cc019SAndroid Build Coastguard Worker src_buf = &buffers[current_set][src_buf_idx];
605*d83cc019SAndroid Build Coastguard Worker
606*d83cc019SAndroid Build Coastguard Worker tile2xy(src_buf, src_tile, &src_x, &src_y);
607*d83cc019SAndroid Build Coastguard Worker
608*d83cc019SAndroid Build Coastguard Worker dst_buf_idx = permutation[idx] / options.tiles_per_buf;
609*d83cc019SAndroid Build Coastguard Worker dst_tile = permutation[idx] % options.tiles_per_buf;
610*d83cc019SAndroid Build Coastguard Worker dst_buf = &buffers[target_set][dst_buf_idx];
611*d83cc019SAndroid Build Coastguard Worker
612*d83cc019SAndroid Build Coastguard Worker tile2xy(dst_buf, dst_tile, &dst_x, &dst_y);
613*d83cc019SAndroid Build Coastguard Worker
614*d83cc019SAndroid Build Coastguard Worker if (options.trace_tile == i)
615*d83cc019SAndroid Build Coastguard Worker igt_info("copying tile %i from %i (%i, %i) to %i (%i, %i)", i, tile_permutation[i], src_buf_idx, src_tile, permutation[idx], dst_buf_idx, dst_tile);
616*d83cc019SAndroid Build Coastguard Worker
617*d83cc019SAndroid Build Coastguard Worker if (options.no_hw) {
618*d83cc019SAndroid Build Coastguard Worker cpucpy2d(src_buf->data,
619*d83cc019SAndroid Build Coastguard Worker src_buf->stride / sizeof(uint32_t),
620*d83cc019SAndroid Build Coastguard Worker src_x, src_y,
621*d83cc019SAndroid Build Coastguard Worker dst_buf->data,
622*d83cc019SAndroid Build Coastguard Worker dst_buf->stride / sizeof(uint32_t),
623*d83cc019SAndroid Build Coastguard Worker dst_x, dst_y,
624*d83cc019SAndroid Build Coastguard Worker i);
625*d83cc019SAndroid Build Coastguard Worker } else {
626*d83cc019SAndroid Build Coastguard Worker next_copyfunc(i);
627*d83cc019SAndroid Build Coastguard Worker
628*d83cc019SAndroid Build Coastguard Worker copyfunc(src_buf, src_x, src_y, dst_buf, dst_x, dst_y,
629*d83cc019SAndroid Build Coastguard Worker i);
630*d83cc019SAndroid Build Coastguard Worker }
631*d83cc019SAndroid Build Coastguard Worker }
632*d83cc019SAndroid Build Coastguard Worker
633*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_flush(batch);
634*d83cc019SAndroid Build Coastguard Worker }
635*d83cc019SAndroid Build Coastguard Worker
sanitize_tiles_per_buf(void)636*d83cc019SAndroid Build Coastguard Worker static void sanitize_tiles_per_buf(void)
637*d83cc019SAndroid Build Coastguard Worker {
638*d83cc019SAndroid Build Coastguard Worker if (options.tiles_per_buf > options.scratch_buf_size / TILE_BYTES(options.tile_size))
639*d83cc019SAndroid Build Coastguard Worker options.tiles_per_buf = options.scratch_buf_size / TILE_BYTES(options.tile_size);
640*d83cc019SAndroid Build Coastguard Worker }
641*d83cc019SAndroid Build Coastguard Worker
parse_options(int opt,int opt_index,void * data)642*d83cc019SAndroid Build Coastguard Worker static int parse_options(int opt, int opt_index, void *data)
643*d83cc019SAndroid Build Coastguard Worker {
644*d83cc019SAndroid Build Coastguard Worker int tmp;
645*d83cc019SAndroid Build Coastguard Worker
646*d83cc019SAndroid Build Coastguard Worker switch(opt) {
647*d83cc019SAndroid Build Coastguard Worker case 'd':
648*d83cc019SAndroid Build Coastguard Worker options.no_hw = 1;
649*d83cc019SAndroid Build Coastguard Worker igt_info("no-hw debug mode\n");
650*d83cc019SAndroid Build Coastguard Worker break;
651*d83cc019SAndroid Build Coastguard Worker case 'S':
652*d83cc019SAndroid Build Coastguard Worker options.use_signal_helper = 0;
653*d83cc019SAndroid Build Coastguard Worker igt_info("disabling that pesky nuisance who keeps interrupting us\n");
654*d83cc019SAndroid Build Coastguard Worker break;
655*d83cc019SAndroid Build Coastguard Worker case 's':
656*d83cc019SAndroid Build Coastguard Worker tmp = atoi(optarg);
657*d83cc019SAndroid Build Coastguard Worker if (tmp < options.tile_size*8192)
658*d83cc019SAndroid Build Coastguard Worker igt_info("scratch buffer size needs to be at least %i\n", options.tile_size * 8192);
659*d83cc019SAndroid Build Coastguard Worker else if (tmp & (tmp - 1)) {
660*d83cc019SAndroid Build Coastguard Worker igt_info("scratch buffer size needs to be a power-of-two\n");
661*d83cc019SAndroid Build Coastguard Worker } else {
662*d83cc019SAndroid Build Coastguard Worker igt_info("fixed scratch buffer size to %u\n", tmp);
663*d83cc019SAndroid Build Coastguard Worker options.scratch_buf_size = tmp;
664*d83cc019SAndroid Build Coastguard Worker sanitize_tiles_per_buf();
665*d83cc019SAndroid Build Coastguard Worker }
666*d83cc019SAndroid Build Coastguard Worker break;
667*d83cc019SAndroid Build Coastguard Worker case 'g':
668*d83cc019SAndroid Build Coastguard Worker tmp = atoi(optarg);
669*d83cc019SAndroid Build Coastguard Worker if (tmp < 0 || tmp > 10)
670*d83cc019SAndroid Build Coastguard Worker igt_info("gpu busy load needs to be bigger than 0 and smaller than 10\n");
671*d83cc019SAndroid Build Coastguard Worker else {
672*d83cc019SAndroid Build Coastguard Worker igt_info("gpu busy load factor set to %i\n", tmp);
673*d83cc019SAndroid Build Coastguard Worker gpu_busy_load = options.gpu_busy_load = tmp;
674*d83cc019SAndroid Build Coastguard Worker }
675*d83cc019SAndroid Build Coastguard Worker break;
676*d83cc019SAndroid Build Coastguard Worker case 'c':
677*d83cc019SAndroid Build Coastguard Worker options.num_buffers = atoi(optarg);
678*d83cc019SAndroid Build Coastguard Worker igt_info("buffer count set to %i\n", options.num_buffers);
679*d83cc019SAndroid Build Coastguard Worker break;
680*d83cc019SAndroid Build Coastguard Worker case 't':
681*d83cc019SAndroid Build Coastguard Worker options.trace_tile = atoi(optarg);
682*d83cc019SAndroid Build Coastguard Worker igt_info("tracing tile %i\n", options.trace_tile);
683*d83cc019SAndroid Build Coastguard Worker break;
684*d83cc019SAndroid Build Coastguard Worker case 'r':
685*d83cc019SAndroid Build Coastguard Worker options.use_render = 0;
686*d83cc019SAndroid Build Coastguard Worker igt_info("disabling render copy\n");
687*d83cc019SAndroid Build Coastguard Worker break;
688*d83cc019SAndroid Build Coastguard Worker case 'b':
689*d83cc019SAndroid Build Coastguard Worker options.use_blt = 0;
690*d83cc019SAndroid Build Coastguard Worker igt_info("disabling blt copy\n");
691*d83cc019SAndroid Build Coastguard Worker break;
692*d83cc019SAndroid Build Coastguard Worker case 'u':
693*d83cc019SAndroid Build Coastguard Worker options.forced_tiling = I915_TILING_NONE;
694*d83cc019SAndroid Build Coastguard Worker igt_info("disabling tiling\n");
695*d83cc019SAndroid Build Coastguard Worker break;
696*d83cc019SAndroid Build Coastguard Worker case 'x':
697*d83cc019SAndroid Build Coastguard Worker if (options.use_cpu_maps) {
698*d83cc019SAndroid Build Coastguard Worker igt_info("tiling not possible with cpu maps\n");
699*d83cc019SAndroid Build Coastguard Worker } else {
700*d83cc019SAndroid Build Coastguard Worker options.forced_tiling = I915_TILING_X;
701*d83cc019SAndroid Build Coastguard Worker igt_info("using only X-tiling\n");
702*d83cc019SAndroid Build Coastguard Worker }
703*d83cc019SAndroid Build Coastguard Worker break;
704*d83cc019SAndroid Build Coastguard Worker case 'm':
705*d83cc019SAndroid Build Coastguard Worker options.use_cpu_maps = 1;
706*d83cc019SAndroid Build Coastguard Worker options.forced_tiling = I915_TILING_NONE;
707*d83cc019SAndroid Build Coastguard Worker igt_info("disabling tiling\n");
708*d83cc019SAndroid Build Coastguard Worker break;
709*d83cc019SAndroid Build Coastguard Worker case 'o':
710*d83cc019SAndroid Build Coastguard Worker options.total_rounds = atoi(optarg);
711*d83cc019SAndroid Build Coastguard Worker igt_info("total rounds %i\n", options.total_rounds);
712*d83cc019SAndroid Build Coastguard Worker break;
713*d83cc019SAndroid Build Coastguard Worker case 'f':
714*d83cc019SAndroid Build Coastguard Worker options.fail = 0;
715*d83cc019SAndroid Build Coastguard Worker igt_info("not failing when detecting errors\n");
716*d83cc019SAndroid Build Coastguard Worker break;
717*d83cc019SAndroid Build Coastguard Worker case 'p':
718*d83cc019SAndroid Build Coastguard Worker options.tiles_per_buf = atoi(optarg);
719*d83cc019SAndroid Build Coastguard Worker igt_info("tiles per buffer %i\n", options.tiles_per_buf);
720*d83cc019SAndroid Build Coastguard Worker break;
721*d83cc019SAndroid Build Coastguard Worker case DUCTAPE:
722*d83cc019SAndroid Build Coastguard Worker options.ducttape = 0;
723*d83cc019SAndroid Build Coastguard Worker igt_info("applying duct-tape\n");
724*d83cc019SAndroid Build Coastguard Worker break;
725*d83cc019SAndroid Build Coastguard Worker case TILESZ:
726*d83cc019SAndroid Build Coastguard Worker options.tile_size = atoi(optarg);
727*d83cc019SAndroid Build Coastguard Worker sanitize_tiles_per_buf();
728*d83cc019SAndroid Build Coastguard Worker igt_info("til size %i\n", options.tile_size);
729*d83cc019SAndroid Build Coastguard Worker break;
730*d83cc019SAndroid Build Coastguard Worker case CHCK_RENDER:
731*d83cc019SAndroid Build Coastguard Worker options.check_render_cpyfn = 1;
732*d83cc019SAndroid Build Coastguard Worker igt_info("checking render copy function\n");
733*d83cc019SAndroid Build Coastguard Worker break;
734*d83cc019SAndroid Build Coastguard Worker default:
735*d83cc019SAndroid Build Coastguard Worker return IGT_OPT_HANDLER_ERROR;
736*d83cc019SAndroid Build Coastguard Worker }
737*d83cc019SAndroid Build Coastguard Worker
738*d83cc019SAndroid Build Coastguard Worker /* actually 32767, according to docs, but that kills our nice pot calculations. */
739*d83cc019SAndroid Build Coastguard Worker options.max_dimension = 16*1024;
740*d83cc019SAndroid Build Coastguard Worker if (options.use_render) {
741*d83cc019SAndroid Build Coastguard Worker if (IS_GEN2(devid) || IS_GEN3(devid))
742*d83cc019SAndroid Build Coastguard Worker options.max_dimension = 2048;
743*d83cc019SAndroid Build Coastguard Worker else
744*d83cc019SAndroid Build Coastguard Worker options.max_dimension = 8192;
745*d83cc019SAndroid Build Coastguard Worker }
746*d83cc019SAndroid Build Coastguard Worker igt_info("Limiting buffer to %dx%d\n", options.max_dimension, options.max_dimension);
747*d83cc019SAndroid Build Coastguard Worker
748*d83cc019SAndroid Build Coastguard Worker return IGT_OPT_HANDLER_SUCCESS;
749*d83cc019SAndroid Build Coastguard Worker }
750*d83cc019SAndroid Build Coastguard Worker
init(void)751*d83cc019SAndroid Build Coastguard Worker static void init(void)
752*d83cc019SAndroid Build Coastguard Worker {
753*d83cc019SAndroid Build Coastguard Worker int i;
754*d83cc019SAndroid Build Coastguard Worker unsigned tmp;
755*d83cc019SAndroid Build Coastguard Worker
756*d83cc019SAndroid Build Coastguard Worker if (options.num_buffers == 0) {
757*d83cc019SAndroid Build Coastguard Worker tmp = gem_aperture_size(drm_fd);
758*d83cc019SAndroid Build Coastguard Worker tmp = min(256 * (1024 * 1024), tmp);
759*d83cc019SAndroid Build Coastguard Worker num_buffers = 2 * tmp / options.scratch_buf_size / 3;
760*d83cc019SAndroid Build Coastguard Worker num_buffers /= 2;
761*d83cc019SAndroid Build Coastguard Worker igt_info("using %u buffers\n", num_buffers);
762*d83cc019SAndroid Build Coastguard Worker } else
763*d83cc019SAndroid Build Coastguard Worker num_buffers = options.num_buffers;
764*d83cc019SAndroid Build Coastguard Worker
765*d83cc019SAndroid Build Coastguard Worker bufmgr = drm_intel_bufmgr_gem_init(drm_fd, 4096);
766*d83cc019SAndroid Build Coastguard Worker drm_intel_bufmgr_gem_enable_reuse(bufmgr);
767*d83cc019SAndroid Build Coastguard Worker drm_intel_bufmgr_gem_enable_fenced_relocs(bufmgr);
768*d83cc019SAndroid Build Coastguard Worker num_fences = gem_available_fences(drm_fd);
769*d83cc019SAndroid Build Coastguard Worker igt_assert_lt(4, num_fences);
770*d83cc019SAndroid Build Coastguard Worker batch = intel_batchbuffer_alloc(bufmgr, devid);
771*d83cc019SAndroid Build Coastguard Worker
772*d83cc019SAndroid Build Coastguard Worker busy_bo = drm_intel_bo_alloc(bufmgr, "tiled bo", BUSY_BUF_SIZE, 4096);
773*d83cc019SAndroid Build Coastguard Worker if (options.forced_tiling >= 0)
774*d83cc019SAndroid Build Coastguard Worker gem_set_tiling(drm_fd, busy_bo->handle, options.forced_tiling, 4096);
775*d83cc019SAndroid Build Coastguard Worker
776*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < num_buffers; i++) {
777*d83cc019SAndroid Build Coastguard Worker init_buffer(&buffers[0][i], options.scratch_buf_size);
778*d83cc019SAndroid Build Coastguard Worker init_buffer(&buffers[1][i], options.scratch_buf_size);
779*d83cc019SAndroid Build Coastguard Worker
780*d83cc019SAndroid Build Coastguard Worker num_total_tiles += buffers[0][i].num_tiles;
781*d83cc019SAndroid Build Coastguard Worker }
782*d83cc019SAndroid Build Coastguard Worker current_set = 0;
783*d83cc019SAndroid Build Coastguard Worker
784*d83cc019SAndroid Build Coastguard Worker /* just in case it helps reproducability */
785*d83cc019SAndroid Build Coastguard Worker srandom(0xdeadbeef);
786*d83cc019SAndroid Build Coastguard Worker }
787*d83cc019SAndroid Build Coastguard Worker
check_render_copyfunc(void)788*d83cc019SAndroid Build Coastguard Worker static void check_render_copyfunc(void)
789*d83cc019SAndroid Build Coastguard Worker {
790*d83cc019SAndroid Build Coastguard Worker struct igt_buf src, dst;
791*d83cc019SAndroid Build Coastguard Worker uint32_t *ptr;
792*d83cc019SAndroid Build Coastguard Worker int i, j, pass;
793*d83cc019SAndroid Build Coastguard Worker
794*d83cc019SAndroid Build Coastguard Worker if (!options.check_render_cpyfn)
795*d83cc019SAndroid Build Coastguard Worker return;
796*d83cc019SAndroid Build Coastguard Worker
797*d83cc019SAndroid Build Coastguard Worker init_buffer(&src, options.scratch_buf_size);
798*d83cc019SAndroid Build Coastguard Worker init_buffer(&dst, options.scratch_buf_size);
799*d83cc019SAndroid Build Coastguard Worker
800*d83cc019SAndroid Build Coastguard Worker for (pass = 0; pass < 16; pass++) {
801*d83cc019SAndroid Build Coastguard Worker int sx = random() % (igt_buf_width(&src)-options.tile_size);
802*d83cc019SAndroid Build Coastguard Worker int sy = random() % (igt_buf_height(&src)-options.tile_size);
803*d83cc019SAndroid Build Coastguard Worker int dx = random() % (igt_buf_width(&dst)-options.tile_size);
804*d83cc019SAndroid Build Coastguard Worker int dy = random() % (igt_buf_height(&dst)-options.tile_size);
805*d83cc019SAndroid Build Coastguard Worker
806*d83cc019SAndroid Build Coastguard Worker if (options.use_cpu_maps)
807*d83cc019SAndroid Build Coastguard Worker set_to_cpu_domain(&src, 1);
808*d83cc019SAndroid Build Coastguard Worker
809*d83cc019SAndroid Build Coastguard Worker memset(src.data, 0xff, options.scratch_buf_size);
810*d83cc019SAndroid Build Coastguard Worker for (j = 0; j < options.tile_size; j++) {
811*d83cc019SAndroid Build Coastguard Worker ptr = (uint32_t*)((char *)src.data + sx*4 + (sy+j) * src.stride);
812*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < options.tile_size; i++)
813*d83cc019SAndroid Build Coastguard Worker ptr[i] = j * options.tile_size + i;
814*d83cc019SAndroid Build Coastguard Worker }
815*d83cc019SAndroid Build Coastguard Worker
816*d83cc019SAndroid Build Coastguard Worker render_copyfunc(&src, sx, sy, &dst, dx, dy, 0);
817*d83cc019SAndroid Build Coastguard Worker
818*d83cc019SAndroid Build Coastguard Worker if (options.use_cpu_maps)
819*d83cc019SAndroid Build Coastguard Worker set_to_cpu_domain(&dst, 0);
820*d83cc019SAndroid Build Coastguard Worker
821*d83cc019SAndroid Build Coastguard Worker for (j = 0; j < options.tile_size; j++) {
822*d83cc019SAndroid Build Coastguard Worker ptr = (uint32_t*)((char *)dst.data + dx*4 + (dy+j) * dst.stride);
823*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < options.tile_size; i++)
824*d83cc019SAndroid Build Coastguard Worker if (ptr[i] != j * options.tile_size + i) {
825*d83cc019SAndroid Build Coastguard Worker igt_info("render copyfunc mismatch at (%d, %d): found %d, expected %d\n", i, j, ptr[i], j * options.tile_size + i);
826*d83cc019SAndroid Build Coastguard Worker }
827*d83cc019SAndroid Build Coastguard Worker }
828*d83cc019SAndroid Build Coastguard Worker }
829*d83cc019SAndroid Build Coastguard Worker }
830*d83cc019SAndroid Build Coastguard Worker
831*d83cc019SAndroid Build Coastguard Worker static struct option long_options[] = {
832*d83cc019SAndroid Build Coastguard Worker {"no-hw", 0, 0, 'd'},
833*d83cc019SAndroid Build Coastguard Worker {"buf-size", 1, 0, 's'},
834*d83cc019SAndroid Build Coastguard Worker {"gpu-busy-load", 1, 0, 'g'},
835*d83cc019SAndroid Build Coastguard Worker {"no-signals", 0, 0, 'S'},
836*d83cc019SAndroid Build Coastguard Worker {"buffer-count", 1, 0, 'c'},
837*d83cc019SAndroid Build Coastguard Worker {"trace-tile", 1, 0, 't'},
838*d83cc019SAndroid Build Coastguard Worker {"disable-blt", 0, 0, 'b'},
839*d83cc019SAndroid Build Coastguard Worker {"disable-render", 0, 0, 'r'},
840*d83cc019SAndroid Build Coastguard Worker {"untiled", 0, 0, 'u'},
841*d83cc019SAndroid Build Coastguard Worker {"x-tiled", 0, 0, 'x'},
842*d83cc019SAndroid Build Coastguard Worker {"use-cpu-maps", 0, 0, 'm'},
843*d83cc019SAndroid Build Coastguard Worker {"rounds", 1, 0, 'o'},
844*d83cc019SAndroid Build Coastguard Worker {"no-fail", 0, 0, 'f'},
845*d83cc019SAndroid Build Coastguard Worker {"tiles-per-buf", 0, 0, 'p'},
846*d83cc019SAndroid Build Coastguard Worker {"remove-duct-tape", 0, 0, DUCTAPE},
847*d83cc019SAndroid Build Coastguard Worker {"tile-size", 1, 0, TILESZ},
848*d83cc019SAndroid Build Coastguard Worker {"check-render-cpyfn", 0, 0, CHCK_RENDER},
849*d83cc019SAndroid Build Coastguard Worker {NULL, 0, 0, 0},
850*d83cc019SAndroid Build Coastguard Worker };
851*d83cc019SAndroid Build Coastguard Worker
852*d83cc019SAndroid Build Coastguard Worker igt_simple_main_args("ds:g:c:t:rbuxmo:fp:",
853*d83cc019SAndroid Build Coastguard Worker long_options, NULL, parse_options, NULL)
854*d83cc019SAndroid Build Coastguard Worker {
855*d83cc019SAndroid Build Coastguard Worker int i, j;
856*d83cc019SAndroid Build Coastguard Worker unsigned *current_permutation, *tmp_permutation;
857*d83cc019SAndroid Build Coastguard Worker
858*d83cc019SAndroid Build Coastguard Worker drm_fd = drm_open_driver(DRIVER_INTEL);
859*d83cc019SAndroid Build Coastguard Worker devid = intel_get_drm_devid(drm_fd);
860*d83cc019SAndroid Build Coastguard Worker
861*d83cc019SAndroid Build Coastguard Worker /* start our little helper early before too may allocations occur */
862*d83cc019SAndroid Build Coastguard Worker if (options.use_signal_helper)
863*d83cc019SAndroid Build Coastguard Worker igt_fork_signal_helper();
864*d83cc019SAndroid Build Coastguard Worker
865*d83cc019SAndroid Build Coastguard Worker init();
866*d83cc019SAndroid Build Coastguard Worker
867*d83cc019SAndroid Build Coastguard Worker check_render_copyfunc();
868*d83cc019SAndroid Build Coastguard Worker
869*d83cc019SAndroid Build Coastguard Worker tile_permutation = malloc(num_total_tiles*sizeof(uint32_t));
870*d83cc019SAndroid Build Coastguard Worker current_permutation = malloc(num_total_tiles*sizeof(uint32_t));
871*d83cc019SAndroid Build Coastguard Worker tmp_permutation = malloc(num_total_tiles*sizeof(uint32_t));
872*d83cc019SAndroid Build Coastguard Worker igt_assert(tile_permutation);
873*d83cc019SAndroid Build Coastguard Worker igt_assert(current_permutation);
874*d83cc019SAndroid Build Coastguard Worker igt_assert(tmp_permutation);
875*d83cc019SAndroid Build Coastguard Worker
876*d83cc019SAndroid Build Coastguard Worker fan_out();
877*d83cc019SAndroid Build Coastguard Worker
878*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < options.total_rounds; i++) {
879*d83cc019SAndroid Build Coastguard Worker igt_info("round %i\n", i);
880*d83cc019SAndroid Build Coastguard Worker if (i % 64 == 63) {
881*d83cc019SAndroid Build Coastguard Worker fan_in_and_check();
882*d83cc019SAndroid Build Coastguard Worker igt_info("everything correct after %i rounds\n", i + 1);
883*d83cc019SAndroid Build Coastguard Worker }
884*d83cc019SAndroid Build Coastguard Worker
885*d83cc019SAndroid Build Coastguard Worker target_set = (current_set + 1) & 1;
886*d83cc019SAndroid Build Coastguard Worker init_set(target_set);
887*d83cc019SAndroid Build Coastguard Worker
888*d83cc019SAndroid Build Coastguard Worker for (j = 0; j < num_total_tiles; j++)
889*d83cc019SAndroid Build Coastguard Worker current_permutation[j] = j;
890*d83cc019SAndroid Build Coastguard Worker igt_permute_array(current_permutation, num_total_tiles, exchange_uint);
891*d83cc019SAndroid Build Coastguard Worker
892*d83cc019SAndroid Build Coastguard Worker copy_tiles(current_permutation);
893*d83cc019SAndroid Build Coastguard Worker
894*d83cc019SAndroid Build Coastguard Worker memcpy(tmp_permutation, tile_permutation, sizeof(unsigned)*num_total_tiles);
895*d83cc019SAndroid Build Coastguard Worker
896*d83cc019SAndroid Build Coastguard Worker /* accumulate the permutations */
897*d83cc019SAndroid Build Coastguard Worker for (j = 0; j < num_total_tiles; j++)
898*d83cc019SAndroid Build Coastguard Worker tile_permutation[j] = current_permutation[tmp_permutation[j]];
899*d83cc019SAndroid Build Coastguard Worker
900*d83cc019SAndroid Build Coastguard Worker current_set = target_set;
901*d83cc019SAndroid Build Coastguard Worker }
902*d83cc019SAndroid Build Coastguard Worker
903*d83cc019SAndroid Build Coastguard Worker fan_in_and_check();
904*d83cc019SAndroid Build Coastguard Worker
905*d83cc019SAndroid Build Coastguard Worker igt_info("num failed tiles %u, max incoherent bytes %zd\n", stats.num_failed, stats.max_failed_reads * sizeof(uint32_t));
906*d83cc019SAndroid Build Coastguard Worker
907*d83cc019SAndroid Build Coastguard Worker intel_batchbuffer_free(batch);
908*d83cc019SAndroid Build Coastguard Worker drm_intel_bufmgr_destroy(bufmgr);
909*d83cc019SAndroid Build Coastguard Worker
910*d83cc019SAndroid Build Coastguard Worker close(drm_fd);
911*d83cc019SAndroid Build Coastguard Worker
912*d83cc019SAndroid Build Coastguard Worker igt_stop_signal_helper();
913*d83cc019SAndroid Build Coastguard Worker }
914