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, ¶ms)) {
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