1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2014 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker *
4*d83cc019SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker *
11*d83cc019SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker * Software.
14*d83cc019SAndroid Build Coastguard Worker *
15*d83cc019SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21*d83cc019SAndroid Build Coastguard Worker * DEALINGS IN THE SOFTWARE.
22*d83cc019SAndroid Build Coastguard Worker *
23*d83cc019SAndroid Build Coastguard Worker */
24*d83cc019SAndroid Build Coastguard Worker
25*d83cc019SAndroid Build Coastguard Worker #include <assert.h>
26*d83cc019SAndroid Build Coastguard Worker #include <fcntl.h>
27*d83cc019SAndroid Build Coastguard Worker #include <getopt.h>
28*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
29*d83cc019SAndroid Build Coastguard Worker #include <signal.h>
30*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
31*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
32*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
33*d83cc019SAndroid Build Coastguard Worker #include <err.h>
34*d83cc019SAndroid Build Coastguard Worker #include <string.h>
35*d83cc019SAndroid Build Coastguard Worker #include "intel_chipset.h"
36*d83cc019SAndroid Build Coastguard Worker #include "intel_io.h"
37*d83cc019SAndroid Build Coastguard Worker #include "intel_reg.h"
38*d83cc019SAndroid Build Coastguard Worker #include "igt_debugfs.h"
39*d83cc019SAndroid Build Coastguard Worker #include "drmtest.h"
40*d83cc019SAndroid Build Coastguard Worker #include "igt_aux.h"
41*d83cc019SAndroid Build Coastguard Worker
42*d83cc019SAndroid Build Coastguard Worker enum test {
43*d83cc019SAndroid Build Coastguard Worker TEST_INVALID,
44*d83cc019SAndroid Build Coastguard Worker TEST_PIPESTAT,
45*d83cc019SAndroid Build Coastguard Worker TEST_IIR,
46*d83cc019SAndroid Build Coastguard Worker TEST_IIR_GEN2,
47*d83cc019SAndroid Build Coastguard Worker TEST_IIR_GEN3,
48*d83cc019SAndroid Build Coastguard Worker TEST_DEIIR,
49*d83cc019SAndroid Build Coastguard Worker TEST_FRAMECOUNT,
50*d83cc019SAndroid Build Coastguard Worker TEST_FRAMECOUNT_GEN3,
51*d83cc019SAndroid Build Coastguard Worker TEST_FRAMECOUNT_G4X,
52*d83cc019SAndroid Build Coastguard Worker TEST_FLIPCOUNT,
53*d83cc019SAndroid Build Coastguard Worker TEST_PAN,
54*d83cc019SAndroid Build Coastguard Worker TEST_FLIP,
55*d83cc019SAndroid Build Coastguard Worker TEST_SURFLIVE,
56*d83cc019SAndroid Build Coastguard Worker TEST_WRAP,
57*d83cc019SAndroid Build Coastguard Worker TEST_FIELD,
58*d83cc019SAndroid Build Coastguard Worker };
59*d83cc019SAndroid Build Coastguard Worker
60*d83cc019SAndroid Build Coastguard Worker static uint32_t vlv_offset;
61*d83cc019SAndroid Build Coastguard Worker static uint16_t pipe_offset[3] = { 0, 0x1000, 0x2000, };
62*d83cc019SAndroid Build Coastguard Worker
63*d83cc019SAndroid Build Coastguard Worker #define PIPE_REG(pipe, reg_a) (pipe_offset[(pipe)] + (reg_a))
64*d83cc019SAndroid Build Coastguard Worker
65*d83cc019SAndroid Build Coastguard Worker static volatile bool quit;
66*d83cc019SAndroid Build Coastguard Worker
sighandler(int x)67*d83cc019SAndroid Build Coastguard Worker static void sighandler(int x)
68*d83cc019SAndroid Build Coastguard Worker {
69*d83cc019SAndroid Build Coastguard Worker quit = true;
70*d83cc019SAndroid Build Coastguard Worker }
71*d83cc019SAndroid Build Coastguard Worker
read_reg_16(uint32_t reg)72*d83cc019SAndroid Build Coastguard Worker static uint16_t read_reg_16(uint32_t reg)
73*d83cc019SAndroid Build Coastguard Worker {
74*d83cc019SAndroid Build Coastguard Worker return INREG16(vlv_offset + reg);
75*d83cc019SAndroid Build Coastguard Worker }
76*d83cc019SAndroid Build Coastguard Worker
read_reg(uint32_t reg)77*d83cc019SAndroid Build Coastguard Worker static uint32_t read_reg(uint32_t reg)
78*d83cc019SAndroid Build Coastguard Worker {
79*d83cc019SAndroid Build Coastguard Worker return INREG(vlv_offset + reg);
80*d83cc019SAndroid Build Coastguard Worker }
81*d83cc019SAndroid Build Coastguard Worker
write_reg_16(uint32_t reg,uint16_t val)82*d83cc019SAndroid Build Coastguard Worker static void write_reg_16(uint32_t reg, uint16_t val)
83*d83cc019SAndroid Build Coastguard Worker {
84*d83cc019SAndroid Build Coastguard Worker OUTREG16(vlv_offset + reg, val);
85*d83cc019SAndroid Build Coastguard Worker }
86*d83cc019SAndroid Build Coastguard Worker
write_reg(uint32_t reg,uint32_t val)87*d83cc019SAndroid Build Coastguard Worker static void write_reg(uint32_t reg, uint32_t val)
88*d83cc019SAndroid Build Coastguard Worker {
89*d83cc019SAndroid Build Coastguard Worker OUTREG(vlv_offset + reg, val);
90*d83cc019SAndroid Build Coastguard Worker }
91*d83cc019SAndroid Build Coastguard Worker
pipe_name(int pipe)92*d83cc019SAndroid Build Coastguard Worker static char pipe_name(int pipe)
93*d83cc019SAndroid Build Coastguard Worker {
94*d83cc019SAndroid Build Coastguard Worker return pipe + 'A';
95*d83cc019SAndroid Build Coastguard Worker }
96*d83cc019SAndroid Build Coastguard Worker
pipe_to_plane(uint32_t devid,int pipe)97*d83cc019SAndroid Build Coastguard Worker static int pipe_to_plane(uint32_t devid, int pipe)
98*d83cc019SAndroid Build Coastguard Worker {
99*d83cc019SAndroid Build Coastguard Worker if (!IS_GEN2(devid) && !IS_GEN3(devid))
100*d83cc019SAndroid Build Coastguard Worker return pipe;
101*d83cc019SAndroid Build Coastguard Worker
102*d83cc019SAndroid Build Coastguard Worker switch (pipe) {
103*d83cc019SAndroid Build Coastguard Worker case 0:
104*d83cc019SAndroid Build Coastguard Worker if ((read_reg(DSPACNTR) & DISPPLANE_SEL_PIPE_MASK) == DISPPLANE_SEL_PIPE_A)
105*d83cc019SAndroid Build Coastguard Worker return 0;
106*d83cc019SAndroid Build Coastguard Worker if ((read_reg(DSPBCNTR) & DISPPLANE_SEL_PIPE_MASK) == DISPPLANE_SEL_PIPE_A)
107*d83cc019SAndroid Build Coastguard Worker return 1;
108*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "no plane assigned to pipe %c, assuming %c\n",
109*d83cc019SAndroid Build Coastguard Worker pipe_name(pipe), pipe_name(pipe));
110*d83cc019SAndroid Build Coastguard Worker return pipe;
111*d83cc019SAndroid Build Coastguard Worker case 1:
112*d83cc019SAndroid Build Coastguard Worker if ((read_reg(DSPACNTR) & DISPPLANE_SEL_PIPE_MASK) == DISPPLANE_SEL_PIPE_B)
113*d83cc019SAndroid Build Coastguard Worker return 0;
114*d83cc019SAndroid Build Coastguard Worker if ((read_reg(DSPBCNTR) & DISPPLANE_SEL_PIPE_MASK) == DISPPLANE_SEL_PIPE_B)
115*d83cc019SAndroid Build Coastguard Worker return 1;
116*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "no plane assigned to pipe %c, assuming %c\n",
117*d83cc019SAndroid Build Coastguard Worker pipe_name(pipe), pipe_name(pipe));
118*d83cc019SAndroid Build Coastguard Worker return pipe;
119*d83cc019SAndroid Build Coastguard Worker }
120*d83cc019SAndroid Build Coastguard Worker
121*d83cc019SAndroid Build Coastguard Worker assert(0);
122*d83cc019SAndroid Build Coastguard Worker
123*d83cc019SAndroid Build Coastguard Worker return 0;
124*d83cc019SAndroid Build Coastguard Worker }
125*d83cc019SAndroid Build Coastguard Worker
dspoffset_reg(uint32_t devid,int pipe)126*d83cc019SAndroid Build Coastguard Worker static uint32_t dspoffset_reg(uint32_t devid, int pipe)
127*d83cc019SAndroid Build Coastguard Worker {
128*d83cc019SAndroid Build Coastguard Worker bool use_tileoff;
129*d83cc019SAndroid Build Coastguard Worker int plane = pipe_to_plane(devid, pipe);
130*d83cc019SAndroid Build Coastguard Worker
131*d83cc019SAndroid Build Coastguard Worker if (IS_GEN2(devid) || IS_GEN3(devid))
132*d83cc019SAndroid Build Coastguard Worker use_tileoff = false;
133*d83cc019SAndroid Build Coastguard Worker else if (IS_HASWELL(devid) || IS_BROADWELL(devid))
134*d83cc019SAndroid Build Coastguard Worker use_tileoff = true;
135*d83cc019SAndroid Build Coastguard Worker else
136*d83cc019SAndroid Build Coastguard Worker use_tileoff = read_reg(PIPE_REG(plane, DSPACNTR)) & DISPLAY_PLANE_TILED;
137*d83cc019SAndroid Build Coastguard Worker
138*d83cc019SAndroid Build Coastguard Worker if (use_tileoff)
139*d83cc019SAndroid Build Coastguard Worker return PIPE_REG(plane, DSPATILEOFF);
140*d83cc019SAndroid Build Coastguard Worker else
141*d83cc019SAndroid Build Coastguard Worker return PIPE_REG(plane, DSPABASE);
142*d83cc019SAndroid Build Coastguard Worker }
143*d83cc019SAndroid Build Coastguard Worker
dspsurf_reg(uint32_t devid,int pipe)144*d83cc019SAndroid Build Coastguard Worker static uint32_t dspsurf_reg(uint32_t devid, int pipe)
145*d83cc019SAndroid Build Coastguard Worker {
146*d83cc019SAndroid Build Coastguard Worker int plane = pipe_to_plane(devid, pipe);
147*d83cc019SAndroid Build Coastguard Worker
148*d83cc019SAndroid Build Coastguard Worker if (IS_GEN2(devid) || IS_GEN3(devid))
149*d83cc019SAndroid Build Coastguard Worker return PIPE_REG(plane, DSPABASE);
150*d83cc019SAndroid Build Coastguard Worker else
151*d83cc019SAndroid Build Coastguard Worker return PIPE_REG(plane, DSPASURF);
152*d83cc019SAndroid Build Coastguard Worker }
153*d83cc019SAndroid Build Coastguard Worker
poll_pixel_pipestat(int pipe,int bit,uint32_t * min,uint32_t * max,const int count)154*d83cc019SAndroid Build Coastguard Worker static void poll_pixel_pipestat(int pipe, int bit, uint32_t *min, uint32_t *max, const int count)
155*d83cc019SAndroid Build Coastguard Worker {
156*d83cc019SAndroid Build Coastguard Worker uint32_t pix, pix1, pix2, iir, iir1, iir2, iir_bit, iir_mask;
157*d83cc019SAndroid Build Coastguard Worker int i = 0;
158*d83cc019SAndroid Build Coastguard Worker
159*d83cc019SAndroid Build Coastguard Worker pix = PIPE_REG(pipe, PIPEAFRAMEPIXEL);
160*d83cc019SAndroid Build Coastguard Worker iir_bit = 1 << bit;
161*d83cc019SAndroid Build Coastguard Worker iir = PIPE_REG(pipe, PIPEASTAT);
162*d83cc019SAndroid Build Coastguard Worker
163*d83cc019SAndroid Build Coastguard Worker iir_mask = read_reg(iir) & 0x7fff0000;
164*d83cc019SAndroid Build Coastguard Worker
165*d83cc019SAndroid Build Coastguard Worker write_reg(iir, iir_mask | iir_bit);
166*d83cc019SAndroid Build Coastguard Worker
167*d83cc019SAndroid Build Coastguard Worker while (!quit) {
168*d83cc019SAndroid Build Coastguard Worker pix1 = read_reg(pix);
169*d83cc019SAndroid Build Coastguard Worker iir1 = read_reg(iir);
170*d83cc019SAndroid Build Coastguard Worker iir2 = read_reg(iir);
171*d83cc019SAndroid Build Coastguard Worker pix2 = read_reg(pix);
172*d83cc019SAndroid Build Coastguard Worker
173*d83cc019SAndroid Build Coastguard Worker if (!(iir2 & iir_bit))
174*d83cc019SAndroid Build Coastguard Worker continue;
175*d83cc019SAndroid Build Coastguard Worker
176*d83cc019SAndroid Build Coastguard Worker if (iir1 & iir_bit) {
177*d83cc019SAndroid Build Coastguard Worker write_reg(iir, iir_mask | iir_bit);
178*d83cc019SAndroid Build Coastguard Worker continue;
179*d83cc019SAndroid Build Coastguard Worker }
180*d83cc019SAndroid Build Coastguard Worker
181*d83cc019SAndroid Build Coastguard Worker pix1 &= PIPE_PIXEL_MASK;
182*d83cc019SAndroid Build Coastguard Worker pix2 &= PIPE_PIXEL_MASK;
183*d83cc019SAndroid Build Coastguard Worker
184*d83cc019SAndroid Build Coastguard Worker min[i] = pix1;
185*d83cc019SAndroid Build Coastguard Worker max[i] = pix2;
186*d83cc019SAndroid Build Coastguard Worker if (++i >= count)
187*d83cc019SAndroid Build Coastguard Worker break;
188*d83cc019SAndroid Build Coastguard Worker }
189*d83cc019SAndroid Build Coastguard Worker }
190*d83cc019SAndroid Build Coastguard Worker
poll_pixel_iir_gen3(int pipe,int bit,uint32_t * min,uint32_t * max,const int count)191*d83cc019SAndroid Build Coastguard Worker static void poll_pixel_iir_gen3(int pipe, int bit, uint32_t *min, uint32_t *max, const int count)
192*d83cc019SAndroid Build Coastguard Worker {
193*d83cc019SAndroid Build Coastguard Worker uint32_t pix, pix1, pix2, iir1, iir2, imr_save, ier_save;
194*d83cc019SAndroid Build Coastguard Worker int i = 0;
195*d83cc019SAndroid Build Coastguard Worker
196*d83cc019SAndroid Build Coastguard Worker bit = 1 << bit;
197*d83cc019SAndroid Build Coastguard Worker pix = PIPE_REG(pipe, PIPEAFRAMEPIXEL);
198*d83cc019SAndroid Build Coastguard Worker
199*d83cc019SAndroid Build Coastguard Worker imr_save = read_reg(IMR);
200*d83cc019SAndroid Build Coastguard Worker ier_save = read_reg(IER);
201*d83cc019SAndroid Build Coastguard Worker
202*d83cc019SAndroid Build Coastguard Worker write_reg(IER, ier_save & ~bit);
203*d83cc019SAndroid Build Coastguard Worker write_reg(IMR, imr_save & ~bit);
204*d83cc019SAndroid Build Coastguard Worker
205*d83cc019SAndroid Build Coastguard Worker write_reg(IIR, bit);
206*d83cc019SAndroid Build Coastguard Worker
207*d83cc019SAndroid Build Coastguard Worker while (!quit) {
208*d83cc019SAndroid Build Coastguard Worker pix1 = read_reg(pix);
209*d83cc019SAndroid Build Coastguard Worker iir1 = read_reg(IIR);
210*d83cc019SAndroid Build Coastguard Worker iir2 = read_reg(IIR);
211*d83cc019SAndroid Build Coastguard Worker pix2 = read_reg(pix);
212*d83cc019SAndroid Build Coastguard Worker
213*d83cc019SAndroid Build Coastguard Worker if (!(iir2 & bit))
214*d83cc019SAndroid Build Coastguard Worker continue;
215*d83cc019SAndroid Build Coastguard Worker
216*d83cc019SAndroid Build Coastguard Worker write_reg(IIR, bit);
217*d83cc019SAndroid Build Coastguard Worker
218*d83cc019SAndroid Build Coastguard Worker if (iir1 & bit)
219*d83cc019SAndroid Build Coastguard Worker continue;
220*d83cc019SAndroid Build Coastguard Worker
221*d83cc019SAndroid Build Coastguard Worker pix1 &= PIPE_PIXEL_MASK;
222*d83cc019SAndroid Build Coastguard Worker pix2 &= PIPE_PIXEL_MASK;
223*d83cc019SAndroid Build Coastguard Worker
224*d83cc019SAndroid Build Coastguard Worker min[i] = pix1;
225*d83cc019SAndroid Build Coastguard Worker max[i] = pix2;
226*d83cc019SAndroid Build Coastguard Worker if (++i >= count)
227*d83cc019SAndroid Build Coastguard Worker break;
228*d83cc019SAndroid Build Coastguard Worker }
229*d83cc019SAndroid Build Coastguard Worker
230*d83cc019SAndroid Build Coastguard Worker write_reg(IMR, imr_save);
231*d83cc019SAndroid Build Coastguard Worker write_reg(IER, ier_save);
232*d83cc019SAndroid Build Coastguard Worker }
233*d83cc019SAndroid Build Coastguard Worker
poll_pixel_framecount_gen3(int pipe,uint32_t * min,uint32_t * max,const int count)234*d83cc019SAndroid Build Coastguard Worker static void poll_pixel_framecount_gen3(int pipe, uint32_t *min, uint32_t *max, const int count)
235*d83cc019SAndroid Build Coastguard Worker {
236*d83cc019SAndroid Build Coastguard Worker uint32_t pix, pix1, pix2, frm1, frm2;
237*d83cc019SAndroid Build Coastguard Worker int i = 0;
238*d83cc019SAndroid Build Coastguard Worker
239*d83cc019SAndroid Build Coastguard Worker pix = PIPE_REG(pipe, PIPEAFRAMEPIXEL);
240*d83cc019SAndroid Build Coastguard Worker
241*d83cc019SAndroid Build Coastguard Worker while (!quit) {
242*d83cc019SAndroid Build Coastguard Worker pix1 = read_reg(pix);
243*d83cc019SAndroid Build Coastguard Worker pix2 = read_reg(pix);
244*d83cc019SAndroid Build Coastguard Worker
245*d83cc019SAndroid Build Coastguard Worker frm1 = pix1 >> 24;
246*d83cc019SAndroid Build Coastguard Worker frm2 = pix2 >> 24;
247*d83cc019SAndroid Build Coastguard Worker
248*d83cc019SAndroid Build Coastguard Worker if (frm1 + 1 != frm2)
249*d83cc019SAndroid Build Coastguard Worker continue;
250*d83cc019SAndroid Build Coastguard Worker
251*d83cc019SAndroid Build Coastguard Worker pix1 &= PIPE_PIXEL_MASK;
252*d83cc019SAndroid Build Coastguard Worker pix2 &= PIPE_PIXEL_MASK;
253*d83cc019SAndroid Build Coastguard Worker
254*d83cc019SAndroid Build Coastguard Worker min[i] = pix1;
255*d83cc019SAndroid Build Coastguard Worker max[i] = pix2;
256*d83cc019SAndroid Build Coastguard Worker if (++i >= count)
257*d83cc019SAndroid Build Coastguard Worker break;
258*d83cc019SAndroid Build Coastguard Worker }
259*d83cc019SAndroid Build Coastguard Worker }
260*d83cc019SAndroid Build Coastguard Worker
poll_pixel_pan(uint32_t devid,int pipe,int target_pixel,int target_fuzz,uint32_t * min,uint32_t * max,const int count)261*d83cc019SAndroid Build Coastguard Worker static void poll_pixel_pan(uint32_t devid, int pipe, int target_pixel, int target_fuzz,
262*d83cc019SAndroid Build Coastguard Worker uint32_t *min, uint32_t *max, const int count)
263*d83cc019SAndroid Build Coastguard Worker {
264*d83cc019SAndroid Build Coastguard Worker uint32_t pix, pix1 = 0, pix2 = 0;
265*d83cc019SAndroid Build Coastguard Worker uint32_t saved, surf = 0;
266*d83cc019SAndroid Build Coastguard Worker int i = 0;
267*d83cc019SAndroid Build Coastguard Worker
268*d83cc019SAndroid Build Coastguard Worker pix = PIPE_REG(pipe, PIPEAFRAMEPIXEL);
269*d83cc019SAndroid Build Coastguard Worker surf = dspoffset_reg(devid, pipe);
270*d83cc019SAndroid Build Coastguard Worker
271*d83cc019SAndroid Build Coastguard Worker saved = read_reg(surf);
272*d83cc019SAndroid Build Coastguard Worker
273*d83cc019SAndroid Build Coastguard Worker while (!quit) {
274*d83cc019SAndroid Build Coastguard Worker while (!quit){
275*d83cc019SAndroid Build Coastguard Worker pix1 = read_reg(pix) & PIPE_PIXEL_MASK;
276*d83cc019SAndroid Build Coastguard Worker if (pix1 == target_pixel)
277*d83cc019SAndroid Build Coastguard Worker break;
278*d83cc019SAndroid Build Coastguard Worker }
279*d83cc019SAndroid Build Coastguard Worker
280*d83cc019SAndroid Build Coastguard Worker write_reg(surf, saved+256);
281*d83cc019SAndroid Build Coastguard Worker
282*d83cc019SAndroid Build Coastguard Worker while (!quit){
283*d83cc019SAndroid Build Coastguard Worker pix2 = read_reg(pix) & PIPE_PIXEL_MASK;
284*d83cc019SAndroid Build Coastguard Worker if (pix2 >= target_pixel + target_fuzz)
285*d83cc019SAndroid Build Coastguard Worker break;
286*d83cc019SAndroid Build Coastguard Worker }
287*d83cc019SAndroid Build Coastguard Worker
288*d83cc019SAndroid Build Coastguard Worker write_reg(surf, saved);
289*d83cc019SAndroid Build Coastguard Worker
290*d83cc019SAndroid Build Coastguard Worker min[i] = pix1;
291*d83cc019SAndroid Build Coastguard Worker max[i] = pix2;
292*d83cc019SAndroid Build Coastguard Worker if (++i >= count)
293*d83cc019SAndroid Build Coastguard Worker break;
294*d83cc019SAndroid Build Coastguard Worker }
295*d83cc019SAndroid Build Coastguard Worker
296*d83cc019SAndroid Build Coastguard Worker write_reg(surf, saved);
297*d83cc019SAndroid Build Coastguard Worker }
298*d83cc019SAndroid Build Coastguard Worker
poll_pixel_flip(uint32_t devid,int pipe,int target_pixel,int target_fuzz,uint32_t * min,uint32_t * max,const int count)299*d83cc019SAndroid Build Coastguard Worker static void poll_pixel_flip(uint32_t devid, int pipe, int target_pixel, int target_fuzz,
300*d83cc019SAndroid Build Coastguard Worker uint32_t *min, uint32_t *max, const int count)
301*d83cc019SAndroid Build Coastguard Worker {
302*d83cc019SAndroid Build Coastguard Worker uint32_t pix, pix1 = 0, pix2 = 0;
303*d83cc019SAndroid Build Coastguard Worker uint32_t saved, surf = 0;
304*d83cc019SAndroid Build Coastguard Worker int i = 0;
305*d83cc019SAndroid Build Coastguard Worker
306*d83cc019SAndroid Build Coastguard Worker pix = PIPE_REG(pipe, PIPEAFRAMEPIXEL);
307*d83cc019SAndroid Build Coastguard Worker surf = dspsurf_reg(devid, pipe);
308*d83cc019SAndroid Build Coastguard Worker
309*d83cc019SAndroid Build Coastguard Worker saved = read_reg(surf);
310*d83cc019SAndroid Build Coastguard Worker
311*d83cc019SAndroid Build Coastguard Worker while (!quit) {
312*d83cc019SAndroid Build Coastguard Worker while (!quit){
313*d83cc019SAndroid Build Coastguard Worker pix1 = read_reg(pix) & PIPE_PIXEL_MASK;
314*d83cc019SAndroid Build Coastguard Worker if (pix1 == target_pixel)
315*d83cc019SAndroid Build Coastguard Worker break;
316*d83cc019SAndroid Build Coastguard Worker }
317*d83cc019SAndroid Build Coastguard Worker
318*d83cc019SAndroid Build Coastguard Worker write_reg(surf, saved+128*1024);
319*d83cc019SAndroid Build Coastguard Worker
320*d83cc019SAndroid Build Coastguard Worker while (!quit){
321*d83cc019SAndroid Build Coastguard Worker pix2 = read_reg(pix) & PIPE_PIXEL_MASK;
322*d83cc019SAndroid Build Coastguard Worker if (pix2 >= target_pixel + target_fuzz)
323*d83cc019SAndroid Build Coastguard Worker break;
324*d83cc019SAndroid Build Coastguard Worker }
325*d83cc019SAndroid Build Coastguard Worker
326*d83cc019SAndroid Build Coastguard Worker write_reg(surf, saved);
327*d83cc019SAndroid Build Coastguard Worker
328*d83cc019SAndroid Build Coastguard Worker min[i] = pix1;
329*d83cc019SAndroid Build Coastguard Worker max[i] = pix2;
330*d83cc019SAndroid Build Coastguard Worker if (++i >= count)
331*d83cc019SAndroid Build Coastguard Worker break;
332*d83cc019SAndroid Build Coastguard Worker }
333*d83cc019SAndroid Build Coastguard Worker
334*d83cc019SAndroid Build Coastguard Worker write_reg(surf, saved);
335*d83cc019SAndroid Build Coastguard Worker }
336*d83cc019SAndroid Build Coastguard Worker
poll_pixel_wrap(int pipe,uint32_t * min,uint32_t * max,const int count)337*d83cc019SAndroid Build Coastguard Worker static void poll_pixel_wrap(int pipe, uint32_t *min, uint32_t *max, const int count)
338*d83cc019SAndroid Build Coastguard Worker {
339*d83cc019SAndroid Build Coastguard Worker uint32_t pix, pix1, pix2;
340*d83cc019SAndroid Build Coastguard Worker int i = 0;
341*d83cc019SAndroid Build Coastguard Worker
342*d83cc019SAndroid Build Coastguard Worker pix = PIPE_REG(pipe, PIPEAFRAMEPIXEL);
343*d83cc019SAndroid Build Coastguard Worker
344*d83cc019SAndroid Build Coastguard Worker while (!quit) {
345*d83cc019SAndroid Build Coastguard Worker pix1 = read_reg(pix);
346*d83cc019SAndroid Build Coastguard Worker pix2 = read_reg(pix);
347*d83cc019SAndroid Build Coastguard Worker
348*d83cc019SAndroid Build Coastguard Worker pix1 &= PIPE_PIXEL_MASK;
349*d83cc019SAndroid Build Coastguard Worker pix2 &= PIPE_PIXEL_MASK;
350*d83cc019SAndroid Build Coastguard Worker
351*d83cc019SAndroid Build Coastguard Worker if (pix2 >= pix1)
352*d83cc019SAndroid Build Coastguard Worker continue;
353*d83cc019SAndroid Build Coastguard Worker
354*d83cc019SAndroid Build Coastguard Worker min[i] = pix1;
355*d83cc019SAndroid Build Coastguard Worker max[i] = pix2;
356*d83cc019SAndroid Build Coastguard Worker if (++i >= count)
357*d83cc019SAndroid Build Coastguard Worker break;
358*d83cc019SAndroid Build Coastguard Worker }
359*d83cc019SAndroid Build Coastguard Worker }
360*d83cc019SAndroid Build Coastguard Worker
poll_dsl_pipestat(int pipe,int bit,uint32_t * min,uint32_t * max,const int count)361*d83cc019SAndroid Build Coastguard Worker static void poll_dsl_pipestat(int pipe, int bit,
362*d83cc019SAndroid Build Coastguard Worker uint32_t *min, uint32_t *max, const int count)
363*d83cc019SAndroid Build Coastguard Worker {
364*d83cc019SAndroid Build Coastguard Worker uint32_t dsl, dsl1, dsl2, iir, iir1, iir2, iir_bit, iir_mask;
365*d83cc019SAndroid Build Coastguard Worker bool field1, field2;
366*d83cc019SAndroid Build Coastguard Worker int i[2] = {};
367*d83cc019SAndroid Build Coastguard Worker
368*d83cc019SAndroid Build Coastguard Worker iir_bit = 1 << bit;
369*d83cc019SAndroid Build Coastguard Worker iir = PIPE_REG(pipe, PIPEASTAT);
370*d83cc019SAndroid Build Coastguard Worker dsl = PIPE_REG(pipe, PIPEA_DSL);
371*d83cc019SAndroid Build Coastguard Worker
372*d83cc019SAndroid Build Coastguard Worker iir_mask = read_reg(iir) & 0x7fff0000;
373*d83cc019SAndroid Build Coastguard Worker
374*d83cc019SAndroid Build Coastguard Worker write_reg(iir, iir_mask | iir_bit);
375*d83cc019SAndroid Build Coastguard Worker
376*d83cc019SAndroid Build Coastguard Worker while (!quit) {
377*d83cc019SAndroid Build Coastguard Worker dsl1 = read_reg(dsl);
378*d83cc019SAndroid Build Coastguard Worker iir1 = read_reg(iir);
379*d83cc019SAndroid Build Coastguard Worker iir2 = read_reg(iir);
380*d83cc019SAndroid Build Coastguard Worker dsl2 = read_reg(dsl);
381*d83cc019SAndroid Build Coastguard Worker
382*d83cc019SAndroid Build Coastguard Worker field1 = dsl1 & 0x80000000;
383*d83cc019SAndroid Build Coastguard Worker field2 = dsl2 & 0x80000000;
384*d83cc019SAndroid Build Coastguard Worker dsl1 &= ~0x80000000;
385*d83cc019SAndroid Build Coastguard Worker dsl2 &= ~0x80000000;
386*d83cc019SAndroid Build Coastguard Worker
387*d83cc019SAndroid Build Coastguard Worker if (!(iir2 & iir_bit))
388*d83cc019SAndroid Build Coastguard Worker continue;
389*d83cc019SAndroid Build Coastguard Worker
390*d83cc019SAndroid Build Coastguard Worker if (iir1 & iir_bit) {
391*d83cc019SAndroid Build Coastguard Worker write_reg(iir, iir_mask | iir_bit);
392*d83cc019SAndroid Build Coastguard Worker continue;
393*d83cc019SAndroid Build Coastguard Worker }
394*d83cc019SAndroid Build Coastguard Worker
395*d83cc019SAndroid Build Coastguard Worker if (field1 != field2)
396*d83cc019SAndroid Build Coastguard Worker printf("fields are different (%u:%u -> %u:%u)\n",
397*d83cc019SAndroid Build Coastguard Worker field1, dsl1, field2, dsl2);
398*d83cc019SAndroid Build Coastguard Worker
399*d83cc019SAndroid Build Coastguard Worker min[field1*count+i[field1]] = dsl1;
400*d83cc019SAndroid Build Coastguard Worker max[field1*count+i[field1]] = dsl2;
401*d83cc019SAndroid Build Coastguard Worker if (++i[field1] >= count)
402*d83cc019SAndroid Build Coastguard Worker break;
403*d83cc019SAndroid Build Coastguard Worker }
404*d83cc019SAndroid Build Coastguard Worker }
405*d83cc019SAndroid Build Coastguard Worker
poll_dsl_iir_gen2(int pipe,int bit,uint32_t * min,uint32_t * max,const int count)406*d83cc019SAndroid Build Coastguard Worker static void poll_dsl_iir_gen2(int pipe, int bit,
407*d83cc019SAndroid Build Coastguard Worker uint32_t *min, uint32_t *max, const int count)
408*d83cc019SAndroid Build Coastguard Worker {
409*d83cc019SAndroid Build Coastguard Worker uint32_t dsl, dsl1, dsl2, iir1, iir2, imr_save, ier_save;
410*d83cc019SAndroid Build Coastguard Worker bool field1, field2;
411*d83cc019SAndroid Build Coastguard Worker int i[2] = {};
412*d83cc019SAndroid Build Coastguard Worker
413*d83cc019SAndroid Build Coastguard Worker bit = 1 << bit;
414*d83cc019SAndroid Build Coastguard Worker dsl = PIPE_REG(pipe, PIPEA_DSL);
415*d83cc019SAndroid Build Coastguard Worker
416*d83cc019SAndroid Build Coastguard Worker imr_save = read_reg_16(IMR);
417*d83cc019SAndroid Build Coastguard Worker ier_save = read_reg_16(IER);
418*d83cc019SAndroid Build Coastguard Worker
419*d83cc019SAndroid Build Coastguard Worker write_reg_16(IER, ier_save & ~bit);
420*d83cc019SAndroid Build Coastguard Worker write_reg_16(IMR, imr_save & ~bit);
421*d83cc019SAndroid Build Coastguard Worker
422*d83cc019SAndroid Build Coastguard Worker write_reg_16(IIR, bit);
423*d83cc019SAndroid Build Coastguard Worker
424*d83cc019SAndroid Build Coastguard Worker while (!quit) {
425*d83cc019SAndroid Build Coastguard Worker dsl1 = read_reg(dsl);
426*d83cc019SAndroid Build Coastguard Worker iir1 = read_reg_16(IIR);
427*d83cc019SAndroid Build Coastguard Worker iir2 = read_reg_16(IIR);
428*d83cc019SAndroid Build Coastguard Worker dsl2 = read_reg(dsl);
429*d83cc019SAndroid Build Coastguard Worker
430*d83cc019SAndroid Build Coastguard Worker field1 = dsl1 & 0x80000000;
431*d83cc019SAndroid Build Coastguard Worker field2 = dsl2 & 0x80000000;
432*d83cc019SAndroid Build Coastguard Worker dsl1 &= ~0x80000000;
433*d83cc019SAndroid Build Coastguard Worker dsl2 &= ~0x80000000;
434*d83cc019SAndroid Build Coastguard Worker
435*d83cc019SAndroid Build Coastguard Worker if (!(iir2 & bit))
436*d83cc019SAndroid Build Coastguard Worker continue;
437*d83cc019SAndroid Build Coastguard Worker
438*d83cc019SAndroid Build Coastguard Worker write_reg_16(IIR, bit);
439*d83cc019SAndroid Build Coastguard Worker
440*d83cc019SAndroid Build Coastguard Worker if (iir1 & bit)
441*d83cc019SAndroid Build Coastguard Worker continue;
442*d83cc019SAndroid Build Coastguard Worker
443*d83cc019SAndroid Build Coastguard Worker if (field1 != field2)
444*d83cc019SAndroid Build Coastguard Worker printf("fields are different (%u:%u -> %u:%u)\n",
445*d83cc019SAndroid Build Coastguard Worker field1, dsl1, field2, dsl2);
446*d83cc019SAndroid Build Coastguard Worker
447*d83cc019SAndroid Build Coastguard Worker min[field1*count+i[field1]] = dsl1;
448*d83cc019SAndroid Build Coastguard Worker max[field1*count+i[field1]] = dsl2;
449*d83cc019SAndroid Build Coastguard Worker if (++i[field1] >= count)
450*d83cc019SAndroid Build Coastguard Worker break;
451*d83cc019SAndroid Build Coastguard Worker }
452*d83cc019SAndroid Build Coastguard Worker
453*d83cc019SAndroid Build Coastguard Worker write_reg_16(IMR, imr_save);
454*d83cc019SAndroid Build Coastguard Worker write_reg_16(IER, ier_save);
455*d83cc019SAndroid Build Coastguard Worker }
456*d83cc019SAndroid Build Coastguard Worker
poll_dsl_iir_gen3(int pipe,int bit,uint32_t * min,uint32_t * max,const int count)457*d83cc019SAndroid Build Coastguard Worker static void poll_dsl_iir_gen3(int pipe, int bit,
458*d83cc019SAndroid Build Coastguard Worker uint32_t *min, uint32_t *max, const int count)
459*d83cc019SAndroid Build Coastguard Worker {
460*d83cc019SAndroid Build Coastguard Worker uint32_t dsl, dsl1, dsl2, iir1, iir2, imr_save, ier_save;
461*d83cc019SAndroid Build Coastguard Worker bool field1, field2;
462*d83cc019SAndroid Build Coastguard Worker int i[2] = {};
463*d83cc019SAndroid Build Coastguard Worker
464*d83cc019SAndroid Build Coastguard Worker bit = 1 << bit;
465*d83cc019SAndroid Build Coastguard Worker dsl = PIPE_REG(pipe, PIPEA_DSL);
466*d83cc019SAndroid Build Coastguard Worker
467*d83cc019SAndroid Build Coastguard Worker imr_save = read_reg(IMR);
468*d83cc019SAndroid Build Coastguard Worker ier_save = read_reg(IER);
469*d83cc019SAndroid Build Coastguard Worker
470*d83cc019SAndroid Build Coastguard Worker write_reg(IER, ier_save & ~bit);
471*d83cc019SAndroid Build Coastguard Worker write_reg(IMR, imr_save & ~bit);
472*d83cc019SAndroid Build Coastguard Worker
473*d83cc019SAndroid Build Coastguard Worker write_reg(IIR, bit);
474*d83cc019SAndroid Build Coastguard Worker
475*d83cc019SAndroid Build Coastguard Worker while (!quit) {
476*d83cc019SAndroid Build Coastguard Worker dsl1 = read_reg(dsl);
477*d83cc019SAndroid Build Coastguard Worker iir1 = read_reg(IIR);
478*d83cc019SAndroid Build Coastguard Worker iir2 = read_reg(IIR);
479*d83cc019SAndroid Build Coastguard Worker dsl2 = read_reg(dsl);
480*d83cc019SAndroid Build Coastguard Worker
481*d83cc019SAndroid Build Coastguard Worker field1 = dsl1 & 0x80000000;
482*d83cc019SAndroid Build Coastguard Worker field2 = dsl2 & 0x80000000;
483*d83cc019SAndroid Build Coastguard Worker dsl1 &= ~0x80000000;
484*d83cc019SAndroid Build Coastguard Worker dsl2 &= ~0x80000000;
485*d83cc019SAndroid Build Coastguard Worker
486*d83cc019SAndroid Build Coastguard Worker if (!(iir2 & bit))
487*d83cc019SAndroid Build Coastguard Worker continue;
488*d83cc019SAndroid Build Coastguard Worker
489*d83cc019SAndroid Build Coastguard Worker write_reg(IIR, bit);
490*d83cc019SAndroid Build Coastguard Worker
491*d83cc019SAndroid Build Coastguard Worker if (iir1 & bit)
492*d83cc019SAndroid Build Coastguard Worker continue;
493*d83cc019SAndroid Build Coastguard Worker
494*d83cc019SAndroid Build Coastguard Worker if (field1 != field2)
495*d83cc019SAndroid Build Coastguard Worker printf("fields are different (%u:%u -> %u:%u)\n",
496*d83cc019SAndroid Build Coastguard Worker field1, dsl1, field2, dsl2);
497*d83cc019SAndroid Build Coastguard Worker
498*d83cc019SAndroid Build Coastguard Worker min[field1*count+i[field1]] = dsl1;
499*d83cc019SAndroid Build Coastguard Worker max[field1*count+i[field1]] = dsl2;
500*d83cc019SAndroid Build Coastguard Worker if (++i[field1] >= count)
501*d83cc019SAndroid Build Coastguard Worker break;
502*d83cc019SAndroid Build Coastguard Worker }
503*d83cc019SAndroid Build Coastguard Worker
504*d83cc019SAndroid Build Coastguard Worker write_reg(IMR, imr_save);
505*d83cc019SAndroid Build Coastguard Worker write_reg(IER, ier_save);
506*d83cc019SAndroid Build Coastguard Worker }
507*d83cc019SAndroid Build Coastguard Worker
poll_dsl_deiir(uint32_t devid,int pipe,int bit,uint32_t * min,uint32_t * max,const int count)508*d83cc019SAndroid Build Coastguard Worker static void poll_dsl_deiir(uint32_t devid, int pipe, int bit,
509*d83cc019SAndroid Build Coastguard Worker uint32_t *min, uint32_t *max, const int count)
510*d83cc019SAndroid Build Coastguard Worker {
511*d83cc019SAndroid Build Coastguard Worker uint32_t dsl, dsl1, dsl2, iir1, iir2, imr_save, ier_save;
512*d83cc019SAndroid Build Coastguard Worker bool field1, field2;
513*d83cc019SAndroid Build Coastguard Worker uint32_t iir, ier, imr;
514*d83cc019SAndroid Build Coastguard Worker int i[2] = {};
515*d83cc019SAndroid Build Coastguard Worker
516*d83cc019SAndroid Build Coastguard Worker bit = 1 << bit;
517*d83cc019SAndroid Build Coastguard Worker dsl = PIPE_REG(pipe, PIPEA_DSL);
518*d83cc019SAndroid Build Coastguard Worker
519*d83cc019SAndroid Build Coastguard Worker if (intel_gen(devid) >= 8) {
520*d83cc019SAndroid Build Coastguard Worker iir = GEN8_DE_PIPE_IIR(pipe);
521*d83cc019SAndroid Build Coastguard Worker ier = GEN8_DE_PIPE_IER(pipe);
522*d83cc019SAndroid Build Coastguard Worker imr = GEN8_DE_PIPE_IMR(pipe);
523*d83cc019SAndroid Build Coastguard Worker } else {
524*d83cc019SAndroid Build Coastguard Worker iir = DEIIR;
525*d83cc019SAndroid Build Coastguard Worker ier = DEIER;
526*d83cc019SAndroid Build Coastguard Worker imr = DEIMR;
527*d83cc019SAndroid Build Coastguard Worker }
528*d83cc019SAndroid Build Coastguard Worker
529*d83cc019SAndroid Build Coastguard Worker imr_save = read_reg(imr);
530*d83cc019SAndroid Build Coastguard Worker ier_save = read_reg(ier);
531*d83cc019SAndroid Build Coastguard Worker
532*d83cc019SAndroid Build Coastguard Worker write_reg(ier, ier_save & ~bit);
533*d83cc019SAndroid Build Coastguard Worker write_reg(imr, imr_save & ~bit);
534*d83cc019SAndroid Build Coastguard Worker
535*d83cc019SAndroid Build Coastguard Worker write_reg(iir, bit);
536*d83cc019SAndroid Build Coastguard Worker
537*d83cc019SAndroid Build Coastguard Worker while (!quit) {
538*d83cc019SAndroid Build Coastguard Worker dsl1 = read_reg(dsl);
539*d83cc019SAndroid Build Coastguard Worker iir1 = read_reg(iir);
540*d83cc019SAndroid Build Coastguard Worker iir2 = read_reg(iir);
541*d83cc019SAndroid Build Coastguard Worker dsl2 = read_reg(dsl);
542*d83cc019SAndroid Build Coastguard Worker
543*d83cc019SAndroid Build Coastguard Worker field1 = dsl1 & 0x80000000;
544*d83cc019SAndroid Build Coastguard Worker field2 = dsl2 & 0x80000000;
545*d83cc019SAndroid Build Coastguard Worker dsl1 &= ~0x80000000;
546*d83cc019SAndroid Build Coastguard Worker dsl2 &= ~0x80000000;
547*d83cc019SAndroid Build Coastguard Worker
548*d83cc019SAndroid Build Coastguard Worker if (!(iir2 & bit))
549*d83cc019SAndroid Build Coastguard Worker continue;
550*d83cc019SAndroid Build Coastguard Worker
551*d83cc019SAndroid Build Coastguard Worker write_reg(iir, bit);
552*d83cc019SAndroid Build Coastguard Worker
553*d83cc019SAndroid Build Coastguard Worker if (iir1 & bit)
554*d83cc019SAndroid Build Coastguard Worker continue;
555*d83cc019SAndroid Build Coastguard Worker
556*d83cc019SAndroid Build Coastguard Worker if (field1 != field2)
557*d83cc019SAndroid Build Coastguard Worker printf("fields are different (%u:%u -> %u:%u)\n",
558*d83cc019SAndroid Build Coastguard Worker field1, dsl1, field2, dsl2);
559*d83cc019SAndroid Build Coastguard Worker
560*d83cc019SAndroid Build Coastguard Worker min[field1*count+i[field1]] = dsl1;
561*d83cc019SAndroid Build Coastguard Worker max[field1*count+i[field1]] = dsl2;
562*d83cc019SAndroid Build Coastguard Worker if (++i[field1] >= count)
563*d83cc019SAndroid Build Coastguard Worker break;
564*d83cc019SAndroid Build Coastguard Worker }
565*d83cc019SAndroid Build Coastguard Worker
566*d83cc019SAndroid Build Coastguard Worker write_reg(imr, imr_save);
567*d83cc019SAndroid Build Coastguard Worker write_reg(ier, ier_save);
568*d83cc019SAndroid Build Coastguard Worker }
569*d83cc019SAndroid Build Coastguard Worker
poll_dsl_framecount_g4x(int pipe,uint32_t * min,uint32_t * max,const int count)570*d83cc019SAndroid Build Coastguard Worker static void poll_dsl_framecount_g4x(int pipe, uint32_t *min, uint32_t *max, const int count)
571*d83cc019SAndroid Build Coastguard Worker {
572*d83cc019SAndroid Build Coastguard Worker uint32_t dsl, dsl1, dsl2, frm, frm1, frm2;
573*d83cc019SAndroid Build Coastguard Worker bool field1, field2;
574*d83cc019SAndroid Build Coastguard Worker int i[2] = {};
575*d83cc019SAndroid Build Coastguard Worker
576*d83cc019SAndroid Build Coastguard Worker frm = PIPE_REG(pipe, PIPEAFRMCOUNT_G4X);
577*d83cc019SAndroid Build Coastguard Worker dsl = PIPE_REG(pipe, PIPEA_DSL);
578*d83cc019SAndroid Build Coastguard Worker
579*d83cc019SAndroid Build Coastguard Worker while (!quit) {
580*d83cc019SAndroid Build Coastguard Worker dsl1 = read_reg(dsl);
581*d83cc019SAndroid Build Coastguard Worker frm1 = read_reg(frm);
582*d83cc019SAndroid Build Coastguard Worker frm2 = read_reg(frm);
583*d83cc019SAndroid Build Coastguard Worker dsl2 = read_reg(dsl);
584*d83cc019SAndroid Build Coastguard Worker
585*d83cc019SAndroid Build Coastguard Worker field1 = dsl1 & 0x80000000;
586*d83cc019SAndroid Build Coastguard Worker field2 = dsl2 & 0x80000000;
587*d83cc019SAndroid Build Coastguard Worker dsl1 &= ~0x80000000;
588*d83cc019SAndroid Build Coastguard Worker dsl2 &= ~0x80000000;
589*d83cc019SAndroid Build Coastguard Worker
590*d83cc019SAndroid Build Coastguard Worker if (frm1 + 1 != frm2)
591*d83cc019SAndroid Build Coastguard Worker continue;
592*d83cc019SAndroid Build Coastguard Worker
593*d83cc019SAndroid Build Coastguard Worker if (field1 != field2)
594*d83cc019SAndroid Build Coastguard Worker printf("fields are different (%u:%u -> %u:%u)\n",
595*d83cc019SAndroid Build Coastguard Worker field1, dsl1, field2, dsl2);
596*d83cc019SAndroid Build Coastguard Worker
597*d83cc019SAndroid Build Coastguard Worker min[field1*count+i[field1]] = dsl1;
598*d83cc019SAndroid Build Coastguard Worker max[field1*count+i[field1]] = dsl2;
599*d83cc019SAndroid Build Coastguard Worker if (++i[field1] >= count)
600*d83cc019SAndroid Build Coastguard Worker break;
601*d83cc019SAndroid Build Coastguard Worker }
602*d83cc019SAndroid Build Coastguard Worker }
603*d83cc019SAndroid Build Coastguard Worker
poll_dsl_flipcount_g4x(uint32_t devid,int pipe,uint32_t * min,uint32_t * max,const int count)604*d83cc019SAndroid Build Coastguard Worker static void poll_dsl_flipcount_g4x(uint32_t devid, int pipe,
605*d83cc019SAndroid Build Coastguard Worker uint32_t *min, uint32_t *max, const int count)
606*d83cc019SAndroid Build Coastguard Worker {
607*d83cc019SAndroid Build Coastguard Worker uint32_t dsl, dsl1, dsl2, flp, flp1, flp2, surf;
608*d83cc019SAndroid Build Coastguard Worker bool field1, field2;
609*d83cc019SAndroid Build Coastguard Worker int i[2] = {};
610*d83cc019SAndroid Build Coastguard Worker
611*d83cc019SAndroid Build Coastguard Worker flp = PIPE_REG(pipe, PIPEAFLIPCOUNT_G4X);
612*d83cc019SAndroid Build Coastguard Worker dsl = PIPE_REG(pipe, PIPEA_DSL);
613*d83cc019SAndroid Build Coastguard Worker surf = dspsurf_reg(devid, pipe);
614*d83cc019SAndroid Build Coastguard Worker
615*d83cc019SAndroid Build Coastguard Worker while (!quit) {
616*d83cc019SAndroid Build Coastguard Worker usleep(10);
617*d83cc019SAndroid Build Coastguard Worker dsl1 = read_reg(dsl);
618*d83cc019SAndroid Build Coastguard Worker flp1 = read_reg(flp);
619*d83cc019SAndroid Build Coastguard Worker dsl2 = read_reg(dsl);
620*d83cc019SAndroid Build Coastguard Worker
621*d83cc019SAndroid Build Coastguard Worker field1 = dsl1 & 0x80000000;
622*d83cc019SAndroid Build Coastguard Worker field2 = dsl2 & 0x80000000;
623*d83cc019SAndroid Build Coastguard Worker dsl1 &= ~0x80000000;
624*d83cc019SAndroid Build Coastguard Worker dsl2 &= ~0x80000000;
625*d83cc019SAndroid Build Coastguard Worker
626*d83cc019SAndroid Build Coastguard Worker if (field1 != field2)
627*d83cc019SAndroid Build Coastguard Worker printf("fields are different (%u:%u -> %u:%u)\n",
628*d83cc019SAndroid Build Coastguard Worker field1, dsl1, field2, dsl2);
629*d83cc019SAndroid Build Coastguard Worker
630*d83cc019SAndroid Build Coastguard Worker min[field1*count+i[field1]] = dsl1;
631*d83cc019SAndroid Build Coastguard Worker max[field1*count+i[field1]] = dsl2;
632*d83cc019SAndroid Build Coastguard Worker if (++i[field1] >= count)
633*d83cc019SAndroid Build Coastguard Worker return;
634*d83cc019SAndroid Build Coastguard Worker
635*d83cc019SAndroid Build Coastguard Worker write_reg(surf, read_reg(surf));
636*d83cc019SAndroid Build Coastguard Worker
637*d83cc019SAndroid Build Coastguard Worker while (!quit) {
638*d83cc019SAndroid Build Coastguard Worker dsl1 = read_reg(dsl);
639*d83cc019SAndroid Build Coastguard Worker flp2 = read_reg(flp);
640*d83cc019SAndroid Build Coastguard Worker dsl2 = read_reg(dsl);
641*d83cc019SAndroid Build Coastguard Worker
642*d83cc019SAndroid Build Coastguard Worker field1 = dsl1 & 0x80000000;
643*d83cc019SAndroid Build Coastguard Worker field2 = dsl2 & 0x80000000;
644*d83cc019SAndroid Build Coastguard Worker dsl1 &= ~0x80000000;
645*d83cc019SAndroid Build Coastguard Worker dsl2 &= ~0x80000000;
646*d83cc019SAndroid Build Coastguard Worker
647*d83cc019SAndroid Build Coastguard Worker if (flp1 == flp2)
648*d83cc019SAndroid Build Coastguard Worker continue;
649*d83cc019SAndroid Build Coastguard Worker
650*d83cc019SAndroid Build Coastguard Worker if (field1 != field2)
651*d83cc019SAndroid Build Coastguard Worker printf("fields are different (%u:%u -> %u:%u)\n",
652*d83cc019SAndroid Build Coastguard Worker field1, dsl1, field2, dsl2);
653*d83cc019SAndroid Build Coastguard Worker
654*d83cc019SAndroid Build Coastguard Worker min[field1*count+i[field1]] = dsl1;
655*d83cc019SAndroid Build Coastguard Worker max[field1*count+i[field1]] = dsl2;
656*d83cc019SAndroid Build Coastguard Worker if (++i[field1] >= count)
657*d83cc019SAndroid Build Coastguard Worker break;
658*d83cc019SAndroid Build Coastguard Worker }
659*d83cc019SAndroid Build Coastguard Worker if (i[field1] >= count)
660*d83cc019SAndroid Build Coastguard Worker break;
661*d83cc019SAndroid Build Coastguard Worker }
662*d83cc019SAndroid Build Coastguard Worker }
663*d83cc019SAndroid Build Coastguard Worker
poll_dsl_framecount_gen3(int pipe,uint32_t * min,uint32_t * max,const int count)664*d83cc019SAndroid Build Coastguard Worker static void poll_dsl_framecount_gen3(int pipe, uint32_t *min, uint32_t *max, const int count)
665*d83cc019SAndroid Build Coastguard Worker {
666*d83cc019SAndroid Build Coastguard Worker uint32_t dsl, dsl1, dsl2, frm, frm1, frm2;
667*d83cc019SAndroid Build Coastguard Worker bool field1, field2;
668*d83cc019SAndroid Build Coastguard Worker int i[2] = {};
669*d83cc019SAndroid Build Coastguard Worker
670*d83cc019SAndroid Build Coastguard Worker frm = PIPE_REG(pipe, PIPEAFRAMEPIXEL);
671*d83cc019SAndroid Build Coastguard Worker dsl = PIPE_REG(pipe, PIPEA_DSL);
672*d83cc019SAndroid Build Coastguard Worker
673*d83cc019SAndroid Build Coastguard Worker while (!quit) {
674*d83cc019SAndroid Build Coastguard Worker dsl1 = read_reg(dsl);
675*d83cc019SAndroid Build Coastguard Worker frm1 = read_reg(frm) >> 24;
676*d83cc019SAndroid Build Coastguard Worker frm2 = read_reg(frm) >> 24;
677*d83cc019SAndroid Build Coastguard Worker dsl2 = read_reg(dsl);
678*d83cc019SAndroid Build Coastguard Worker
679*d83cc019SAndroid Build Coastguard Worker field1 = dsl1 & 0x80000000;
680*d83cc019SAndroid Build Coastguard Worker field2 = dsl2 & 0x80000000;
681*d83cc019SAndroid Build Coastguard Worker dsl1 &= ~0x80000000;
682*d83cc019SAndroid Build Coastguard Worker dsl2 &= ~0x80000000;
683*d83cc019SAndroid Build Coastguard Worker
684*d83cc019SAndroid Build Coastguard Worker if (frm1 + 1 != frm2)
685*d83cc019SAndroid Build Coastguard Worker continue;
686*d83cc019SAndroid Build Coastguard Worker
687*d83cc019SAndroid Build Coastguard Worker if (field1 != field2)
688*d83cc019SAndroid Build Coastguard Worker printf("fields are different (%u:%u -> %u:%u)\n",
689*d83cc019SAndroid Build Coastguard Worker field1, dsl1, field2, dsl2);
690*d83cc019SAndroid Build Coastguard Worker
691*d83cc019SAndroid Build Coastguard Worker min[field1*count+i[field1]] = dsl1;
692*d83cc019SAndroid Build Coastguard Worker max[field1*count+i[field1]] = dsl2;
693*d83cc019SAndroid Build Coastguard Worker if (++i[field1] >= count)
694*d83cc019SAndroid Build Coastguard Worker break;
695*d83cc019SAndroid Build Coastguard Worker }
696*d83cc019SAndroid Build Coastguard Worker }
697*d83cc019SAndroid Build Coastguard Worker
poll_dsl_pan(uint32_t devid,int pipe,int target_scanline,int target_fuzz,uint32_t * min,uint32_t * max,const int count)698*d83cc019SAndroid Build Coastguard Worker static void poll_dsl_pan(uint32_t devid, int pipe, int target_scanline, int target_fuzz,
699*d83cc019SAndroid Build Coastguard Worker uint32_t *min, uint32_t *max, const int count)
700*d83cc019SAndroid Build Coastguard Worker {
701*d83cc019SAndroid Build Coastguard Worker uint32_t dsl, dsl1 = 0, dsl2 = 0;
702*d83cc019SAndroid Build Coastguard Worker bool field1 = false, field2 = false;
703*d83cc019SAndroid Build Coastguard Worker uint32_t saved, surf = 0;
704*d83cc019SAndroid Build Coastguard Worker int i[2] = {};
705*d83cc019SAndroid Build Coastguard Worker
706*d83cc019SAndroid Build Coastguard Worker dsl = PIPE_REG(pipe, PIPEA_DSL);
707*d83cc019SAndroid Build Coastguard Worker surf = dspoffset_reg(devid, pipe);
708*d83cc019SAndroid Build Coastguard Worker
709*d83cc019SAndroid Build Coastguard Worker saved = read_reg(surf);
710*d83cc019SAndroid Build Coastguard Worker
711*d83cc019SAndroid Build Coastguard Worker while (!quit) {
712*d83cc019SAndroid Build Coastguard Worker while (!quit) {
713*d83cc019SAndroid Build Coastguard Worker dsl1 = read_reg(dsl);
714*d83cc019SAndroid Build Coastguard Worker field1 = dsl1 & 0x80000000;
715*d83cc019SAndroid Build Coastguard Worker dsl1 &= ~0x80000000;
716*d83cc019SAndroid Build Coastguard Worker if (dsl1 == target_scanline)
717*d83cc019SAndroid Build Coastguard Worker break;
718*d83cc019SAndroid Build Coastguard Worker }
719*d83cc019SAndroid Build Coastguard Worker
720*d83cc019SAndroid Build Coastguard Worker write_reg(surf, saved+256);
721*d83cc019SAndroid Build Coastguard Worker
722*d83cc019SAndroid Build Coastguard Worker while (!quit) {
723*d83cc019SAndroid Build Coastguard Worker dsl2 = read_reg(dsl);
724*d83cc019SAndroid Build Coastguard Worker field2 = dsl1 & 0x80000000;
725*d83cc019SAndroid Build Coastguard Worker dsl2 &= ~0x80000000;
726*d83cc019SAndroid Build Coastguard Worker if (dsl2 == target_scanline + target_fuzz)
727*d83cc019SAndroid Build Coastguard Worker break;
728*d83cc019SAndroid Build Coastguard Worker }
729*d83cc019SAndroid Build Coastguard Worker
730*d83cc019SAndroid Build Coastguard Worker write_reg(surf, saved);
731*d83cc019SAndroid Build Coastguard Worker
732*d83cc019SAndroid Build Coastguard Worker if (field1 != field2)
733*d83cc019SAndroid Build Coastguard Worker printf("fields are different (%u:%u -> %u:%u)\n",
734*d83cc019SAndroid Build Coastguard Worker field1, dsl1, field2, dsl2);
735*d83cc019SAndroid Build Coastguard Worker
736*d83cc019SAndroid Build Coastguard Worker min[field1*count+i[field1]] = dsl1;
737*d83cc019SAndroid Build Coastguard Worker max[field1*count+i[field1]] = dsl2;
738*d83cc019SAndroid Build Coastguard Worker if (++i[field1] >= count)
739*d83cc019SAndroid Build Coastguard Worker break;
740*d83cc019SAndroid Build Coastguard Worker }
741*d83cc019SAndroid Build Coastguard Worker
742*d83cc019SAndroid Build Coastguard Worker write_reg(surf, saved);
743*d83cc019SAndroid Build Coastguard Worker }
744*d83cc019SAndroid Build Coastguard Worker
poll_dsl_flip(uint32_t devid,int pipe,int target_scanline,int target_fuzz,uint32_t * min,uint32_t * max,const int count)745*d83cc019SAndroid Build Coastguard Worker static void poll_dsl_flip(uint32_t devid, int pipe, int target_scanline, int target_fuzz,
746*d83cc019SAndroid Build Coastguard Worker uint32_t *min, uint32_t *max, const int count)
747*d83cc019SAndroid Build Coastguard Worker {
748*d83cc019SAndroid Build Coastguard Worker uint32_t dsl, dsl1 = 0, dsl2 = 0;
749*d83cc019SAndroid Build Coastguard Worker bool field1 = false, field2 = false;
750*d83cc019SAndroid Build Coastguard Worker uint32_t saved, surf = 0;
751*d83cc019SAndroid Build Coastguard Worker int i[2] = {};
752*d83cc019SAndroid Build Coastguard Worker
753*d83cc019SAndroid Build Coastguard Worker dsl = PIPE_REG(pipe, PIPEA_DSL);
754*d83cc019SAndroid Build Coastguard Worker surf = dspsurf_reg(devid, pipe);
755*d83cc019SAndroid Build Coastguard Worker
756*d83cc019SAndroid Build Coastguard Worker saved = read_reg(surf);
757*d83cc019SAndroid Build Coastguard Worker
758*d83cc019SAndroid Build Coastguard Worker while (!quit) {
759*d83cc019SAndroid Build Coastguard Worker while (!quit) {
760*d83cc019SAndroid Build Coastguard Worker dsl1 = read_reg(dsl);
761*d83cc019SAndroid Build Coastguard Worker field1 = dsl1 & 0x80000000;
762*d83cc019SAndroid Build Coastguard Worker dsl1 &= ~0x80000000;
763*d83cc019SAndroid Build Coastguard Worker if (dsl1 == target_scanline)
764*d83cc019SAndroid Build Coastguard Worker break;
765*d83cc019SAndroid Build Coastguard Worker }
766*d83cc019SAndroid Build Coastguard Worker
767*d83cc019SAndroid Build Coastguard Worker write_reg(surf, saved+128*1024);
768*d83cc019SAndroid Build Coastguard Worker
769*d83cc019SAndroid Build Coastguard Worker while (!quit) {
770*d83cc019SAndroid Build Coastguard Worker dsl2 = read_reg(dsl);
771*d83cc019SAndroid Build Coastguard Worker field2 = dsl1 & 0x80000000;
772*d83cc019SAndroid Build Coastguard Worker dsl2 &= ~0x80000000;
773*d83cc019SAndroid Build Coastguard Worker if (dsl2 == target_scanline + target_fuzz)
774*d83cc019SAndroid Build Coastguard Worker break;
775*d83cc019SAndroid Build Coastguard Worker }
776*d83cc019SAndroid Build Coastguard Worker
777*d83cc019SAndroid Build Coastguard Worker write_reg(surf, saved);
778*d83cc019SAndroid Build Coastguard Worker
779*d83cc019SAndroid Build Coastguard Worker if (field1 != field2)
780*d83cc019SAndroid Build Coastguard Worker printf("fields are different (%u:%u -> %u:%u)\n",
781*d83cc019SAndroid Build Coastguard Worker field1, dsl1, field2, dsl2);
782*d83cc019SAndroid Build Coastguard Worker
783*d83cc019SAndroid Build Coastguard Worker min[field1*count+i[field1]] = dsl1;
784*d83cc019SAndroid Build Coastguard Worker max[field1*count+i[field1]] = dsl2;
785*d83cc019SAndroid Build Coastguard Worker if (++i[field1] >= count)
786*d83cc019SAndroid Build Coastguard Worker break;
787*d83cc019SAndroid Build Coastguard Worker }
788*d83cc019SAndroid Build Coastguard Worker
789*d83cc019SAndroid Build Coastguard Worker write_reg(surf, saved);
790*d83cc019SAndroid Build Coastguard Worker }
791*d83cc019SAndroid Build Coastguard Worker
poll_dsl_surflive(uint32_t devid,int pipe,uint32_t * min,uint32_t * max,const int count)792*d83cc019SAndroid Build Coastguard Worker static void poll_dsl_surflive(uint32_t devid, int pipe,
793*d83cc019SAndroid Build Coastguard Worker uint32_t *min, uint32_t *max, const int count)
794*d83cc019SAndroid Build Coastguard Worker {
795*d83cc019SAndroid Build Coastguard Worker uint32_t dsl, dsl1 = 0, dsl2 = 0, surf, surf1, surf2, surflive, surfl1 = 0, surfl2, saved, tmp;
796*d83cc019SAndroid Build Coastguard Worker bool field1 = false, field2 = false;
797*d83cc019SAndroid Build Coastguard Worker int i[2] = {};
798*d83cc019SAndroid Build Coastguard Worker
799*d83cc019SAndroid Build Coastguard Worker surflive = PIPE_REG(pipe, DSPASURFLIVE);
800*d83cc019SAndroid Build Coastguard Worker dsl = PIPE_REG(pipe, PIPEA_DSL);
801*d83cc019SAndroid Build Coastguard Worker surf = dspsurf_reg(devid, pipe);
802*d83cc019SAndroid Build Coastguard Worker
803*d83cc019SAndroid Build Coastguard Worker saved = read_reg(surf);
804*d83cc019SAndroid Build Coastguard Worker
805*d83cc019SAndroid Build Coastguard Worker surf1 = saved & ~0xfff;
806*d83cc019SAndroid Build Coastguard Worker surf2 = surf1 + 128*1024;
807*d83cc019SAndroid Build Coastguard Worker
808*d83cc019SAndroid Build Coastguard Worker while (!quit) {
809*d83cc019SAndroid Build Coastguard Worker write_reg(surf, surf2);
810*d83cc019SAndroid Build Coastguard Worker
811*d83cc019SAndroid Build Coastguard Worker while (!quit) {
812*d83cc019SAndroid Build Coastguard Worker dsl1 = read_reg(dsl);
813*d83cc019SAndroid Build Coastguard Worker surfl1 = read_reg(surflive) & ~0xfff;
814*d83cc019SAndroid Build Coastguard Worker surfl2 = read_reg(surflive) & ~0xfff;
815*d83cc019SAndroid Build Coastguard Worker dsl2 = read_reg(dsl);
816*d83cc019SAndroid Build Coastguard Worker
817*d83cc019SAndroid Build Coastguard Worker field1 = dsl1 & 0x80000000;
818*d83cc019SAndroid Build Coastguard Worker field2 = dsl2 & 0x80000000;
819*d83cc019SAndroid Build Coastguard Worker dsl1 &= ~0x80000000;
820*d83cc019SAndroid Build Coastguard Worker dsl2 &= ~0x80000000;
821*d83cc019SAndroid Build Coastguard Worker
822*d83cc019SAndroid Build Coastguard Worker if (surfl2 == surf2)
823*d83cc019SAndroid Build Coastguard Worker break;
824*d83cc019SAndroid Build Coastguard Worker }
825*d83cc019SAndroid Build Coastguard Worker
826*d83cc019SAndroid Build Coastguard Worker if (surfl1 != surf2) {
827*d83cc019SAndroid Build Coastguard Worker if (field1 != field2)
828*d83cc019SAndroid Build Coastguard Worker printf("fields are different (%u:%u -> %u:%u)\n",
829*d83cc019SAndroid Build Coastguard Worker field1, dsl1, field2, dsl2);
830*d83cc019SAndroid Build Coastguard Worker
831*d83cc019SAndroid Build Coastguard Worker min[field1*count+i[field1]] = dsl1;
832*d83cc019SAndroid Build Coastguard Worker max[field1*count+i[field1]] = dsl2;
833*d83cc019SAndroid Build Coastguard Worker if (++i[field1] >= count)
834*d83cc019SAndroid Build Coastguard Worker break;
835*d83cc019SAndroid Build Coastguard Worker }
836*d83cc019SAndroid Build Coastguard Worker
837*d83cc019SAndroid Build Coastguard Worker tmp = surf1;
838*d83cc019SAndroid Build Coastguard Worker surf1 = surf2;
839*d83cc019SAndroid Build Coastguard Worker surf2 = tmp;
840*d83cc019SAndroid Build Coastguard Worker }
841*d83cc019SAndroid Build Coastguard Worker
842*d83cc019SAndroid Build Coastguard Worker write_reg(surf, saved);
843*d83cc019SAndroid Build Coastguard Worker }
844*d83cc019SAndroid Build Coastguard Worker
poll_dsl_wrap(int pipe,uint32_t * min,uint32_t * max,const int count)845*d83cc019SAndroid Build Coastguard Worker static void poll_dsl_wrap(int pipe, uint32_t *min, uint32_t *max, const int count)
846*d83cc019SAndroid Build Coastguard Worker {
847*d83cc019SAndroid Build Coastguard Worker uint32_t dsl, dsl1, dsl2;
848*d83cc019SAndroid Build Coastguard Worker bool field1, field2;
849*d83cc019SAndroid Build Coastguard Worker int i[2] = {};
850*d83cc019SAndroid Build Coastguard Worker
851*d83cc019SAndroid Build Coastguard Worker dsl = PIPE_REG(pipe, PIPEA_DSL);
852*d83cc019SAndroid Build Coastguard Worker
853*d83cc019SAndroid Build Coastguard Worker while (!quit) {
854*d83cc019SAndroid Build Coastguard Worker dsl1 = read_reg(dsl);
855*d83cc019SAndroid Build Coastguard Worker dsl2 = read_reg(dsl);
856*d83cc019SAndroid Build Coastguard Worker
857*d83cc019SAndroid Build Coastguard Worker field1 = dsl1 & 0x80000000;
858*d83cc019SAndroid Build Coastguard Worker field2 = dsl2 & 0x80000000;
859*d83cc019SAndroid Build Coastguard Worker dsl1 &= ~0x80000000;
860*d83cc019SAndroid Build Coastguard Worker dsl2 &= ~0x80000000;
861*d83cc019SAndroid Build Coastguard Worker
862*d83cc019SAndroid Build Coastguard Worker if (dsl2 >= dsl1)
863*d83cc019SAndroid Build Coastguard Worker continue;
864*d83cc019SAndroid Build Coastguard Worker
865*d83cc019SAndroid Build Coastguard Worker if (field1 != field2)
866*d83cc019SAndroid Build Coastguard Worker printf("fields are different (%u:%u -> %u:%u)\n",
867*d83cc019SAndroid Build Coastguard Worker field1, dsl1, field2, dsl2);
868*d83cc019SAndroid Build Coastguard Worker
869*d83cc019SAndroid Build Coastguard Worker min[field1*count+i[field1]] = dsl1;
870*d83cc019SAndroid Build Coastguard Worker max[field1*count+i[field1]] = dsl2;
871*d83cc019SAndroid Build Coastguard Worker if (++i[field1] >= count)
872*d83cc019SAndroid Build Coastguard Worker break;
873*d83cc019SAndroid Build Coastguard Worker }
874*d83cc019SAndroid Build Coastguard Worker }
875*d83cc019SAndroid Build Coastguard Worker
poll_dsl_field(int pipe,uint32_t * min,uint32_t * max,const int count)876*d83cc019SAndroid Build Coastguard Worker static void poll_dsl_field(int pipe, uint32_t *min, uint32_t *max, const int count)
877*d83cc019SAndroid Build Coastguard Worker {
878*d83cc019SAndroid Build Coastguard Worker uint32_t dsl, dsl1, dsl2;
879*d83cc019SAndroid Build Coastguard Worker bool field1, field2;
880*d83cc019SAndroid Build Coastguard Worker int i[2] = {};
881*d83cc019SAndroid Build Coastguard Worker
882*d83cc019SAndroid Build Coastguard Worker dsl = PIPE_REG(pipe, PIPEA_DSL);
883*d83cc019SAndroid Build Coastguard Worker
884*d83cc019SAndroid Build Coastguard Worker while (!quit) {
885*d83cc019SAndroid Build Coastguard Worker dsl1 = read_reg(dsl);
886*d83cc019SAndroid Build Coastguard Worker dsl2 = read_reg(dsl);
887*d83cc019SAndroid Build Coastguard Worker
888*d83cc019SAndroid Build Coastguard Worker field1 = dsl1 & 0x80000000;
889*d83cc019SAndroid Build Coastguard Worker field2 = dsl2 & 0x80000000;
890*d83cc019SAndroid Build Coastguard Worker dsl1 &= ~0x80000000;
891*d83cc019SAndroid Build Coastguard Worker dsl2 &= ~0x80000000;
892*d83cc019SAndroid Build Coastguard Worker
893*d83cc019SAndroid Build Coastguard Worker if (field1 == field2)
894*d83cc019SAndroid Build Coastguard Worker continue;
895*d83cc019SAndroid Build Coastguard Worker
896*d83cc019SAndroid Build Coastguard Worker min[field1*count+i[field1]] = dsl1;
897*d83cc019SAndroid Build Coastguard Worker max[field1*count+i[field1]] = dsl2;
898*d83cc019SAndroid Build Coastguard Worker if (++i[field1] >= count)
899*d83cc019SAndroid Build Coastguard Worker break;
900*d83cc019SAndroid Build Coastguard Worker }
901*d83cc019SAndroid Build Coastguard Worker }
902*d83cc019SAndroid Build Coastguard Worker
test_name(enum test test,int pipe,int bit,bool test_pixel_count)903*d83cc019SAndroid Build Coastguard Worker static const char *test_name(enum test test, int pipe, int bit, bool test_pixel_count)
904*d83cc019SAndroid Build Coastguard Worker {
905*d83cc019SAndroid Build Coastguard Worker static char str[64];
906*d83cc019SAndroid Build Coastguard Worker const char *type = test_pixel_count ? "pixel" : "dsl";
907*d83cc019SAndroid Build Coastguard Worker
908*d83cc019SAndroid Build Coastguard Worker switch (test) {
909*d83cc019SAndroid Build Coastguard Worker case TEST_PIPESTAT:
910*d83cc019SAndroid Build Coastguard Worker snprintf(str, sizeof str, "%s / pipe %c / PIPESTAT[%d] (gmch)", type, pipe_name(pipe), bit);
911*d83cc019SAndroid Build Coastguard Worker return str;
912*d83cc019SAndroid Build Coastguard Worker case TEST_IIR_GEN2:
913*d83cc019SAndroid Build Coastguard Worker snprintf(str, sizeof str, "%s / pipe %c / IIR[%d] (gen2)", type, pipe_name(pipe), bit);
914*d83cc019SAndroid Build Coastguard Worker return str;
915*d83cc019SAndroid Build Coastguard Worker case TEST_IIR_GEN3:
916*d83cc019SAndroid Build Coastguard Worker snprintf(str, sizeof str, "%s / pipe %c / IIR[%d] (gen3+)", type, pipe_name(pipe), bit);
917*d83cc019SAndroid Build Coastguard Worker return str;
918*d83cc019SAndroid Build Coastguard Worker case TEST_DEIIR:
919*d83cc019SAndroid Build Coastguard Worker snprintf(str, sizeof str, "%s / pipe %c / DEIIR[%d] (pch)", type, pipe_name(pipe), bit);
920*d83cc019SAndroid Build Coastguard Worker return str;
921*d83cc019SAndroid Build Coastguard Worker case TEST_FRAMECOUNT_GEN3:
922*d83cc019SAndroid Build Coastguard Worker snprintf(str, sizeof str, "%s / pipe %c / Frame count (gen3/4)", type, pipe_name(pipe));
923*d83cc019SAndroid Build Coastguard Worker return str;
924*d83cc019SAndroid Build Coastguard Worker case TEST_FRAMECOUNT_G4X:
925*d83cc019SAndroid Build Coastguard Worker snprintf(str, sizeof str, "%s / pipe %c / Frame count (g4x+)", type, pipe_name(pipe));
926*d83cc019SAndroid Build Coastguard Worker return str;
927*d83cc019SAndroid Build Coastguard Worker case TEST_FLIPCOUNT:
928*d83cc019SAndroid Build Coastguard Worker snprintf(str, sizeof str, "%s / pipe %c / Flip count (g4x+)", type, pipe_name(pipe));
929*d83cc019SAndroid Build Coastguard Worker return str;
930*d83cc019SAndroid Build Coastguard Worker case TEST_PAN:
931*d83cc019SAndroid Build Coastguard Worker snprintf(str, sizeof str, "%s / pipe %c / Pan", type, pipe_name(pipe));
932*d83cc019SAndroid Build Coastguard Worker return str;
933*d83cc019SAndroid Build Coastguard Worker case TEST_FLIP:
934*d83cc019SAndroid Build Coastguard Worker snprintf(str, sizeof str, "%s / pipe %c / Flip", type, pipe_name(pipe));
935*d83cc019SAndroid Build Coastguard Worker return str;
936*d83cc019SAndroid Build Coastguard Worker case TEST_SURFLIVE:
937*d83cc019SAndroid Build Coastguard Worker snprintf(str, sizeof str, "%s / pipe %c / Surflive", type, pipe_name(pipe));
938*d83cc019SAndroid Build Coastguard Worker return str;
939*d83cc019SAndroid Build Coastguard Worker case TEST_WRAP:
940*d83cc019SAndroid Build Coastguard Worker snprintf(str, sizeof str, "%s / pipe %c / Wrap", type, pipe_name(pipe));
941*d83cc019SAndroid Build Coastguard Worker return str;
942*d83cc019SAndroid Build Coastguard Worker case TEST_FIELD:
943*d83cc019SAndroid Build Coastguard Worker snprintf(str, sizeof str, "%s / pipe %c / Field", type, pipe_name(pipe));
944*d83cc019SAndroid Build Coastguard Worker return str;
945*d83cc019SAndroid Build Coastguard Worker default:
946*d83cc019SAndroid Build Coastguard Worker return "";
947*d83cc019SAndroid Build Coastguard Worker }
948*d83cc019SAndroid Build Coastguard Worker }
949*d83cc019SAndroid Build Coastguard Worker
usage(const char * name)950*d83cc019SAndroid Build Coastguard Worker static void __attribute__((noreturn)) usage(const char *name)
951*d83cc019SAndroid Build Coastguard Worker {
952*d83cc019SAndroid Build Coastguard Worker fprintf(stderr, "Usage: %s [options]\n"
953*d83cc019SAndroid Build Coastguard Worker " -t,--test <pipestat|iir|framecount|flipcount|pan|flip|surflive|wrap|field>\n"
954*d83cc019SAndroid Build Coastguard Worker " -p,--pipe <pipe>\n"
955*d83cc019SAndroid Build Coastguard Worker " -b,--bit <bit>\n"
956*d83cc019SAndroid Build Coastguard Worker " -l,--line <target scanline/pixel>\n"
957*d83cc019SAndroid Build Coastguard Worker " -f,--fuzz <target fuzz>\n"
958*d83cc019SAndroid Build Coastguard Worker " -x,--pixel\n",
959*d83cc019SAndroid Build Coastguard Worker name);
960*d83cc019SAndroid Build Coastguard Worker exit(1);
961*d83cc019SAndroid Build Coastguard Worker }
962*d83cc019SAndroid Build Coastguard Worker
main(int argc,char * argv[])963*d83cc019SAndroid Build Coastguard Worker int main(int argc, char *argv[])
964*d83cc019SAndroid Build Coastguard Worker {
965*d83cc019SAndroid Build Coastguard Worker int i;
966*d83cc019SAndroid Build Coastguard Worker int pipe = 0, bit = 0, target_scanline = 0, target_fuzz = 1;
967*d83cc019SAndroid Build Coastguard Worker bool test_pixelcount = false;
968*d83cc019SAndroid Build Coastguard Worker uint32_t devid;
969*d83cc019SAndroid Build Coastguard Worker uint32_t min[2*128] = {};
970*d83cc019SAndroid Build Coastguard Worker uint32_t max[2*128] = {};
971*d83cc019SAndroid Build Coastguard Worker uint32_t a, b;
972*d83cc019SAndroid Build Coastguard Worker enum test test = TEST_INVALID;
973*d83cc019SAndroid Build Coastguard Worker const int count = ARRAY_SIZE(min)/2;
974*d83cc019SAndroid Build Coastguard Worker
975*d83cc019SAndroid Build Coastguard Worker for (;;) {
976*d83cc019SAndroid Build Coastguard Worker static const struct option long_options[] = {
977*d83cc019SAndroid Build Coastguard Worker { .name = "test", .has_arg = required_argument, },
978*d83cc019SAndroid Build Coastguard Worker { .name = "pipe", .has_arg = required_argument, },
979*d83cc019SAndroid Build Coastguard Worker { .name = "bit", .has_arg = required_argument, },
980*d83cc019SAndroid Build Coastguard Worker { .name = "line", .has_arg = required_argument, },
981*d83cc019SAndroid Build Coastguard Worker { .name = "fuzz", .has_arg = required_argument, },
982*d83cc019SAndroid Build Coastguard Worker { .name = "pixel", .has_arg = no_argument, },
983*d83cc019SAndroid Build Coastguard Worker { },
984*d83cc019SAndroid Build Coastguard Worker };
985*d83cc019SAndroid Build Coastguard Worker
986*d83cc019SAndroid Build Coastguard Worker int opt = getopt_long(argc, argv, "t:p:b:l:f:x", long_options, NULL);
987*d83cc019SAndroid Build Coastguard Worker if (opt == -1)
988*d83cc019SAndroid Build Coastguard Worker break;
989*d83cc019SAndroid Build Coastguard Worker
990*d83cc019SAndroid Build Coastguard Worker switch (opt) {
991*d83cc019SAndroid Build Coastguard Worker case 't':
992*d83cc019SAndroid Build Coastguard Worker if (!strcmp(optarg, "pipestat"))
993*d83cc019SAndroid Build Coastguard Worker test = TEST_PIPESTAT;
994*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "iir"))
995*d83cc019SAndroid Build Coastguard Worker test = TEST_IIR;
996*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "framecount"))
997*d83cc019SAndroid Build Coastguard Worker test = TEST_FRAMECOUNT;
998*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "flipcount"))
999*d83cc019SAndroid Build Coastguard Worker test = TEST_FLIPCOUNT;
1000*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "pan"))
1001*d83cc019SAndroid Build Coastguard Worker test = TEST_PAN;
1002*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "flip"))
1003*d83cc019SAndroid Build Coastguard Worker test = TEST_FLIP;
1004*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "surflive"))
1005*d83cc019SAndroid Build Coastguard Worker test = TEST_SURFLIVE;
1006*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "wrap"))
1007*d83cc019SAndroid Build Coastguard Worker test = TEST_WRAP;
1008*d83cc019SAndroid Build Coastguard Worker else if (!strcmp(optarg, "field"))
1009*d83cc019SAndroid Build Coastguard Worker test = TEST_FIELD;
1010*d83cc019SAndroid Build Coastguard Worker else
1011*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1012*d83cc019SAndroid Build Coastguard Worker break;
1013*d83cc019SAndroid Build Coastguard Worker case 'p':
1014*d83cc019SAndroid Build Coastguard Worker if (optarg[1] != '\0')
1015*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1016*d83cc019SAndroid Build Coastguard Worker pipe = optarg[0];
1017*d83cc019SAndroid Build Coastguard Worker if (pipe >= 'a')
1018*d83cc019SAndroid Build Coastguard Worker pipe -= 'a';
1019*d83cc019SAndroid Build Coastguard Worker else if (pipe >= 'A')
1020*d83cc019SAndroid Build Coastguard Worker pipe -= 'A';
1021*d83cc019SAndroid Build Coastguard Worker else if (pipe >= '0')
1022*d83cc019SAndroid Build Coastguard Worker pipe -= '0';
1023*d83cc019SAndroid Build Coastguard Worker else
1024*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1025*d83cc019SAndroid Build Coastguard Worker if (pipe < 0 || pipe > 2)
1026*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1027*d83cc019SAndroid Build Coastguard Worker break;
1028*d83cc019SAndroid Build Coastguard Worker case 'b':
1029*d83cc019SAndroid Build Coastguard Worker bit = atoi(optarg);
1030*d83cc019SAndroid Build Coastguard Worker if (bit < 0 || bit > 31)
1031*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1032*d83cc019SAndroid Build Coastguard Worker break;
1033*d83cc019SAndroid Build Coastguard Worker case 'l':
1034*d83cc019SAndroid Build Coastguard Worker target_scanline = atoi(optarg);
1035*d83cc019SAndroid Build Coastguard Worker if (target_scanline < 0)
1036*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1037*d83cc019SAndroid Build Coastguard Worker break;
1038*d83cc019SAndroid Build Coastguard Worker case 'f':
1039*d83cc019SAndroid Build Coastguard Worker target_fuzz = atoi(optarg);
1040*d83cc019SAndroid Build Coastguard Worker if (target_fuzz <= 0)
1041*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1042*d83cc019SAndroid Build Coastguard Worker break;
1043*d83cc019SAndroid Build Coastguard Worker case 'x':
1044*d83cc019SAndroid Build Coastguard Worker test_pixelcount = true;
1045*d83cc019SAndroid Build Coastguard Worker break;
1046*d83cc019SAndroid Build Coastguard Worker }
1047*d83cc019SAndroid Build Coastguard Worker }
1048*d83cc019SAndroid Build Coastguard Worker
1049*d83cc019SAndroid Build Coastguard Worker devid = intel_get_pci_device()->device_id;
1050*d83cc019SAndroid Build Coastguard Worker
1051*d83cc019SAndroid Build Coastguard Worker /*
1052*d83cc019SAndroid Build Coastguard Worker * check if the requires registers are
1053*d83cc019SAndroid Build Coastguard Worker * avilable on the current platform.
1054*d83cc019SAndroid Build Coastguard Worker */
1055*d83cc019SAndroid Build Coastguard Worker if (IS_GEN2(devid)) {
1056*d83cc019SAndroid Build Coastguard Worker if (pipe > 1)
1057*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1058*d83cc019SAndroid Build Coastguard Worker
1059*d83cc019SAndroid Build Coastguard Worker if (test_pixelcount)
1060*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1061*d83cc019SAndroid Build Coastguard Worker
1062*d83cc019SAndroid Build Coastguard Worker switch (test) {
1063*d83cc019SAndroid Build Coastguard Worker case TEST_IIR:
1064*d83cc019SAndroid Build Coastguard Worker test = TEST_IIR_GEN2;
1065*d83cc019SAndroid Build Coastguard Worker break;
1066*d83cc019SAndroid Build Coastguard Worker case TEST_PIPESTAT:
1067*d83cc019SAndroid Build Coastguard Worker case TEST_PAN:
1068*d83cc019SAndroid Build Coastguard Worker break;
1069*d83cc019SAndroid Build Coastguard Worker case TEST_FLIP:
1070*d83cc019SAndroid Build Coastguard Worker test = TEST_PAN;
1071*d83cc019SAndroid Build Coastguard Worker break;
1072*d83cc019SAndroid Build Coastguard Worker default:
1073*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1074*d83cc019SAndroid Build Coastguard Worker }
1075*d83cc019SAndroid Build Coastguard Worker } else if (IS_GEN3(devid) ||
1076*d83cc019SAndroid Build Coastguard Worker (IS_GEN4(devid) && !IS_G4X(devid))) {
1077*d83cc019SAndroid Build Coastguard Worker if (pipe > 1)
1078*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1079*d83cc019SAndroid Build Coastguard Worker
1080*d83cc019SAndroid Build Coastguard Worker switch (test) {
1081*d83cc019SAndroid Build Coastguard Worker case TEST_IIR:
1082*d83cc019SAndroid Build Coastguard Worker test = TEST_IIR_GEN3;
1083*d83cc019SAndroid Build Coastguard Worker break;
1084*d83cc019SAndroid Build Coastguard Worker case TEST_FRAMECOUNT:
1085*d83cc019SAndroid Build Coastguard Worker test = TEST_FRAMECOUNT_GEN3;
1086*d83cc019SAndroid Build Coastguard Worker break;
1087*d83cc019SAndroid Build Coastguard Worker case TEST_PIPESTAT:
1088*d83cc019SAndroid Build Coastguard Worker case TEST_PAN:
1089*d83cc019SAndroid Build Coastguard Worker case TEST_WRAP:
1090*d83cc019SAndroid Build Coastguard Worker case TEST_FIELD:
1091*d83cc019SAndroid Build Coastguard Worker break;
1092*d83cc019SAndroid Build Coastguard Worker case TEST_FLIP:
1093*d83cc019SAndroid Build Coastguard Worker if (IS_GEN3(devid))
1094*d83cc019SAndroid Build Coastguard Worker test = TEST_PAN;
1095*d83cc019SAndroid Build Coastguard Worker break;
1096*d83cc019SAndroid Build Coastguard Worker default:
1097*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1098*d83cc019SAndroid Build Coastguard Worker }
1099*d83cc019SAndroid Build Coastguard Worker } else if (IS_G4X(devid) ||
1100*d83cc019SAndroid Build Coastguard Worker IS_VALLEYVIEW(devid) || IS_CHERRYVIEW(devid)) {
1101*d83cc019SAndroid Build Coastguard Worker if (IS_VALLEYVIEW(devid) || IS_CHERRYVIEW(devid))
1102*d83cc019SAndroid Build Coastguard Worker vlv_offset = 0x180000;
1103*d83cc019SAndroid Build Coastguard Worker if (IS_CHERRYVIEW(devid))
1104*d83cc019SAndroid Build Coastguard Worker pipe_offset[2] = 0x4000;
1105*d83cc019SAndroid Build Coastguard Worker
1106*d83cc019SAndroid Build Coastguard Worker if (pipe > 1 && !IS_CHERRYVIEW(devid))
1107*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1108*d83cc019SAndroid Build Coastguard Worker
1109*d83cc019SAndroid Build Coastguard Worker if (test_pixelcount)
1110*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1111*d83cc019SAndroid Build Coastguard Worker
1112*d83cc019SAndroid Build Coastguard Worker switch (test) {
1113*d83cc019SAndroid Build Coastguard Worker case TEST_IIR:
1114*d83cc019SAndroid Build Coastguard Worker test = TEST_IIR_GEN3;
1115*d83cc019SAndroid Build Coastguard Worker break;
1116*d83cc019SAndroid Build Coastguard Worker case TEST_FRAMECOUNT:
1117*d83cc019SAndroid Build Coastguard Worker test = TEST_FRAMECOUNT_G4X;
1118*d83cc019SAndroid Build Coastguard Worker break;
1119*d83cc019SAndroid Build Coastguard Worker case TEST_FLIPCOUNT:
1120*d83cc019SAndroid Build Coastguard Worker case TEST_PIPESTAT:
1121*d83cc019SAndroid Build Coastguard Worker case TEST_PAN:
1122*d83cc019SAndroid Build Coastguard Worker case TEST_FLIP:
1123*d83cc019SAndroid Build Coastguard Worker case TEST_SURFLIVE:
1124*d83cc019SAndroid Build Coastguard Worker case TEST_WRAP:
1125*d83cc019SAndroid Build Coastguard Worker case TEST_FIELD:
1126*d83cc019SAndroid Build Coastguard Worker break;
1127*d83cc019SAndroid Build Coastguard Worker default:
1128*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1129*d83cc019SAndroid Build Coastguard Worker }
1130*d83cc019SAndroid Build Coastguard Worker } else if (HAS_PCH_SPLIT(devid) &&
1131*d83cc019SAndroid Build Coastguard Worker (IS_GEN5(devid) || IS_GEN6(devid) || IS_GEN7(devid))) {
1132*d83cc019SAndroid Build Coastguard Worker if (pipe > 1 &&
1133*d83cc019SAndroid Build Coastguard Worker (IS_GEN5(devid) || IS_GEN6(devid)))
1134*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1135*d83cc019SAndroid Build Coastguard Worker
1136*d83cc019SAndroid Build Coastguard Worker if (test_pixelcount)
1137*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1138*d83cc019SAndroid Build Coastguard Worker
1139*d83cc019SAndroid Build Coastguard Worker switch (test) {
1140*d83cc019SAndroid Build Coastguard Worker case TEST_IIR:
1141*d83cc019SAndroid Build Coastguard Worker test = TEST_DEIIR;
1142*d83cc019SAndroid Build Coastguard Worker break;
1143*d83cc019SAndroid Build Coastguard Worker case TEST_FRAMECOUNT:
1144*d83cc019SAndroid Build Coastguard Worker test = TEST_FRAMECOUNT_G4X;
1145*d83cc019SAndroid Build Coastguard Worker break;
1146*d83cc019SAndroid Build Coastguard Worker case TEST_FLIPCOUNT:
1147*d83cc019SAndroid Build Coastguard Worker case TEST_PAN:
1148*d83cc019SAndroid Build Coastguard Worker case TEST_FLIP:
1149*d83cc019SAndroid Build Coastguard Worker case TEST_SURFLIVE:
1150*d83cc019SAndroid Build Coastguard Worker case TEST_WRAP:
1151*d83cc019SAndroid Build Coastguard Worker case TEST_FIELD:
1152*d83cc019SAndroid Build Coastguard Worker break;
1153*d83cc019SAndroid Build Coastguard Worker default:
1154*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1155*d83cc019SAndroid Build Coastguard Worker }
1156*d83cc019SAndroid Build Coastguard Worker } else if (intel_gen(devid) >= 8) {
1157*d83cc019SAndroid Build Coastguard Worker if (test_pixelcount)
1158*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1159*d83cc019SAndroid Build Coastguard Worker
1160*d83cc019SAndroid Build Coastguard Worker switch (test) {
1161*d83cc019SAndroid Build Coastguard Worker case TEST_IIR:
1162*d83cc019SAndroid Build Coastguard Worker test = TEST_DEIIR;
1163*d83cc019SAndroid Build Coastguard Worker break;
1164*d83cc019SAndroid Build Coastguard Worker case TEST_FRAMECOUNT:
1165*d83cc019SAndroid Build Coastguard Worker test = TEST_FRAMECOUNT_G4X;
1166*d83cc019SAndroid Build Coastguard Worker break;
1167*d83cc019SAndroid Build Coastguard Worker case TEST_FLIPCOUNT:
1168*d83cc019SAndroid Build Coastguard Worker case TEST_PAN:
1169*d83cc019SAndroid Build Coastguard Worker case TEST_FLIP:
1170*d83cc019SAndroid Build Coastguard Worker case TEST_SURFLIVE:
1171*d83cc019SAndroid Build Coastguard Worker case TEST_WRAP:
1172*d83cc019SAndroid Build Coastguard Worker case TEST_FIELD:
1173*d83cc019SAndroid Build Coastguard Worker break;
1174*d83cc019SAndroid Build Coastguard Worker default:
1175*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1176*d83cc019SAndroid Build Coastguard Worker }
1177*d83cc019SAndroid Build Coastguard Worker } else {
1178*d83cc019SAndroid Build Coastguard Worker usage(argv[0]);
1179*d83cc019SAndroid Build Coastguard Worker }
1180*d83cc019SAndroid Build Coastguard Worker
1181*d83cc019SAndroid Build Coastguard Worker switch (test) {
1182*d83cc019SAndroid Build Coastguard Worker case TEST_IIR:
1183*d83cc019SAndroid Build Coastguard Worker case TEST_FRAMECOUNT:
1184*d83cc019SAndroid Build Coastguard Worker /* should no longer have the generic tests here */
1185*d83cc019SAndroid Build Coastguard Worker assert(0);
1186*d83cc019SAndroid Build Coastguard Worker default:
1187*d83cc019SAndroid Build Coastguard Worker break;
1188*d83cc019SAndroid Build Coastguard Worker }
1189*d83cc019SAndroid Build Coastguard Worker
1190*d83cc019SAndroid Build Coastguard Worker intel_register_access_init(intel_get_pci_device(), 0, -1);
1191*d83cc019SAndroid Build Coastguard Worker
1192*d83cc019SAndroid Build Coastguard Worker printf("%s?\n", test_name(test, pipe, bit, test_pixelcount));
1193*d83cc019SAndroid Build Coastguard Worker
1194*d83cc019SAndroid Build Coastguard Worker signal(SIGHUP, sighandler);
1195*d83cc019SAndroid Build Coastguard Worker signal(SIGINT, sighandler);
1196*d83cc019SAndroid Build Coastguard Worker signal(SIGTERM, sighandler);
1197*d83cc019SAndroid Build Coastguard Worker
1198*d83cc019SAndroid Build Coastguard Worker switch (test) {
1199*d83cc019SAndroid Build Coastguard Worker case TEST_PIPESTAT:
1200*d83cc019SAndroid Build Coastguard Worker if (test_pixelcount)
1201*d83cc019SAndroid Build Coastguard Worker poll_pixel_pipestat(pipe, bit, min, max, count);
1202*d83cc019SAndroid Build Coastguard Worker else
1203*d83cc019SAndroid Build Coastguard Worker poll_dsl_pipestat(pipe, bit, min, max, count);
1204*d83cc019SAndroid Build Coastguard Worker break;
1205*d83cc019SAndroid Build Coastguard Worker case TEST_IIR_GEN2:
1206*d83cc019SAndroid Build Coastguard Worker assert(!test_pixelcount);
1207*d83cc019SAndroid Build Coastguard Worker poll_dsl_iir_gen2(pipe, bit, min, max, count);
1208*d83cc019SAndroid Build Coastguard Worker break;
1209*d83cc019SAndroid Build Coastguard Worker case TEST_IIR_GEN3:
1210*d83cc019SAndroid Build Coastguard Worker if (test_pixelcount)
1211*d83cc019SAndroid Build Coastguard Worker poll_pixel_iir_gen3(pipe, bit, min, max, count);
1212*d83cc019SAndroid Build Coastguard Worker else
1213*d83cc019SAndroid Build Coastguard Worker poll_dsl_iir_gen3(pipe, bit, min, max, count);
1214*d83cc019SAndroid Build Coastguard Worker break;
1215*d83cc019SAndroid Build Coastguard Worker case TEST_DEIIR:
1216*d83cc019SAndroid Build Coastguard Worker assert(!test_pixelcount);
1217*d83cc019SAndroid Build Coastguard Worker poll_dsl_deiir(devid, pipe, bit, min, max, count);
1218*d83cc019SAndroid Build Coastguard Worker break;
1219*d83cc019SAndroid Build Coastguard Worker case TEST_FRAMECOUNT_GEN3:
1220*d83cc019SAndroid Build Coastguard Worker if (test_pixelcount)
1221*d83cc019SAndroid Build Coastguard Worker poll_pixel_framecount_gen3(pipe, min, max, count);
1222*d83cc019SAndroid Build Coastguard Worker else
1223*d83cc019SAndroid Build Coastguard Worker poll_dsl_framecount_gen3(pipe, min, max, count);
1224*d83cc019SAndroid Build Coastguard Worker break;
1225*d83cc019SAndroid Build Coastguard Worker case TEST_FRAMECOUNT_G4X:
1226*d83cc019SAndroid Build Coastguard Worker assert(!test_pixelcount);
1227*d83cc019SAndroid Build Coastguard Worker poll_dsl_framecount_g4x(pipe, min, max, count);
1228*d83cc019SAndroid Build Coastguard Worker break;
1229*d83cc019SAndroid Build Coastguard Worker case TEST_FLIPCOUNT:
1230*d83cc019SAndroid Build Coastguard Worker assert(!test_pixelcount);
1231*d83cc019SAndroid Build Coastguard Worker poll_dsl_flipcount_g4x(devid, pipe, min, max, count);
1232*d83cc019SAndroid Build Coastguard Worker break;
1233*d83cc019SAndroid Build Coastguard Worker case TEST_PAN:
1234*d83cc019SAndroid Build Coastguard Worker if (test_pixelcount)
1235*d83cc019SAndroid Build Coastguard Worker poll_pixel_pan(devid, pipe, target_scanline, target_fuzz,
1236*d83cc019SAndroid Build Coastguard Worker min, max, count);
1237*d83cc019SAndroid Build Coastguard Worker else
1238*d83cc019SAndroid Build Coastguard Worker poll_dsl_pan(devid, pipe, target_scanline, target_fuzz,
1239*d83cc019SAndroid Build Coastguard Worker min, max, count);
1240*d83cc019SAndroid Build Coastguard Worker break;
1241*d83cc019SAndroid Build Coastguard Worker case TEST_FLIP:
1242*d83cc019SAndroid Build Coastguard Worker if (test_pixelcount)
1243*d83cc019SAndroid Build Coastguard Worker poll_pixel_flip(devid, pipe, target_scanline, target_fuzz,
1244*d83cc019SAndroid Build Coastguard Worker min, max, count);
1245*d83cc019SAndroid Build Coastguard Worker else
1246*d83cc019SAndroid Build Coastguard Worker poll_dsl_flip(devid, pipe, target_scanline, target_fuzz,
1247*d83cc019SAndroid Build Coastguard Worker min, max, count);
1248*d83cc019SAndroid Build Coastguard Worker break;
1249*d83cc019SAndroid Build Coastguard Worker case TEST_SURFLIVE:
1250*d83cc019SAndroid Build Coastguard Worker poll_dsl_surflive(devid, pipe, min, max, count);
1251*d83cc019SAndroid Build Coastguard Worker break;
1252*d83cc019SAndroid Build Coastguard Worker case TEST_WRAP:
1253*d83cc019SAndroid Build Coastguard Worker if (test_pixelcount)
1254*d83cc019SAndroid Build Coastguard Worker poll_pixel_wrap(pipe, min, max, count);
1255*d83cc019SAndroid Build Coastguard Worker else
1256*d83cc019SAndroid Build Coastguard Worker poll_dsl_wrap(pipe, min, max, count);
1257*d83cc019SAndroid Build Coastguard Worker break;
1258*d83cc019SAndroid Build Coastguard Worker case TEST_FIELD:
1259*d83cc019SAndroid Build Coastguard Worker poll_dsl_field(pipe, min, max, count);
1260*d83cc019SAndroid Build Coastguard Worker break;
1261*d83cc019SAndroid Build Coastguard Worker default:
1262*d83cc019SAndroid Build Coastguard Worker assert(0);
1263*d83cc019SAndroid Build Coastguard Worker }
1264*d83cc019SAndroid Build Coastguard Worker
1265*d83cc019SAndroid Build Coastguard Worker intel_register_access_fini();
1266*d83cc019SAndroid Build Coastguard Worker
1267*d83cc019SAndroid Build Coastguard Worker if (quit)
1268*d83cc019SAndroid Build Coastguard Worker return 0;
1269*d83cc019SAndroid Build Coastguard Worker
1270*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < count; i++) {
1271*d83cc019SAndroid Build Coastguard Worker if (min[0*count+i] == 0 && max[0*count+i] == 0)
1272*d83cc019SAndroid Build Coastguard Worker break;
1273*d83cc019SAndroid Build Coastguard Worker printf("[%u] %4u - %4u (%4u)\n", 0, min[0*count+i], max[0*count+i],
1274*d83cc019SAndroid Build Coastguard Worker (min[0*count+i] + max[0*count+i] + 1) >> 1);
1275*d83cc019SAndroid Build Coastguard Worker }
1276*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < count; i++) {
1277*d83cc019SAndroid Build Coastguard Worker if (min[1*count+i] == 0 && max[1*count+i] == 0)
1278*d83cc019SAndroid Build Coastguard Worker break;
1279*d83cc019SAndroid Build Coastguard Worker printf("[%u] %4u - %4u (%4u)\n", 1, min[1*count+i], max[1*count+i],
1280*d83cc019SAndroid Build Coastguard Worker (min[1*count+i] + max[1*count+i] + 1) >> 1);
1281*d83cc019SAndroid Build Coastguard Worker }
1282*d83cc019SAndroid Build Coastguard Worker
1283*d83cc019SAndroid Build Coastguard Worker a = 0;
1284*d83cc019SAndroid Build Coastguard Worker b = 0xffffffff;
1285*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < count; i++) {
1286*d83cc019SAndroid Build Coastguard Worker if (min[0*count+i] == 0 && max[0*count+i] == 0)
1287*d83cc019SAndroid Build Coastguard Worker break;
1288*d83cc019SAndroid Build Coastguard Worker a = max(a, min[0*count+i]);
1289*d83cc019SAndroid Build Coastguard Worker b = min(b, max[0*count+i]);
1290*d83cc019SAndroid Build Coastguard Worker }
1291*d83cc019SAndroid Build Coastguard Worker
1292*d83cc019SAndroid Build Coastguard Worker printf("%s: [%u] %6u - %6u\n", test_name(test, pipe, bit, test_pixelcount), 0, a, b);
1293*d83cc019SAndroid Build Coastguard Worker
1294*d83cc019SAndroid Build Coastguard Worker a = 0;
1295*d83cc019SAndroid Build Coastguard Worker b = 0xffffffff;
1296*d83cc019SAndroid Build Coastguard Worker for (i = 0; i < count; i++) {
1297*d83cc019SAndroid Build Coastguard Worker if (min[1*count+i] == 0 && max[1*count+i] == 0)
1298*d83cc019SAndroid Build Coastguard Worker break;
1299*d83cc019SAndroid Build Coastguard Worker a = max(a, min[1*count+i]);
1300*d83cc019SAndroid Build Coastguard Worker b = min(b, max[1*count+i]);
1301*d83cc019SAndroid Build Coastguard Worker }
1302*d83cc019SAndroid Build Coastguard Worker
1303*d83cc019SAndroid Build Coastguard Worker printf("%s: [%u] %6u - %6u\n", test_name(test, pipe, bit, test_pixelcount), 1, a, b);
1304*d83cc019SAndroid Build Coastguard Worker
1305*d83cc019SAndroid Build Coastguard Worker return 0;
1306*d83cc019SAndroid Build Coastguard Worker }
1307