xref: /aosp_15_r20/external/igt-gpu-tools/tools/skl_compute_wrpll.c (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
1*d83cc019SAndroid Build Coastguard Worker /*
2*d83cc019SAndroid Build Coastguard Worker  * Copyright © 2015 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 #include <assert.h>
25*d83cc019SAndroid Build Coastguard Worker #include <inttypes.h>
26*d83cc019SAndroid Build Coastguard Worker #include <limits.h>
27*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
28*d83cc019SAndroid Build Coastguard Worker #include <stdbool.h>
29*d83cc019SAndroid Build Coastguard Worker #include <stdint.h>
30*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
31*d83cc019SAndroid Build Coastguard Worker #include <string.h>
32*d83cc019SAndroid Build Coastguard Worker 
33*d83cc019SAndroid Build Coastguard Worker #include "igt_stats.h"
34*d83cc019SAndroid Build Coastguard Worker 
35*d83cc019SAndroid Build Coastguard Worker #define U64_MAX         ((uint64_t)~0ULL)
36*d83cc019SAndroid Build Coastguard Worker #define ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
37*d83cc019SAndroid Build Coastguard Worker 
38*d83cc019SAndroid Build Coastguard Worker #define WARN(cond, msg)	printf(msg)
39*d83cc019SAndroid Build Coastguard Worker 
40*d83cc019SAndroid Build Coastguard Worker #define KHz(x) (1000 * (x))
41*d83cc019SAndroid Build Coastguard Worker #define MHz(x) KHz(1000 * (x))
42*d83cc019SAndroid Build Coastguard Worker 
43*d83cc019SAndroid Build Coastguard Worker #define abs_diff(a, b) ({			\
44*d83cc019SAndroid Build Coastguard Worker 	typeof(a) __a = (a);			\
45*d83cc019SAndroid Build Coastguard Worker 	typeof(b) __b = (b);			\
46*d83cc019SAndroid Build Coastguard Worker 	(void) (&__a == &__b);			\
47*d83cc019SAndroid Build Coastguard Worker 	__a > __b ? (__a - __b) : (__b - __a); })
48*d83cc019SAndroid Build Coastguard Worker 
div64_u64(uint64_t dividend,uint64_t divisor)49*d83cc019SAndroid Build Coastguard Worker static inline uint64_t div64_u64(uint64_t dividend, uint64_t divisor)
50*d83cc019SAndroid Build Coastguard Worker {
51*d83cc019SAndroid Build Coastguard Worker 	return dividend / divisor;
52*d83cc019SAndroid Build Coastguard Worker }
53*d83cc019SAndroid Build Coastguard Worker 
div_u64(uint64_t dividend,uint32_t divisor)54*d83cc019SAndroid Build Coastguard Worker static inline uint64_t div_u64(uint64_t dividend, uint32_t divisor)
55*d83cc019SAndroid Build Coastguard Worker {
56*d83cc019SAndroid Build Coastguard Worker 	return dividend / divisor;
57*d83cc019SAndroid Build Coastguard Worker }
58*d83cc019SAndroid Build Coastguard Worker 
59*d83cc019SAndroid Build Coastguard Worker struct skl_wrpll_params {
60*d83cc019SAndroid Build Coastguard Worker 	uint32_t        dco_fraction;
61*d83cc019SAndroid Build Coastguard Worker 	uint32_t        dco_integer;
62*d83cc019SAndroid Build Coastguard Worker 	uint32_t        qdiv_ratio;
63*d83cc019SAndroid Build Coastguard Worker 	uint32_t        qdiv_mode;
64*d83cc019SAndroid Build Coastguard Worker 	uint32_t        kdiv;
65*d83cc019SAndroid Build Coastguard Worker 	uint32_t        pdiv;
66*d83cc019SAndroid Build Coastguard Worker 	uint32_t        central_freq;
67*d83cc019SAndroid Build Coastguard Worker 
68*d83cc019SAndroid Build Coastguard Worker 	/* for this test code only */
69*d83cc019SAndroid Build Coastguard Worker 	uint64_t central_freq_hz;
70*d83cc019SAndroid Build Coastguard Worker 	unsigned int p0, p1, p2;
71*d83cc019SAndroid Build Coastguard Worker };
72*d83cc019SAndroid Build Coastguard Worker 
73*d83cc019SAndroid Build Coastguard Worker static bool
skl_ddi_calculate_wrpll1(int clock,struct skl_wrpll_params * wrpll_params)74*d83cc019SAndroid Build Coastguard Worker skl_ddi_calculate_wrpll1(int clock /* in Hz */,
75*d83cc019SAndroid Build Coastguard Worker 			 struct skl_wrpll_params *wrpll_params)
76*d83cc019SAndroid Build Coastguard Worker {
77*d83cc019SAndroid Build Coastguard Worker 	uint64_t afe_clock = clock * 5; /* AFE Clock is 5x Pixel clock */
78*d83cc019SAndroid Build Coastguard Worker 	uint64_t dco_central_freq[3] = {8400000000ULL,
79*d83cc019SAndroid Build Coastguard Worker 					9000000000ULL,
80*d83cc019SAndroid Build Coastguard Worker 					9600000000ULL};
81*d83cc019SAndroid Build Coastguard Worker 	uint32_t min_dco_pdeviation = 100; /* DCO freq must be within +1%/-6% */
82*d83cc019SAndroid Build Coastguard Worker 	uint32_t min_dco_ndeviation = 600; /* of the DCO central freq */
83*d83cc019SAndroid Build Coastguard Worker 	uint32_t min_dco_index = 3;
84*d83cc019SAndroid Build Coastguard Worker 	uint32_t P0[4] = {1, 2, 3, 7};
85*d83cc019SAndroid Build Coastguard Worker 	uint32_t P2[4] = {1, 2, 3, 5};
86*d83cc019SAndroid Build Coastguard Worker 	bool found = false;
87*d83cc019SAndroid Build Coastguard Worker 	uint32_t candidate_p = 0;
88*d83cc019SAndroid Build Coastguard Worker 	uint32_t candidate_p0[3] = {0}, candidate_p1[3] = {0};
89*d83cc019SAndroid Build Coastguard Worker 	uint32_t candidate_p2[3] = {0};
90*d83cc019SAndroid Build Coastguard Worker 	uint32_t dco_central_freq_deviation[3];
91*d83cc019SAndroid Build Coastguard Worker 	uint32_t i, P1, k, dco_count;
92*d83cc019SAndroid Build Coastguard Worker 	bool retry_with_odd = false;
93*d83cc019SAndroid Build Coastguard Worker 
94*d83cc019SAndroid Build Coastguard Worker 	/* Determine P0, P1 or P2 */
95*d83cc019SAndroid Build Coastguard Worker 	for (dco_count = 0; dco_count < 3; dco_count++) {
96*d83cc019SAndroid Build Coastguard Worker 		found = false;
97*d83cc019SAndroid Build Coastguard Worker 		candidate_p =
98*d83cc019SAndroid Build Coastguard Worker 			div64_u64(dco_central_freq[dco_count], afe_clock);
99*d83cc019SAndroid Build Coastguard Worker 		if (retry_with_odd == false)
100*d83cc019SAndroid Build Coastguard Worker 			candidate_p = (candidate_p % 2 == 0 ?
101*d83cc019SAndroid Build Coastguard Worker 				candidate_p : candidate_p + 1);
102*d83cc019SAndroid Build Coastguard Worker 
103*d83cc019SAndroid Build Coastguard Worker 		for (P1 = 1; P1 < candidate_p; P1++) {
104*d83cc019SAndroid Build Coastguard Worker 			for (i = 0; i < 4; i++) {
105*d83cc019SAndroid Build Coastguard Worker 				if (!(P0[i] != 1 || P1 == 1))
106*d83cc019SAndroid Build Coastguard Worker 					continue;
107*d83cc019SAndroid Build Coastguard Worker 
108*d83cc019SAndroid Build Coastguard Worker 				for (k = 0; k < 4; k++) {
109*d83cc019SAndroid Build Coastguard Worker 					if (P1 != 1 && P2[k] != 2)
110*d83cc019SAndroid Build Coastguard Worker 						continue;
111*d83cc019SAndroid Build Coastguard Worker 
112*d83cc019SAndroid Build Coastguard Worker 					if (candidate_p == P0[i] * P1 * P2[k]) {
113*d83cc019SAndroid Build Coastguard Worker 						/* Found possible P0, P1, P2 */
114*d83cc019SAndroid Build Coastguard Worker 						found = true;
115*d83cc019SAndroid Build Coastguard Worker 						candidate_p0[dco_count] = P0[i];
116*d83cc019SAndroid Build Coastguard Worker 						candidate_p1[dco_count] = P1;
117*d83cc019SAndroid Build Coastguard Worker 						candidate_p2[dco_count] = P2[k];
118*d83cc019SAndroid Build Coastguard Worker 						goto found;
119*d83cc019SAndroid Build Coastguard Worker 					}
120*d83cc019SAndroid Build Coastguard Worker 
121*d83cc019SAndroid Build Coastguard Worker 				}
122*d83cc019SAndroid Build Coastguard Worker 			}
123*d83cc019SAndroid Build Coastguard Worker 		}
124*d83cc019SAndroid Build Coastguard Worker 
125*d83cc019SAndroid Build Coastguard Worker found:
126*d83cc019SAndroid Build Coastguard Worker 		if (found) {
127*d83cc019SAndroid Build Coastguard Worker 			uint64_t dco_freq = candidate_p * afe_clock;
128*d83cc019SAndroid Build Coastguard Worker 
129*d83cc019SAndroid Build Coastguard Worker #if 0
130*d83cc019SAndroid Build Coastguard Worker 			printf("Trying with (%d,%d,%d)\n",
131*d83cc019SAndroid Build Coastguard Worker 			       candidate_p0[dco_count],
132*d83cc019SAndroid Build Coastguard Worker 			       candidate_p1[dco_count],
133*d83cc019SAndroid Build Coastguard Worker 			       candidate_p2[dco_count]);
134*d83cc019SAndroid Build Coastguard Worker #endif
135*d83cc019SAndroid Build Coastguard Worker 
136*d83cc019SAndroid Build Coastguard Worker 			dco_central_freq_deviation[dco_count] =
137*d83cc019SAndroid Build Coastguard Worker 				div64_u64(10000 *
138*d83cc019SAndroid Build Coastguard Worker 					  abs_diff(dco_freq,
139*d83cc019SAndroid Build Coastguard Worker 						   dco_central_freq[dco_count]),
140*d83cc019SAndroid Build Coastguard Worker 					  dco_central_freq[dco_count]);
141*d83cc019SAndroid Build Coastguard Worker 
142*d83cc019SAndroid Build Coastguard Worker #if 0
143*d83cc019SAndroid Build Coastguard Worker 			printf("Deviation %d\n",
144*d83cc019SAndroid Build Coastguard Worker 			       dco_central_freq_deviation[dco_count]);
145*d83cc019SAndroid Build Coastguard Worker 
146*d83cc019SAndroid Build Coastguard Worker 			printf("dco_freq: %"PRIu64", "
147*d83cc019SAndroid Build Coastguard Worker 			       "dco_central_freq %"PRIu64"\n",
148*d83cc019SAndroid Build Coastguard Worker 			       dco_freq, dco_central_freq[dco_count]);
149*d83cc019SAndroid Build Coastguard Worker #endif
150*d83cc019SAndroid Build Coastguard Worker 
151*d83cc019SAndroid Build Coastguard Worker 			/* positive deviation */
152*d83cc019SAndroid Build Coastguard Worker 			if (dco_freq > dco_central_freq[dco_count]) {
153*d83cc019SAndroid Build Coastguard Worker 				if (dco_central_freq_deviation[dco_count] <
154*d83cc019SAndroid Build Coastguard Worker 				    min_dco_pdeviation) {
155*d83cc019SAndroid Build Coastguard Worker 					min_dco_pdeviation =
156*d83cc019SAndroid Build Coastguard Worker 						dco_central_freq_deviation[dco_count];
157*d83cc019SAndroid Build Coastguard Worker 					min_dco_index = dco_count;
158*d83cc019SAndroid Build Coastguard Worker 				}
159*d83cc019SAndroid Build Coastguard Worker 			/* negative deviation */
160*d83cc019SAndroid Build Coastguard Worker 			} else if (dco_central_freq_deviation[dco_count] <
161*d83cc019SAndroid Build Coastguard Worker 				   min_dco_ndeviation) {
162*d83cc019SAndroid Build Coastguard Worker 				min_dco_ndeviation =
163*d83cc019SAndroid Build Coastguard Worker 					dco_central_freq_deviation[dco_count];
164*d83cc019SAndroid Build Coastguard Worker 				min_dco_index = dco_count;
165*d83cc019SAndroid Build Coastguard Worker 			}
166*d83cc019SAndroid Build Coastguard Worker 		}
167*d83cc019SAndroid Build Coastguard Worker 
168*d83cc019SAndroid Build Coastguard Worker 		if (min_dco_index > 2 && dco_count == 2) {
169*d83cc019SAndroid Build Coastguard Worker 			/* oh well, we tried... */
170*d83cc019SAndroid Build Coastguard Worker 			if (retry_with_odd)
171*d83cc019SAndroid Build Coastguard Worker 				break;
172*d83cc019SAndroid Build Coastguard Worker 
173*d83cc019SAndroid Build Coastguard Worker 			retry_with_odd = true;
174*d83cc019SAndroid Build Coastguard Worker 			dco_count = 0;
175*d83cc019SAndroid Build Coastguard Worker 		}
176*d83cc019SAndroid Build Coastguard Worker 	}
177*d83cc019SAndroid Build Coastguard Worker 
178*d83cc019SAndroid Build Coastguard Worker 	if (min_dco_index > 2) {
179*d83cc019SAndroid Build Coastguard Worker 		WARN(1, "No valid values found for the given pixel clock\n");
180*d83cc019SAndroid Build Coastguard Worker 		return false;
181*d83cc019SAndroid Build Coastguard Worker 	} else {
182*d83cc019SAndroid Build Coastguard Worker 		uint64_t dco_freq;
183*d83cc019SAndroid Build Coastguard Worker 
184*d83cc019SAndroid Build Coastguard Worker 		wrpll_params->central_freq = dco_central_freq[min_dco_index];
185*d83cc019SAndroid Build Coastguard Worker 
186*d83cc019SAndroid Build Coastguard Worker 		switch (dco_central_freq[min_dco_index]) {
187*d83cc019SAndroid Build Coastguard Worker 		case 9600000000ULL:
188*d83cc019SAndroid Build Coastguard Worker 			wrpll_params->central_freq = 0;
189*d83cc019SAndroid Build Coastguard Worker 			break;
190*d83cc019SAndroid Build Coastguard Worker 		case 9000000000ULL:
191*d83cc019SAndroid Build Coastguard Worker 			wrpll_params->central_freq = 1;
192*d83cc019SAndroid Build Coastguard Worker 			break;
193*d83cc019SAndroid Build Coastguard Worker 		case 8400000000ULL:
194*d83cc019SAndroid Build Coastguard Worker 			wrpll_params->central_freq = 3;
195*d83cc019SAndroid Build Coastguard Worker 		}
196*d83cc019SAndroid Build Coastguard Worker 
197*d83cc019SAndroid Build Coastguard Worker 		switch (candidate_p0[min_dco_index]) {
198*d83cc019SAndroid Build Coastguard Worker 		case 1:
199*d83cc019SAndroid Build Coastguard Worker 			wrpll_params->pdiv = 0;
200*d83cc019SAndroid Build Coastguard Worker 			break;
201*d83cc019SAndroid Build Coastguard Worker 		case 2:
202*d83cc019SAndroid Build Coastguard Worker 			wrpll_params->pdiv = 1;
203*d83cc019SAndroid Build Coastguard Worker 			break;
204*d83cc019SAndroid Build Coastguard Worker 		case 3:
205*d83cc019SAndroid Build Coastguard Worker 			wrpll_params->pdiv = 2;
206*d83cc019SAndroid Build Coastguard Worker 			break;
207*d83cc019SAndroid Build Coastguard Worker 		case 7:
208*d83cc019SAndroid Build Coastguard Worker 			wrpll_params->pdiv = 4;
209*d83cc019SAndroid Build Coastguard Worker 			break;
210*d83cc019SAndroid Build Coastguard Worker 		default:
211*d83cc019SAndroid Build Coastguard Worker 			WARN(1, "Incorrect PDiv\n");
212*d83cc019SAndroid Build Coastguard Worker 		}
213*d83cc019SAndroid Build Coastguard Worker 
214*d83cc019SAndroid Build Coastguard Worker 		switch (candidate_p2[min_dco_index]) {
215*d83cc019SAndroid Build Coastguard Worker 		case 5:
216*d83cc019SAndroid Build Coastguard Worker 			wrpll_params->kdiv = 0;
217*d83cc019SAndroid Build Coastguard Worker 			break;
218*d83cc019SAndroid Build Coastguard Worker 		case 2:
219*d83cc019SAndroid Build Coastguard Worker 			wrpll_params->kdiv = 1;
220*d83cc019SAndroid Build Coastguard Worker 			break;
221*d83cc019SAndroid Build Coastguard Worker 		case 3:
222*d83cc019SAndroid Build Coastguard Worker 			wrpll_params->kdiv = 2;
223*d83cc019SAndroid Build Coastguard Worker 			break;
224*d83cc019SAndroid Build Coastguard Worker 		case 1:
225*d83cc019SAndroid Build Coastguard Worker 			wrpll_params->kdiv = 3;
226*d83cc019SAndroid Build Coastguard Worker 			break;
227*d83cc019SAndroid Build Coastguard Worker 		default:
228*d83cc019SAndroid Build Coastguard Worker 			WARN(1, "Incorrect KDiv\n");
229*d83cc019SAndroid Build Coastguard Worker 		}
230*d83cc019SAndroid Build Coastguard Worker 
231*d83cc019SAndroid Build Coastguard Worker 		wrpll_params->qdiv_ratio = candidate_p1[min_dco_index];
232*d83cc019SAndroid Build Coastguard Worker 		wrpll_params->qdiv_mode =
233*d83cc019SAndroid Build Coastguard Worker 			(wrpll_params->qdiv_ratio == 1) ? 0 : 1;
234*d83cc019SAndroid Build Coastguard Worker 
235*d83cc019SAndroid Build Coastguard Worker 		dco_freq = candidate_p0[min_dco_index] *
236*d83cc019SAndroid Build Coastguard Worker 			candidate_p1[min_dco_index] *
237*d83cc019SAndroid Build Coastguard Worker 			candidate_p2[min_dco_index] * afe_clock;
238*d83cc019SAndroid Build Coastguard Worker 
239*d83cc019SAndroid Build Coastguard Worker 		/*
240*d83cc019SAndroid Build Coastguard Worker 		 * Intermediate values are in Hz.
241*d83cc019SAndroid Build Coastguard Worker 		 * Divide by MHz to match bsepc
242*d83cc019SAndroid Build Coastguard Worker 		 */
243*d83cc019SAndroid Build Coastguard Worker 		wrpll_params->dco_integer = div_u64(dco_freq, (24 * MHz(1)));
244*d83cc019SAndroid Build Coastguard Worker 		wrpll_params->dco_fraction =
245*d83cc019SAndroid Build Coastguard Worker 			div_u64(((div_u64(dco_freq, 24) -
246*d83cc019SAndroid Build Coastguard Worker 				  wrpll_params->dco_integer * MHz(1)) * 0x8000), MHz(1));
247*d83cc019SAndroid Build Coastguard Worker 
248*d83cc019SAndroid Build Coastguard Worker 	}
249*d83cc019SAndroid Build Coastguard Worker 
250*d83cc019SAndroid Build Coastguard Worker 	/* for this unit test only */
251*d83cc019SAndroid Build Coastguard Worker 	wrpll_params->central_freq_hz = dco_central_freq[min_dco_index];
252*d83cc019SAndroid Build Coastguard Worker 	wrpll_params->p0 = candidate_p0[min_dco_index];
253*d83cc019SAndroid Build Coastguard Worker 	wrpll_params->p1 = candidate_p1[min_dco_index];
254*d83cc019SAndroid Build Coastguard Worker 	wrpll_params->p2 = candidate_p2[min_dco_index];
255*d83cc019SAndroid Build Coastguard Worker 
256*d83cc019SAndroid Build Coastguard Worker 	return true;
257*d83cc019SAndroid Build Coastguard Worker }
258*d83cc019SAndroid Build Coastguard Worker 
259*d83cc019SAndroid Build Coastguard Worker struct skl_wrpll_context {
260*d83cc019SAndroid Build Coastguard Worker 	uint64_t min_deviation;		/* current minimal deviation */
261*d83cc019SAndroid Build Coastguard Worker 	uint64_t central_freq;		/* chosen central freq */
262*d83cc019SAndroid Build Coastguard Worker 	uint64_t dco_freq;		/* chosen dco freq */
263*d83cc019SAndroid Build Coastguard Worker 	unsigned int p;			/* chosen divider */
264*d83cc019SAndroid Build Coastguard Worker };
265*d83cc019SAndroid Build Coastguard Worker 
skl_wrpll_context_init(struct skl_wrpll_context * ctx)266*d83cc019SAndroid Build Coastguard Worker static void skl_wrpll_context_init(struct skl_wrpll_context *ctx)
267*d83cc019SAndroid Build Coastguard Worker {
268*d83cc019SAndroid Build Coastguard Worker 	memset(ctx, 0, sizeof(*ctx));
269*d83cc019SAndroid Build Coastguard Worker 
270*d83cc019SAndroid Build Coastguard Worker 	ctx->min_deviation = U64_MAX;
271*d83cc019SAndroid Build Coastguard Worker }
272*d83cc019SAndroid Build Coastguard Worker 
273*d83cc019SAndroid Build Coastguard Worker /* DCO freq must be within +1%/-6%  of the DCO central freq */
274*d83cc019SAndroid Build Coastguard Worker #define SKL_MAX_PDEVIATION	100
275*d83cc019SAndroid Build Coastguard Worker #define SKL_MAX_NDEVIATION	600
276*d83cc019SAndroid Build Coastguard Worker 
277*d83cc019SAndroid Build Coastguard Worker 
278*d83cc019SAndroid Build Coastguard Worker /*
279*d83cc019SAndroid Build Coastguard Worker  * Returns true if we're sure to have found the definitive divider (ie
280*d83cc019SAndroid Build Coastguard Worker  * deviation == 0).
281*d83cc019SAndroid Build Coastguard Worker  */
skl_wrpll_try_divider(struct skl_wrpll_context * ctx,uint64_t central_freq,uint64_t dco_freq,unsigned int divider)282*d83cc019SAndroid Build Coastguard Worker static bool skl_wrpll_try_divider(struct skl_wrpll_context *ctx,
283*d83cc019SAndroid Build Coastguard Worker 				  uint64_t central_freq,
284*d83cc019SAndroid Build Coastguard Worker 				  uint64_t dco_freq,
285*d83cc019SAndroid Build Coastguard Worker 				  unsigned int divider)
286*d83cc019SAndroid Build Coastguard Worker {
287*d83cc019SAndroid Build Coastguard Worker 	uint64_t deviation;
288*d83cc019SAndroid Build Coastguard Worker 	bool found = false;
289*d83cc019SAndroid Build Coastguard Worker 
290*d83cc019SAndroid Build Coastguard Worker 	deviation = div64_u64(10000 * abs_diff(dco_freq, central_freq),
291*d83cc019SAndroid Build Coastguard Worker 			      central_freq);
292*d83cc019SAndroid Build Coastguard Worker 
293*d83cc019SAndroid Build Coastguard Worker 	/* positive deviation */
294*d83cc019SAndroid Build Coastguard Worker 	if (dco_freq >= central_freq) {
295*d83cc019SAndroid Build Coastguard Worker 		if (deviation < SKL_MAX_PDEVIATION &&
296*d83cc019SAndroid Build Coastguard Worker 		    deviation < ctx->min_deviation) {
297*d83cc019SAndroid Build Coastguard Worker 			ctx->min_deviation = deviation;
298*d83cc019SAndroid Build Coastguard Worker 			ctx->central_freq = central_freq;
299*d83cc019SAndroid Build Coastguard Worker 			ctx->dco_freq = dco_freq;
300*d83cc019SAndroid Build Coastguard Worker 			ctx->p = divider;
301*d83cc019SAndroid Build Coastguard Worker #if 0
302*d83cc019SAndroid Build Coastguard Worker 			found = true;
303*d83cc019SAndroid Build Coastguard Worker #endif
304*d83cc019SAndroid Build Coastguard Worker 		}
305*d83cc019SAndroid Build Coastguard Worker 
306*d83cc019SAndroid Build Coastguard Worker 		/* we can't improve a 0 deviation */
307*d83cc019SAndroid Build Coastguard Worker 		if (deviation == 0)
308*d83cc019SAndroid Build Coastguard Worker 			return true;
309*d83cc019SAndroid Build Coastguard Worker 	/* negative deviation */
310*d83cc019SAndroid Build Coastguard Worker 	} else if (deviation < SKL_MAX_NDEVIATION &&
311*d83cc019SAndroid Build Coastguard Worker 		   deviation < ctx->min_deviation) {
312*d83cc019SAndroid Build Coastguard Worker 		ctx->min_deviation = deviation;
313*d83cc019SAndroid Build Coastguard Worker 		ctx->central_freq = central_freq;
314*d83cc019SAndroid Build Coastguard Worker 		ctx->dco_freq = dco_freq;
315*d83cc019SAndroid Build Coastguard Worker 		ctx->p = divider;
316*d83cc019SAndroid Build Coastguard Worker #if 0
317*d83cc019SAndroid Build Coastguard Worker 		found = true;
318*d83cc019SAndroid Build Coastguard Worker #endif
319*d83cc019SAndroid Build Coastguard Worker 	}
320*d83cc019SAndroid Build Coastguard Worker 
321*d83cc019SAndroid Build Coastguard Worker 	if (found) {
322*d83cc019SAndroid Build Coastguard Worker 		printf("Divider %d\n", divider);
323*d83cc019SAndroid Build Coastguard Worker 		printf("Deviation %"PRIu64"\n", deviation);
324*d83cc019SAndroid Build Coastguard Worker 		printf("dco_freq: %"PRIu64", dco_central_freq %"PRIu64"\n",
325*d83cc019SAndroid Build Coastguard Worker 		       dco_freq, central_freq);
326*d83cc019SAndroid Build Coastguard Worker 	}
327*d83cc019SAndroid Build Coastguard Worker 
328*d83cc019SAndroid Build Coastguard Worker 	return false;
329*d83cc019SAndroid Build Coastguard Worker }
330*d83cc019SAndroid Build Coastguard Worker 
skl_wrpll_get_multipliers(unsigned int p,unsigned int * p0,unsigned int * p1,unsigned int * p2)331*d83cc019SAndroid Build Coastguard Worker static void skl_wrpll_get_multipliers(unsigned int p,
332*d83cc019SAndroid Build Coastguard Worker 				      unsigned int *p0 /* out */,
333*d83cc019SAndroid Build Coastguard Worker 				      unsigned int *p1 /* out */,
334*d83cc019SAndroid Build Coastguard Worker 				      unsigned int *p2 /* out */)
335*d83cc019SAndroid Build Coastguard Worker {
336*d83cc019SAndroid Build Coastguard Worker 	/* even dividers */
337*d83cc019SAndroid Build Coastguard Worker 	if (p % 2 == 0) {
338*d83cc019SAndroid Build Coastguard Worker 		unsigned int half = p / 2;
339*d83cc019SAndroid Build Coastguard Worker 
340*d83cc019SAndroid Build Coastguard Worker 		if (half == 1 || half == 2 || half == 3 || half == 5) {
341*d83cc019SAndroid Build Coastguard Worker 			*p0 = 2;
342*d83cc019SAndroid Build Coastguard Worker 			*p1 = 1;
343*d83cc019SAndroid Build Coastguard Worker 			*p2 = half;
344*d83cc019SAndroid Build Coastguard Worker 		} else if (half % 2 == 0) {
345*d83cc019SAndroid Build Coastguard Worker 			*p0 = 2;
346*d83cc019SAndroid Build Coastguard Worker 			*p1 = half / 2;
347*d83cc019SAndroid Build Coastguard Worker 			*p2 = 2;
348*d83cc019SAndroid Build Coastguard Worker 		} else if (half % 3 == 0) {
349*d83cc019SAndroid Build Coastguard Worker 			*p0 = 3;
350*d83cc019SAndroid Build Coastguard Worker 			*p1 = half / 3;
351*d83cc019SAndroid Build Coastguard Worker 			*p2 = 2;
352*d83cc019SAndroid Build Coastguard Worker 		} else if (half % 7 == 0) {
353*d83cc019SAndroid Build Coastguard Worker 			*p0 = 7;
354*d83cc019SAndroid Build Coastguard Worker 			*p1 = half / 7;
355*d83cc019SAndroid Build Coastguard Worker 			*p2 = 2;
356*d83cc019SAndroid Build Coastguard Worker 		}
357*d83cc019SAndroid Build Coastguard Worker 	} else if (p == 3 || p == 9) {  /* 3, 5, 7, 9, 15, 21, 35 */
358*d83cc019SAndroid Build Coastguard Worker 		*p0 = 3;
359*d83cc019SAndroid Build Coastguard Worker 		*p1 = 1;
360*d83cc019SAndroid Build Coastguard Worker 		*p2 = p / 3;
361*d83cc019SAndroid Build Coastguard Worker 	} else if (p == 5 || p == 7) {
362*d83cc019SAndroid Build Coastguard Worker 		*p0 = p;
363*d83cc019SAndroid Build Coastguard Worker 		*p1 = 1;
364*d83cc019SAndroid Build Coastguard Worker 		*p2 = 1;
365*d83cc019SAndroid Build Coastguard Worker 	} else if (p == 15) {
366*d83cc019SAndroid Build Coastguard Worker 		*p0 = 3;
367*d83cc019SAndroid Build Coastguard Worker 		*p1 = 1;
368*d83cc019SAndroid Build Coastguard Worker 		*p2 = 5;
369*d83cc019SAndroid Build Coastguard Worker 	} else if (p == 21) {
370*d83cc019SAndroid Build Coastguard Worker 		*p0 = 7;
371*d83cc019SAndroid Build Coastguard Worker 		*p1 = 1;
372*d83cc019SAndroid Build Coastguard Worker 		*p2 = 3;
373*d83cc019SAndroid Build Coastguard Worker 	} else if (p == 35) {
374*d83cc019SAndroid Build Coastguard Worker 		*p0 = 7;
375*d83cc019SAndroid Build Coastguard Worker 		*p1 = 1;
376*d83cc019SAndroid Build Coastguard Worker 		*p2 = 5;
377*d83cc019SAndroid Build Coastguard Worker 	}
378*d83cc019SAndroid Build Coastguard Worker }
379*d83cc019SAndroid Build Coastguard Worker 
test_multipliers(void)380*d83cc019SAndroid Build Coastguard Worker static void test_multipliers(void)
381*d83cc019SAndroid Build Coastguard Worker {
382*d83cc019SAndroid Build Coastguard Worker 	static const int even_dividers[] = {  4,  6,  8, 10, 12, 14, 16, 18, 20,
383*d83cc019SAndroid Build Coastguard Worker 					     24, 28, 30, 32, 36, 40, 42, 44,
384*d83cc019SAndroid Build Coastguard Worker 					     48, 52, 54, 56, 60, 64, 66, 68,
385*d83cc019SAndroid Build Coastguard Worker 					     70, 72, 76, 78, 80, 84, 88, 90,
386*d83cc019SAndroid Build Coastguard Worker 					     92, 96, 98 };
387*d83cc019SAndroid Build Coastguard Worker 	static const int odd_dividers[] = { 3, 5, 7, 9, 15, 21, 35 };
388*d83cc019SAndroid Build Coastguard Worker 	static const struct {
389*d83cc019SAndroid Build Coastguard Worker 		const int *list;
390*d83cc019SAndroid Build Coastguard Worker 		int n_dividers;
391*d83cc019SAndroid Build Coastguard Worker 	} dividers[] = {
392*d83cc019SAndroid Build Coastguard Worker 		{ even_dividers, ARRAY_SIZE(even_dividers) },
393*d83cc019SAndroid Build Coastguard Worker 		{ odd_dividers, ARRAY_SIZE(odd_dividers) },
394*d83cc019SAndroid Build Coastguard Worker 	};
395*d83cc019SAndroid Build Coastguard Worker 	unsigned int d, i;
396*d83cc019SAndroid Build Coastguard Worker 
397*d83cc019SAndroid Build Coastguard Worker 	for (d = 0; d < ARRAY_SIZE(dividers); d++) {
398*d83cc019SAndroid Build Coastguard Worker 		for (i = 0; i < dividers[d].n_dividers; i++) {
399*d83cc019SAndroid Build Coastguard Worker 			unsigned int p = dividers[d].list[i];
400*d83cc019SAndroid Build Coastguard Worker 			unsigned p0, p1, p2;
401*d83cc019SAndroid Build Coastguard Worker 
402*d83cc019SAndroid Build Coastguard Worker 			p0 = p1 = p2 = 0;
403*d83cc019SAndroid Build Coastguard Worker 
404*d83cc019SAndroid Build Coastguard Worker 			skl_wrpll_get_multipliers(p, &p0, &p1, &p2);
405*d83cc019SAndroid Build Coastguard Worker 
406*d83cc019SAndroid Build Coastguard Worker 			assert(p0);
407*d83cc019SAndroid Build Coastguard Worker 			assert(p1);
408*d83cc019SAndroid Build Coastguard Worker 			assert(p2);
409*d83cc019SAndroid Build Coastguard Worker 			assert(p == p0 * p1 * p2);
410*d83cc019SAndroid Build Coastguard Worker 		}
411*d83cc019SAndroid Build Coastguard Worker 	}
412*d83cc019SAndroid Build Coastguard Worker }
413*d83cc019SAndroid Build Coastguard Worker 
414*d83cc019SAndroid Build Coastguard Worker static bool
skl_ddi_calculate_wrpll2(int clock,struct skl_wrpll_params * wrpll_params)415*d83cc019SAndroid Build Coastguard Worker skl_ddi_calculate_wrpll2(int clock /* in Hz */,
416*d83cc019SAndroid Build Coastguard Worker 			 struct skl_wrpll_params *wrpll_params)
417*d83cc019SAndroid Build Coastguard Worker {
418*d83cc019SAndroid Build Coastguard Worker 	uint64_t afe_clock = clock * 5; /* AFE Clock is 5x Pixel clock */
419*d83cc019SAndroid Build Coastguard Worker 	uint64_t dco_central_freq[3] = {8400000000ULL,
420*d83cc019SAndroid Build Coastguard Worker 					9000000000ULL,
421*d83cc019SAndroid Build Coastguard Worker 					9600000000ULL};
422*d83cc019SAndroid Build Coastguard Worker 	static const int even_dividers[] = {  4,  6,  8, 10, 12, 14, 16, 18, 20,
423*d83cc019SAndroid Build Coastguard Worker 					     24, 28, 30, 32, 36, 40, 42, 44,
424*d83cc019SAndroid Build Coastguard Worker 					     48, 52, 54, 56, 60, 64, 66, 68,
425*d83cc019SAndroid Build Coastguard Worker 					     70, 72, 76, 78, 80, 84, 88, 90,
426*d83cc019SAndroid Build Coastguard Worker 					     92, 96, 98 };
427*d83cc019SAndroid Build Coastguard Worker 	static const int odd_dividers[] = { 3, 5, 7, 9, 15, 21, 35 };
428*d83cc019SAndroid Build Coastguard Worker 	static const struct {
429*d83cc019SAndroid Build Coastguard Worker 		const int *list;
430*d83cc019SAndroid Build Coastguard Worker 		int n_dividers;
431*d83cc019SAndroid Build Coastguard Worker 	} dividers[] = {
432*d83cc019SAndroid Build Coastguard Worker 		{ even_dividers, ARRAY_SIZE(even_dividers) },
433*d83cc019SAndroid Build Coastguard Worker 		{ odd_dividers, ARRAY_SIZE(odd_dividers) },
434*d83cc019SAndroid Build Coastguard Worker 	};
435*d83cc019SAndroid Build Coastguard Worker 	struct skl_wrpll_context ctx;
436*d83cc019SAndroid Build Coastguard Worker 	unsigned int dco, d, i;
437*d83cc019SAndroid Build Coastguard Worker 	unsigned int p0, p1, p2;
438*d83cc019SAndroid Build Coastguard Worker 
439*d83cc019SAndroid Build Coastguard Worker 	skl_wrpll_context_init(&ctx);
440*d83cc019SAndroid Build Coastguard Worker 
441*d83cc019SAndroid Build Coastguard Worker 	for (d = 0; d < ARRAY_SIZE(dividers); d++) {
442*d83cc019SAndroid Build Coastguard Worker 		for (dco = 0; dco < ARRAY_SIZE(dco_central_freq); dco++) {
443*d83cc019SAndroid Build Coastguard Worker 			for (i = 0; i < dividers[d].n_dividers; i++) {
444*d83cc019SAndroid Build Coastguard Worker 				unsigned int p = dividers[d].list[i];
445*d83cc019SAndroid Build Coastguard Worker 				uint64_t dco_freq = p * afe_clock;
446*d83cc019SAndroid Build Coastguard Worker 
447*d83cc019SAndroid Build Coastguard Worker 				if (skl_wrpll_try_divider(&ctx,
448*d83cc019SAndroid Build Coastguard Worker 							  dco_central_freq[dco],
449*d83cc019SAndroid Build Coastguard Worker 							  dco_freq,
450*d83cc019SAndroid Build Coastguard Worker 							  p))
451*d83cc019SAndroid Build Coastguard Worker 					goto skip_remaining_dividers;
452*d83cc019SAndroid Build Coastguard Worker 			}
453*d83cc019SAndroid Build Coastguard Worker 		}
454*d83cc019SAndroid Build Coastguard Worker 
455*d83cc019SAndroid Build Coastguard Worker skip_remaining_dividers:
456*d83cc019SAndroid Build Coastguard Worker 		/*
457*d83cc019SAndroid Build Coastguard Worker 		 * If a solution is found with an even divider, prefer
458*d83cc019SAndroid Build Coastguard Worker 		 * this one.
459*d83cc019SAndroid Build Coastguard Worker 		 */
460*d83cc019SAndroid Build Coastguard Worker 		if (d == 0 && ctx.p)
461*d83cc019SAndroid Build Coastguard Worker 			break;
462*d83cc019SAndroid Build Coastguard Worker 	}
463*d83cc019SAndroid Build Coastguard Worker 
464*d83cc019SAndroid Build Coastguard Worker 	if (!ctx.p)
465*d83cc019SAndroid Build Coastguard Worker 		return false;
466*d83cc019SAndroid Build Coastguard Worker 
467*d83cc019SAndroid Build Coastguard Worker 	skl_wrpll_get_multipliers(ctx.p, &p0, &p1, &p2);
468*d83cc019SAndroid Build Coastguard Worker 
469*d83cc019SAndroid Build Coastguard Worker 	/* for this unit test only */
470*d83cc019SAndroid Build Coastguard Worker 	wrpll_params->central_freq_hz = ctx.central_freq;
471*d83cc019SAndroid Build Coastguard Worker 	wrpll_params->p0 = p0;
472*d83cc019SAndroid Build Coastguard Worker 	wrpll_params->p1 = p1;
473*d83cc019SAndroid Build Coastguard Worker 	wrpll_params->p2 = p2;
474*d83cc019SAndroid Build Coastguard Worker 
475*d83cc019SAndroid Build Coastguard Worker 	return true;
476*d83cc019SAndroid Build Coastguard Worker }
477*d83cc019SAndroid Build Coastguard Worker 
478*d83cc019SAndroid Build Coastguard Worker static const struct {
479*d83cc019SAndroid Build Coastguard Worker 	uint32_t clock; /* in Hz */
480*d83cc019SAndroid Build Coastguard Worker } modes[] = {
481*d83cc019SAndroid Build Coastguard Worker 	{ 19750000 },
482*d83cc019SAndroid Build Coastguard Worker 	{ 20000000 },
483*d83cc019SAndroid Build Coastguard Worker 	{ 21000000 },
484*d83cc019SAndroid Build Coastguard Worker 	{ 21912000 },
485*d83cc019SAndroid Build Coastguard Worker 	{ 22000000 },
486*d83cc019SAndroid Build Coastguard Worker 	{ 23000000 },
487*d83cc019SAndroid Build Coastguard Worker 	{ 23500000 },
488*d83cc019SAndroid Build Coastguard Worker 	{ 23750000 },
489*d83cc019SAndroid Build Coastguard Worker 	{ 24000000 },
490*d83cc019SAndroid Build Coastguard Worker 	{ 25000000 },
491*d83cc019SAndroid Build Coastguard Worker 	{ 25175000 },
492*d83cc019SAndroid Build Coastguard Worker 	{ 25200000 },
493*d83cc019SAndroid Build Coastguard Worker 	{ 26000000 },
494*d83cc019SAndroid Build Coastguard Worker 	{ 27000000 },
495*d83cc019SAndroid Build Coastguard Worker 	{ 27027000 },
496*d83cc019SAndroid Build Coastguard Worker 	{ 27500000 },
497*d83cc019SAndroid Build Coastguard Worker 	{ 28000000 },
498*d83cc019SAndroid Build Coastguard Worker 	{ 28320000 },
499*d83cc019SAndroid Build Coastguard Worker 	{ 28322000 },
500*d83cc019SAndroid Build Coastguard Worker 	{ 28750000 },
501*d83cc019SAndroid Build Coastguard Worker 	{ 29000000 },
502*d83cc019SAndroid Build Coastguard Worker 	{ 29750000 },
503*d83cc019SAndroid Build Coastguard Worker 	{ 30000000 },
504*d83cc019SAndroid Build Coastguard Worker 	{ 30750000 },
505*d83cc019SAndroid Build Coastguard Worker 	{ 31000000 },
506*d83cc019SAndroid Build Coastguard Worker 	{ 31500000 },
507*d83cc019SAndroid Build Coastguard Worker 	{ 32000000 },
508*d83cc019SAndroid Build Coastguard Worker 	{ 32500000 },
509*d83cc019SAndroid Build Coastguard Worker 	{ 33000000 },
510*d83cc019SAndroid Build Coastguard Worker 	{ 34000000 },
511*d83cc019SAndroid Build Coastguard Worker 	{ 35000000 },
512*d83cc019SAndroid Build Coastguard Worker 	{ 35500000 },
513*d83cc019SAndroid Build Coastguard Worker 	{ 36000000 },
514*d83cc019SAndroid Build Coastguard Worker 	{ 36750000 },
515*d83cc019SAndroid Build Coastguard Worker 	{ 37000000 },
516*d83cc019SAndroid Build Coastguard Worker 	{ 37762500 },
517*d83cc019SAndroid Build Coastguard Worker 	{ 37800000 },
518*d83cc019SAndroid Build Coastguard Worker 	{ 38000000 },
519*d83cc019SAndroid Build Coastguard Worker 	{ 38250000 },
520*d83cc019SAndroid Build Coastguard Worker 	{ 39000000 },
521*d83cc019SAndroid Build Coastguard Worker 	{ 40000000 },
522*d83cc019SAndroid Build Coastguard Worker 	{ 40500000 },
523*d83cc019SAndroid Build Coastguard Worker 	{ 40541000 },
524*d83cc019SAndroid Build Coastguard Worker 	{ 40750000 },
525*d83cc019SAndroid Build Coastguard Worker 	{ 41000000 },
526*d83cc019SAndroid Build Coastguard Worker 	{ 41500000 },
527*d83cc019SAndroid Build Coastguard Worker 	{ 41540000 },
528*d83cc019SAndroid Build Coastguard Worker 	{ 42000000 },
529*d83cc019SAndroid Build Coastguard Worker 	{ 42500000 },
530*d83cc019SAndroid Build Coastguard Worker 	{ 43000000 },
531*d83cc019SAndroid Build Coastguard Worker 	{ 43163000 },
532*d83cc019SAndroid Build Coastguard Worker 	{ 44000000 },
533*d83cc019SAndroid Build Coastguard Worker 	{ 44900000 },
534*d83cc019SAndroid Build Coastguard Worker 	{ 45000000 },
535*d83cc019SAndroid Build Coastguard Worker 	{ 45250000 },
536*d83cc019SAndroid Build Coastguard Worker 	{ 46000000 },
537*d83cc019SAndroid Build Coastguard Worker 	{ 46750000 },
538*d83cc019SAndroid Build Coastguard Worker 	{ 47000000 },
539*d83cc019SAndroid Build Coastguard Worker 	{ 48000000 },
540*d83cc019SAndroid Build Coastguard Worker 	{ 49000000 },
541*d83cc019SAndroid Build Coastguard Worker 	{ 49500000 },
542*d83cc019SAndroid Build Coastguard Worker 	{ 50000000 },
543*d83cc019SAndroid Build Coastguard Worker 	{ 50500000 },
544*d83cc019SAndroid Build Coastguard Worker 	{ 51000000 },
545*d83cc019SAndroid Build Coastguard Worker 	{ 52000000 },
546*d83cc019SAndroid Build Coastguard Worker 	{ 52406000 },
547*d83cc019SAndroid Build Coastguard Worker 	{ 53000000 },
548*d83cc019SAndroid Build Coastguard Worker 	{ 54000000 },
549*d83cc019SAndroid Build Coastguard Worker 	{ 54054000 },
550*d83cc019SAndroid Build Coastguard Worker 	{ 54500000 },
551*d83cc019SAndroid Build Coastguard Worker 	{ 55000000 },
552*d83cc019SAndroid Build Coastguard Worker 	{ 56000000 },
553*d83cc019SAndroid Build Coastguard Worker 	{ 56250000 },
554*d83cc019SAndroid Build Coastguard Worker 	{ 56750000 },
555*d83cc019SAndroid Build Coastguard Worker 	{ 57000000 },
556*d83cc019SAndroid Build Coastguard Worker 	{ 58000000 },
557*d83cc019SAndroid Build Coastguard Worker 	{ 58250000 },
558*d83cc019SAndroid Build Coastguard Worker 	{ 58750000 },
559*d83cc019SAndroid Build Coastguard Worker 	{ 59000000 },
560*d83cc019SAndroid Build Coastguard Worker 	{ 59341000 },
561*d83cc019SAndroid Build Coastguard Worker 	{ 59400000 },
562*d83cc019SAndroid Build Coastguard Worker 	{ 60000000 },
563*d83cc019SAndroid Build Coastguard Worker 	{ 60500000 },
564*d83cc019SAndroid Build Coastguard Worker 	{ 61000000 },
565*d83cc019SAndroid Build Coastguard Worker 	{ 62000000 },
566*d83cc019SAndroid Build Coastguard Worker 	{ 62250000 },
567*d83cc019SAndroid Build Coastguard Worker 	{ 63000000 },
568*d83cc019SAndroid Build Coastguard Worker 	{ 63500000 },
569*d83cc019SAndroid Build Coastguard Worker 	{ 64000000 },
570*d83cc019SAndroid Build Coastguard Worker 	{ 65000000 },
571*d83cc019SAndroid Build Coastguard Worker 	{ 65250000 },
572*d83cc019SAndroid Build Coastguard Worker 	{ 65500000 },
573*d83cc019SAndroid Build Coastguard Worker 	{ 66000000 },
574*d83cc019SAndroid Build Coastguard Worker 	{ 66667000 },
575*d83cc019SAndroid Build Coastguard Worker 	{ 66750000 },
576*d83cc019SAndroid Build Coastguard Worker 	{ 67000000 },
577*d83cc019SAndroid Build Coastguard Worker 	{ 67750000 },
578*d83cc019SAndroid Build Coastguard Worker 	{ 68000000 },
579*d83cc019SAndroid Build Coastguard Worker 	{ 68179000 },
580*d83cc019SAndroid Build Coastguard Worker 	{ 68250000 },
581*d83cc019SAndroid Build Coastguard Worker 	{ 69000000 },
582*d83cc019SAndroid Build Coastguard Worker 	{ 70000000 },
583*d83cc019SAndroid Build Coastguard Worker 	{ 71000000 },
584*d83cc019SAndroid Build Coastguard Worker 	{ 72000000 },
585*d83cc019SAndroid Build Coastguard Worker 	{ 73000000 },
586*d83cc019SAndroid Build Coastguard Worker 	{ 74000000 },
587*d83cc019SAndroid Build Coastguard Worker 	{ 74176000 },
588*d83cc019SAndroid Build Coastguard Worker 	{ 74250000 },
589*d83cc019SAndroid Build Coastguard Worker 	{ 74481000 },
590*d83cc019SAndroid Build Coastguard Worker 	{ 74500000 },
591*d83cc019SAndroid Build Coastguard Worker 	{ 75000000 },
592*d83cc019SAndroid Build Coastguard Worker 	{ 75250000 },
593*d83cc019SAndroid Build Coastguard Worker 	{ 76000000 },
594*d83cc019SAndroid Build Coastguard Worker 	{ 77000000 },
595*d83cc019SAndroid Build Coastguard Worker 	{ 78000000 },
596*d83cc019SAndroid Build Coastguard Worker 	{ 78750000 },
597*d83cc019SAndroid Build Coastguard Worker 	{ 79000000 },
598*d83cc019SAndroid Build Coastguard Worker 	{ 79500000 },
599*d83cc019SAndroid Build Coastguard Worker 	{ 80000000 },
600*d83cc019SAndroid Build Coastguard Worker 	{ 81000000 },
601*d83cc019SAndroid Build Coastguard Worker 	{ 81081000 },
602*d83cc019SAndroid Build Coastguard Worker 	{ 81624000 },
603*d83cc019SAndroid Build Coastguard Worker 	{ 82000000 },
604*d83cc019SAndroid Build Coastguard Worker 	{ 83000000 },
605*d83cc019SAndroid Build Coastguard Worker 	{ 83950000 },
606*d83cc019SAndroid Build Coastguard Worker 	{ 84000000 },
607*d83cc019SAndroid Build Coastguard Worker 	{ 84750000 },
608*d83cc019SAndroid Build Coastguard Worker 	{ 85000000 },
609*d83cc019SAndroid Build Coastguard Worker 	{ 85250000 },
610*d83cc019SAndroid Build Coastguard Worker 	{ 85750000 },
611*d83cc019SAndroid Build Coastguard Worker 	{ 86000000 },
612*d83cc019SAndroid Build Coastguard Worker 	{ 87000000 },
613*d83cc019SAndroid Build Coastguard Worker 	{ 88000000 },
614*d83cc019SAndroid Build Coastguard Worker 	{ 88500000 },
615*d83cc019SAndroid Build Coastguard Worker 	{ 89000000 },
616*d83cc019SAndroid Build Coastguard Worker 	{ 89012000 },
617*d83cc019SAndroid Build Coastguard Worker 	{ 89100000 },
618*d83cc019SAndroid Build Coastguard Worker 	{ 90000000 },
619*d83cc019SAndroid Build Coastguard Worker 	{ 91000000 },
620*d83cc019SAndroid Build Coastguard Worker 	{ 92000000 },
621*d83cc019SAndroid Build Coastguard Worker 	{ 93000000 },
622*d83cc019SAndroid Build Coastguard Worker 	{ 94000000 },
623*d83cc019SAndroid Build Coastguard Worker 	{ 94500000 },
624*d83cc019SAndroid Build Coastguard Worker 	{ 95000000 },
625*d83cc019SAndroid Build Coastguard Worker 	{ 95654000 },
626*d83cc019SAndroid Build Coastguard Worker 	{ 95750000 },
627*d83cc019SAndroid Build Coastguard Worker 	{ 96000000 },
628*d83cc019SAndroid Build Coastguard Worker 	{ 97000000 },
629*d83cc019SAndroid Build Coastguard Worker 	{ 97750000 },
630*d83cc019SAndroid Build Coastguard Worker 	{ 98000000 },
631*d83cc019SAndroid Build Coastguard Worker 	{ 99000000 },
632*d83cc019SAndroid Build Coastguard Worker 	{ 99750000 },
633*d83cc019SAndroid Build Coastguard Worker 	{ 100000000 },
634*d83cc019SAndroid Build Coastguard Worker 	{ 100500000 },
635*d83cc019SAndroid Build Coastguard Worker 	{ 101000000 },
636*d83cc019SAndroid Build Coastguard Worker 	{ 101250000 },
637*d83cc019SAndroid Build Coastguard Worker 	{ 102000000 },
638*d83cc019SAndroid Build Coastguard Worker 	{ 102250000 },
639*d83cc019SAndroid Build Coastguard Worker 	{ 103000000 },
640*d83cc019SAndroid Build Coastguard Worker 	{ 104000000 },
641*d83cc019SAndroid Build Coastguard Worker 	{ 105000000 },
642*d83cc019SAndroid Build Coastguard Worker 	{ 106000000 },
643*d83cc019SAndroid Build Coastguard Worker 	{ 107000000 },
644*d83cc019SAndroid Build Coastguard Worker 	{ 107214000 },
645*d83cc019SAndroid Build Coastguard Worker 	{ 108000000 },
646*d83cc019SAndroid Build Coastguard Worker 	{ 108108000 },
647*d83cc019SAndroid Build Coastguard Worker 	{ 109000000 },
648*d83cc019SAndroid Build Coastguard Worker 	{ 110000000 },
649*d83cc019SAndroid Build Coastguard Worker 	{ 110013000 },
650*d83cc019SAndroid Build Coastguard Worker 	{ 110250000 },
651*d83cc019SAndroid Build Coastguard Worker 	{ 110500000 },
652*d83cc019SAndroid Build Coastguard Worker 	{ 111000000 },
653*d83cc019SAndroid Build Coastguard Worker 	{ 111264000 },
654*d83cc019SAndroid Build Coastguard Worker 	{ 111375000 },
655*d83cc019SAndroid Build Coastguard Worker 	{ 112000000 },
656*d83cc019SAndroid Build Coastguard Worker 	{ 112500000 },
657*d83cc019SAndroid Build Coastguard Worker 	{ 113100000 },
658*d83cc019SAndroid Build Coastguard Worker 	{ 113309000 },
659*d83cc019SAndroid Build Coastguard Worker 	{ 114000000 },
660*d83cc019SAndroid Build Coastguard Worker 	{ 115000000 },
661*d83cc019SAndroid Build Coastguard Worker 	{ 116000000 },
662*d83cc019SAndroid Build Coastguard Worker 	{ 117000000 },
663*d83cc019SAndroid Build Coastguard Worker 	{ 117500000 },
664*d83cc019SAndroid Build Coastguard Worker 	{ 118000000 },
665*d83cc019SAndroid Build Coastguard Worker 	{ 119000000 },
666*d83cc019SAndroid Build Coastguard Worker 	{ 119500000 },
667*d83cc019SAndroid Build Coastguard Worker 	{ 119651000 },
668*d83cc019SAndroid Build Coastguard Worker 	{ 120000000 },
669*d83cc019SAndroid Build Coastguard Worker 	{ 121000000 },
670*d83cc019SAndroid Build Coastguard Worker 	{ 121250000 },
671*d83cc019SAndroid Build Coastguard Worker 	{ 121750000 },
672*d83cc019SAndroid Build Coastguard Worker 	{ 122000000 },
673*d83cc019SAndroid Build Coastguard Worker 	{ 122614000 },
674*d83cc019SAndroid Build Coastguard Worker 	{ 123000000 },
675*d83cc019SAndroid Build Coastguard Worker 	{ 123379000 },
676*d83cc019SAndroid Build Coastguard Worker 	{ 124000000 },
677*d83cc019SAndroid Build Coastguard Worker 	{ 125000000 },
678*d83cc019SAndroid Build Coastguard Worker 	{ 125250000 },
679*d83cc019SAndroid Build Coastguard Worker 	{ 125750000 },
680*d83cc019SAndroid Build Coastguard Worker 	{ 126000000 },
681*d83cc019SAndroid Build Coastguard Worker 	{ 127000000 },
682*d83cc019SAndroid Build Coastguard Worker 	{ 127250000 },
683*d83cc019SAndroid Build Coastguard Worker 	{ 128000000 },
684*d83cc019SAndroid Build Coastguard Worker 	{ 129000000 },
685*d83cc019SAndroid Build Coastguard Worker 	{ 129859000 },
686*d83cc019SAndroid Build Coastguard Worker 	{ 130000000 },
687*d83cc019SAndroid Build Coastguard Worker 	{ 130250000 },
688*d83cc019SAndroid Build Coastguard Worker 	{ 131000000 },
689*d83cc019SAndroid Build Coastguard Worker 	{ 131500000 },
690*d83cc019SAndroid Build Coastguard Worker 	{ 131850000 },
691*d83cc019SAndroid Build Coastguard Worker 	{ 132000000 },
692*d83cc019SAndroid Build Coastguard Worker 	{ 132750000 },
693*d83cc019SAndroid Build Coastguard Worker 	{ 133000000 },
694*d83cc019SAndroid Build Coastguard Worker 	{ 133330000 },
695*d83cc019SAndroid Build Coastguard Worker 	{ 134000000 },
696*d83cc019SAndroid Build Coastguard Worker 	{ 135000000 },
697*d83cc019SAndroid Build Coastguard Worker 	{ 135250000 },
698*d83cc019SAndroid Build Coastguard Worker 	{ 136000000 },
699*d83cc019SAndroid Build Coastguard Worker 	{ 137000000 },
700*d83cc019SAndroid Build Coastguard Worker 	{ 138000000 },
701*d83cc019SAndroid Build Coastguard Worker 	{ 138500000 },
702*d83cc019SAndroid Build Coastguard Worker 	{ 138750000 },
703*d83cc019SAndroid Build Coastguard Worker 	{ 139000000 },
704*d83cc019SAndroid Build Coastguard Worker 	{ 139050000 },
705*d83cc019SAndroid Build Coastguard Worker 	{ 139054000 },
706*d83cc019SAndroid Build Coastguard Worker 	{ 140000000 },
707*d83cc019SAndroid Build Coastguard Worker 	{ 141000000 },
708*d83cc019SAndroid Build Coastguard Worker 	{ 141500000 },
709*d83cc019SAndroid Build Coastguard Worker 	{ 142000000 },
710*d83cc019SAndroid Build Coastguard Worker 	{ 143000000 },
711*d83cc019SAndroid Build Coastguard Worker 	{ 143472000 },
712*d83cc019SAndroid Build Coastguard Worker 	{ 144000000 },
713*d83cc019SAndroid Build Coastguard Worker 	{ 145000000 },
714*d83cc019SAndroid Build Coastguard Worker 	{ 146000000 },
715*d83cc019SAndroid Build Coastguard Worker 	{ 146250000 },
716*d83cc019SAndroid Build Coastguard Worker 	{ 147000000 },
717*d83cc019SAndroid Build Coastguard Worker 	{ 147891000 },
718*d83cc019SAndroid Build Coastguard Worker 	{ 148000000 },
719*d83cc019SAndroid Build Coastguard Worker 	{ 148250000 },
720*d83cc019SAndroid Build Coastguard Worker 	{ 148352000 },
721*d83cc019SAndroid Build Coastguard Worker 	{ 148500000 },
722*d83cc019SAndroid Build Coastguard Worker 	{ 149000000 },
723*d83cc019SAndroid Build Coastguard Worker 	{ 150000000 },
724*d83cc019SAndroid Build Coastguard Worker 	{ 151000000 },
725*d83cc019SAndroid Build Coastguard Worker 	{ 152000000 },
726*d83cc019SAndroid Build Coastguard Worker 	{ 152280000 },
727*d83cc019SAndroid Build Coastguard Worker 	{ 153000000 },
728*d83cc019SAndroid Build Coastguard Worker 	{ 154000000 },
729*d83cc019SAndroid Build Coastguard Worker 	{ 155000000 },
730*d83cc019SAndroid Build Coastguard Worker 	{ 155250000 },
731*d83cc019SAndroid Build Coastguard Worker 	{ 155750000 },
732*d83cc019SAndroid Build Coastguard Worker 	{ 156000000 },
733*d83cc019SAndroid Build Coastguard Worker 	{ 157000000 },
734*d83cc019SAndroid Build Coastguard Worker 	{ 157500000 },
735*d83cc019SAndroid Build Coastguard Worker 	{ 158000000 },
736*d83cc019SAndroid Build Coastguard Worker 	{ 158250000 },
737*d83cc019SAndroid Build Coastguard Worker 	{ 159000000 },
738*d83cc019SAndroid Build Coastguard Worker 	{ 159500000 },
739*d83cc019SAndroid Build Coastguard Worker 	{ 160000000 },
740*d83cc019SAndroid Build Coastguard Worker 	{ 161000000 },
741*d83cc019SAndroid Build Coastguard Worker 	{ 162000000 },
742*d83cc019SAndroid Build Coastguard Worker 	{ 162162000 },
743*d83cc019SAndroid Build Coastguard Worker 	{ 162500000 },
744*d83cc019SAndroid Build Coastguard Worker 	{ 163000000 },
745*d83cc019SAndroid Build Coastguard Worker 	{ 164000000 },
746*d83cc019SAndroid Build Coastguard Worker 	{ 165000000 },
747*d83cc019SAndroid Build Coastguard Worker 	{ 166000000 },
748*d83cc019SAndroid Build Coastguard Worker 	{ 167000000 },
749*d83cc019SAndroid Build Coastguard Worker 	{ 168000000 },
750*d83cc019SAndroid Build Coastguard Worker 	{ 169000000 },
751*d83cc019SAndroid Build Coastguard Worker 	{ 169128000 },
752*d83cc019SAndroid Build Coastguard Worker 	{ 169500000 },
753*d83cc019SAndroid Build Coastguard Worker 	{ 170000000 },
754*d83cc019SAndroid Build Coastguard Worker 	{ 171000000 },
755*d83cc019SAndroid Build Coastguard Worker 	{ 172000000 },
756*d83cc019SAndroid Build Coastguard Worker 	{ 172750000 },
757*d83cc019SAndroid Build Coastguard Worker 	{ 172800000 },
758*d83cc019SAndroid Build Coastguard Worker 	{ 173000000 },
759*d83cc019SAndroid Build Coastguard Worker 	{ 174000000 },
760*d83cc019SAndroid Build Coastguard Worker 	{ 174787000 },
761*d83cc019SAndroid Build Coastguard Worker 	{ 175000000 },
762*d83cc019SAndroid Build Coastguard Worker 	{ 176000000 },
763*d83cc019SAndroid Build Coastguard Worker 	{ 177000000 },
764*d83cc019SAndroid Build Coastguard Worker 	{ 178000000 },
765*d83cc019SAndroid Build Coastguard Worker 	{ 178500000 },
766*d83cc019SAndroid Build Coastguard Worker 	{ 179000000 },
767*d83cc019SAndroid Build Coastguard Worker 	{ 179500000 },
768*d83cc019SAndroid Build Coastguard Worker 	{ 180000000 },
769*d83cc019SAndroid Build Coastguard Worker 	{ 181000000 },
770*d83cc019SAndroid Build Coastguard Worker 	{ 182000000 },
771*d83cc019SAndroid Build Coastguard Worker 	{ 183000000 },
772*d83cc019SAndroid Build Coastguard Worker 	{ 184000000 },
773*d83cc019SAndroid Build Coastguard Worker 	{ 184750000 },
774*d83cc019SAndroid Build Coastguard Worker 	{ 185000000 },
775*d83cc019SAndroid Build Coastguard Worker 	{ 186000000 },
776*d83cc019SAndroid Build Coastguard Worker 	{ 187000000 },
777*d83cc019SAndroid Build Coastguard Worker 	{ 188000000 },
778*d83cc019SAndroid Build Coastguard Worker 	{ 189000000 },
779*d83cc019SAndroid Build Coastguard Worker 	{ 190000000 },
780*d83cc019SAndroid Build Coastguard Worker 	{ 190960000 },
781*d83cc019SAndroid Build Coastguard Worker 	{ 191000000 },
782*d83cc019SAndroid Build Coastguard Worker 	{ 192000000 },
783*d83cc019SAndroid Build Coastguard Worker 	{ 192250000 },
784*d83cc019SAndroid Build Coastguard Worker 	{ 193000000 },
785*d83cc019SAndroid Build Coastguard Worker 	{ 193250000 },
786*d83cc019SAndroid Build Coastguard Worker 	{ 194000000 },
787*d83cc019SAndroid Build Coastguard Worker 	{ 194208000 },
788*d83cc019SAndroid Build Coastguard Worker 	{ 195000000 },
789*d83cc019SAndroid Build Coastguard Worker 	{ 196000000 },
790*d83cc019SAndroid Build Coastguard Worker 	{ 197000000 },
791*d83cc019SAndroid Build Coastguard Worker 	{ 197750000 },
792*d83cc019SAndroid Build Coastguard Worker 	{ 198000000 },
793*d83cc019SAndroid Build Coastguard Worker 	{ 198500000 },
794*d83cc019SAndroid Build Coastguard Worker 	{ 199000000 },
795*d83cc019SAndroid Build Coastguard Worker 	{ 200000000 },
796*d83cc019SAndroid Build Coastguard Worker 	{ 201000000 },
797*d83cc019SAndroid Build Coastguard Worker 	{ 202000000 },
798*d83cc019SAndroid Build Coastguard Worker 	{ 202500000 },
799*d83cc019SAndroid Build Coastguard Worker 	{ 203000000 },
800*d83cc019SAndroid Build Coastguard Worker 	{ 204000000 },
801*d83cc019SAndroid Build Coastguard Worker 	{ 204750000 },
802*d83cc019SAndroid Build Coastguard Worker 	{ 205000000 },
803*d83cc019SAndroid Build Coastguard Worker 	{ 206000000 },
804*d83cc019SAndroid Build Coastguard Worker 	{ 207000000 },
805*d83cc019SAndroid Build Coastguard Worker 	{ 207500000 },
806*d83cc019SAndroid Build Coastguard Worker 	{ 208000000 },
807*d83cc019SAndroid Build Coastguard Worker 	{ 208900000 },
808*d83cc019SAndroid Build Coastguard Worker 	{ 209000000 },
809*d83cc019SAndroid Build Coastguard Worker 	{ 209250000 },
810*d83cc019SAndroid Build Coastguard Worker 	{ 210000000 },
811*d83cc019SAndroid Build Coastguard Worker 	{ 211000000 },
812*d83cc019SAndroid Build Coastguard Worker 	{ 212000000 },
813*d83cc019SAndroid Build Coastguard Worker 	{ 213000000 },
814*d83cc019SAndroid Build Coastguard Worker 	{ 213750000 },
815*d83cc019SAndroid Build Coastguard Worker 	{ 214000000 },
816*d83cc019SAndroid Build Coastguard Worker 	{ 214750000 },
817*d83cc019SAndroid Build Coastguard Worker 	{ 215000000 },
818*d83cc019SAndroid Build Coastguard Worker 	{ 216000000 },
819*d83cc019SAndroid Build Coastguard Worker 	{ 217000000 },
820*d83cc019SAndroid Build Coastguard Worker 	{ 218000000 },
821*d83cc019SAndroid Build Coastguard Worker 	{ 218250000 },
822*d83cc019SAndroid Build Coastguard Worker 	{ 218750000 },
823*d83cc019SAndroid Build Coastguard Worker 	{ 219000000 },
824*d83cc019SAndroid Build Coastguard Worker 	{ 220000000 },
825*d83cc019SAndroid Build Coastguard Worker 	{ 220640000 },
826*d83cc019SAndroid Build Coastguard Worker 	{ 220750000 },
827*d83cc019SAndroid Build Coastguard Worker 	{ 221000000 },
828*d83cc019SAndroid Build Coastguard Worker 	{ 222000000 },
829*d83cc019SAndroid Build Coastguard Worker 	{ 222525000 },
830*d83cc019SAndroid Build Coastguard Worker 	{ 222750000 },
831*d83cc019SAndroid Build Coastguard Worker 	{ 227000000 },
832*d83cc019SAndroid Build Coastguard Worker 	{ 230250000 },
833*d83cc019SAndroid Build Coastguard Worker 	{ 233500000 },
834*d83cc019SAndroid Build Coastguard Worker 	{ 235000000 },
835*d83cc019SAndroid Build Coastguard Worker 	{ 238000000 },
836*d83cc019SAndroid Build Coastguard Worker 	{ 241500000 },
837*d83cc019SAndroid Build Coastguard Worker 	{ 245250000 },
838*d83cc019SAndroid Build Coastguard Worker 	{ 247750000 },
839*d83cc019SAndroid Build Coastguard Worker 	{ 253250000 },
840*d83cc019SAndroid Build Coastguard Worker 	{ 256250000 },
841*d83cc019SAndroid Build Coastguard Worker 	{ 262500000 },
842*d83cc019SAndroid Build Coastguard Worker 	{ 267250000 },
843*d83cc019SAndroid Build Coastguard Worker 	{ 268500000 },
844*d83cc019SAndroid Build Coastguard Worker 	{ 270000000 },
845*d83cc019SAndroid Build Coastguard Worker 	{ 272500000 },
846*d83cc019SAndroid Build Coastguard Worker 	{ 273750000 },
847*d83cc019SAndroid Build Coastguard Worker 	{ 280750000 },
848*d83cc019SAndroid Build Coastguard Worker 	{ 281250000 },
849*d83cc019SAndroid Build Coastguard Worker 	{ 286000000 },
850*d83cc019SAndroid Build Coastguard Worker 	{ 291750000 },
851*d83cc019SAndroid Build Coastguard Worker 	{ 296703000 },
852*d83cc019SAndroid Build Coastguard Worker 	{ 297000000 },
853*d83cc019SAndroid Build Coastguard Worker 	{ 298000000 },
854*d83cc019SAndroid Build Coastguard Worker };
855*d83cc019SAndroid Build Coastguard Worker 
856*d83cc019SAndroid Build Coastguard Worker struct test_ops {
857*d83cc019SAndroid Build Coastguard Worker 	bool (*compute)(int clock, struct skl_wrpll_params *params);
858*d83cc019SAndroid Build Coastguard Worker } tests[] = {
859*d83cc019SAndroid Build Coastguard Worker 	{ .compute = skl_ddi_calculate_wrpll1 },
860*d83cc019SAndroid Build Coastguard Worker 	{ .compute = skl_ddi_calculate_wrpll2 },
861*d83cc019SAndroid Build Coastguard Worker };
862*d83cc019SAndroid Build Coastguard Worker 
test_run(struct test_ops * test)863*d83cc019SAndroid Build Coastguard Worker static void test_run(struct test_ops *test)
864*d83cc019SAndroid Build Coastguard Worker {
865*d83cc019SAndroid Build Coastguard Worker 	unsigned int m;
866*d83cc019SAndroid Build Coastguard Worker 	unsigned p_odd_even[2] = { 0, 0 };
867*d83cc019SAndroid Build Coastguard Worker 	igt_stats_t stats;
868*d83cc019SAndroid Build Coastguard Worker 
869*d83cc019SAndroid Build Coastguard Worker 	igt_stats_init_with_size(&stats, ARRAY_SIZE(modes));
870*d83cc019SAndroid Build Coastguard Worker 	igt_stats_set_population(&stats, true);
871*d83cc019SAndroid Build Coastguard Worker 
872*d83cc019SAndroid Build Coastguard Worker 	for (m = 0; m < ARRAY_SIZE(modes); m++) {
873*d83cc019SAndroid Build Coastguard Worker 		struct skl_wrpll_params params = {};
874*d83cc019SAndroid Build Coastguard Worker 		int clock = modes[m].clock;
875*d83cc019SAndroid Build Coastguard Worker 		unsigned int p;
876*d83cc019SAndroid Build Coastguard Worker 
877*d83cc019SAndroid Build Coastguard Worker 		if (!test->compute(clock, &params)) {
878*d83cc019SAndroid Build Coastguard Worker 			fprintf(stderr, "Couldn't compute divider for %dHz\n",
879*d83cc019SAndroid Build Coastguard Worker 				clock);
880*d83cc019SAndroid Build Coastguard Worker 			continue;
881*d83cc019SAndroid Build Coastguard Worker 		}
882*d83cc019SAndroid Build Coastguard Worker 
883*d83cc019SAndroid Build Coastguard Worker 		p = params.p0 * params.p1 * params.p2;
884*d83cc019SAndroid Build Coastguard Worker 
885*d83cc019SAndroid Build Coastguard Worker 		/*
886*d83cc019SAndroid Build Coastguard Worker 		 * make sure we respect the +1%/-6% contraint around the
887*d83cc019SAndroid Build Coastguard Worker 		 * central frequency
888*d83cc019SAndroid Build Coastguard Worker 		 */
889*d83cc019SAndroid Build Coastguard Worker 		{
890*d83cc019SAndroid Build Coastguard Worker 			uint64_t dco_freq = (uint64_t)p * clock * 5;
891*d83cc019SAndroid Build Coastguard Worker 			uint64_t central_freq = params.central_freq_hz;
892*d83cc019SAndroid Build Coastguard Worker 			uint64_t deviation;
893*d83cc019SAndroid Build Coastguard Worker 			uint64_t diff;
894*d83cc019SAndroid Build Coastguard Worker 
895*d83cc019SAndroid Build Coastguard Worker 			diff = abs_diff(dco_freq, central_freq);
896*d83cc019SAndroid Build Coastguard Worker 			deviation = div64_u64(10000 * diff, central_freq);
897*d83cc019SAndroid Build Coastguard Worker 
898*d83cc019SAndroid Build Coastguard Worker 			igt_stats_push(&stats, deviation);
899*d83cc019SAndroid Build Coastguard Worker 
900*d83cc019SAndroid Build Coastguard Worker 			if (dco_freq > central_freq) {
901*d83cc019SAndroid Build Coastguard Worker 				if (deviation > 100)
902*d83cc019SAndroid Build Coastguard Worker 					printf("failed constraint for %dHz "
903*d83cc019SAndroid Build Coastguard Worker 					       "deviation=%"PRIu64"\n", clock,
904*d83cc019SAndroid Build Coastguard Worker 					       deviation);
905*d83cc019SAndroid Build Coastguard Worker 			} else if (deviation > 600)
906*d83cc019SAndroid Build Coastguard Worker 				printf("failed constraint for %dHz "
907*d83cc019SAndroid Build Coastguard Worker 				       "deviation=%"PRIu64"\n", clock,
908*d83cc019SAndroid Build Coastguard Worker 				       deviation);
909*d83cc019SAndroid Build Coastguard Worker 		}
910*d83cc019SAndroid Build Coastguard Worker 
911*d83cc019SAndroid Build Coastguard Worker 		/*
912*d83cc019SAndroid Build Coastguard Worker 		 * count how many even/odd dividers we have through the whole
913*d83cc019SAndroid Build Coastguard Worker 		 * list of tested frequencies
914*d83cc019SAndroid Build Coastguard Worker 		 */
915*d83cc019SAndroid Build Coastguard Worker 		{
916*d83cc019SAndroid Build Coastguard Worker 			p_odd_even[p % 2]++;
917*d83cc019SAndroid Build Coastguard Worker 		}
918*d83cc019SAndroid Build Coastguard Worker 	}
919*d83cc019SAndroid Build Coastguard Worker 
920*d83cc019SAndroid Build Coastguard Worker 	printf("even/odd dividers: %d/%d\n", p_odd_even[0], p_odd_even[1]);
921*d83cc019SAndroid Build Coastguard Worker 	printf("mean central freq deviation: %.2lf\n",
922*d83cc019SAndroid Build Coastguard Worker 	       igt_stats_get_mean(&stats));
923*d83cc019SAndroid Build Coastguard Worker 
924*d83cc019SAndroid Build Coastguard Worker 	igt_stats_fini(&stats);
925*d83cc019SAndroid Build Coastguard Worker }
926*d83cc019SAndroid Build Coastguard Worker 
main(int argc,char ** argv)927*d83cc019SAndroid Build Coastguard Worker int main(int argc, char **argv)
928*d83cc019SAndroid Build Coastguard Worker {
929*d83cc019SAndroid Build Coastguard Worker 	unsigned int t;
930*d83cc019SAndroid Build Coastguard Worker 
931*d83cc019SAndroid Build Coastguard Worker 	test_multipliers();
932*d83cc019SAndroid Build Coastguard Worker 
933*d83cc019SAndroid Build Coastguard Worker 	for (t = 0; t < ARRAY_SIZE(tests); t++) {
934*d83cc019SAndroid Build Coastguard Worker 		printf("=== Testing algorithm #%d\n", t + 1);
935*d83cc019SAndroid Build Coastguard Worker 		test_run(&tests[t]);
936*d83cc019SAndroid Build Coastguard Worker 	}
937*d83cc019SAndroid Build Coastguard Worker 
938*d83cc019SAndroid Build Coastguard Worker 
939*d83cc019SAndroid Build Coastguard Worker 	return 0;
940*d83cc019SAndroid Build Coastguard Worker }
941