xref: /aosp_15_r20/external/igt-gpu-tools/tools/intel_display_poller.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2014 Intel Corporation
3*d83cc019SAndroid Build Coastguard Worker  *
4*d83cc019SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*d83cc019SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*d83cc019SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*d83cc019SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*d83cc019SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*d83cc019SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*d83cc019SAndroid Build Coastguard Worker  *
11*d83cc019SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*d83cc019SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*d83cc019SAndroid Build Coastguard Worker  * Software.
14*d83cc019SAndroid Build Coastguard Worker  *
15*d83cc019SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*d83cc019SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*d83cc019SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*d83cc019SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*d83cc019SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20*d83cc019SAndroid Build Coastguard Worker  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
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