1*193032a3SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT
2*193032a3SAndroid Build Coastguard Worker /*
3*193032a3SAndroid Build Coastguard Worker * Copyright 2006-2012 Red Hat, Inc.
4*193032a3SAndroid Build Coastguard Worker * Copyright 2018-2021 Cisco Systems, Inc. and/or its affiliates. All rights reserved.
5*193032a3SAndroid Build Coastguard Worker *
6*193032a3SAndroid Build Coastguard Worker * Author: Adam Jackson <[email protected]>
7*193032a3SAndroid Build Coastguard Worker * Maintainer: Hans Verkuil <[email protected]>
8*193032a3SAndroid Build Coastguard Worker */
9*193032a3SAndroid Build Coastguard Worker
10*193032a3SAndroid Build Coastguard Worker #include <stdio.h>
11*193032a3SAndroid Build Coastguard Worker #include <stdlib.h>
12*193032a3SAndroid Build Coastguard Worker #include <math.h>
13*193032a3SAndroid Build Coastguard Worker #include <time.h>
14*193032a3SAndroid Build Coastguard Worker
15*193032a3SAndroid Build Coastguard Worker #include "edid-decode.h"
16*193032a3SAndroid Build Coastguard Worker
17*193032a3SAndroid Build Coastguard Worker #define CELL_GRAN 8.0
18*193032a3SAndroid Build Coastguard Worker #define MARGIN_PERC 1.8
19*193032a3SAndroid Build Coastguard Worker #define GTF_MIN_PORCH 1.0
20*193032a3SAndroid Build Coastguard Worker #define GTF_V_SYNC_RQD 3.0
21*193032a3SAndroid Build Coastguard Worker #define GTF_H_SYNC_PERC 8.0
22*193032a3SAndroid Build Coastguard Worker #define GTF_MIN_VSYNC_BP 550.0
23*193032a3SAndroid Build Coastguard Worker
calc_gtf_mode(unsigned h_pixels,unsigned v_lines,double ip_freq_rqd,bool int_rqd,enum gtf_ip_parm ip_parm,bool margins_rqd,bool secondary,double C,double M,double K,double J)24*193032a3SAndroid Build Coastguard Worker timings edid_state::calc_gtf_mode(unsigned h_pixels, unsigned v_lines,
25*193032a3SAndroid Build Coastguard Worker double ip_freq_rqd, bool int_rqd,
26*193032a3SAndroid Build Coastguard Worker enum gtf_ip_parm ip_parm, bool margins_rqd,
27*193032a3SAndroid Build Coastguard Worker bool secondary, double C, double M, double K, double J)
28*193032a3SAndroid Build Coastguard Worker {
29*193032a3SAndroid Build Coastguard Worker timings t = {};
30*193032a3SAndroid Build Coastguard Worker /* C' and M' are part of the Blanking Duty Cycle computation */
31*193032a3SAndroid Build Coastguard Worker double C_PRIME = ((C - J) * K / 256.0) + J;
32*193032a3SAndroid Build Coastguard Worker double M_PRIME = K / 256.0 * M;
33*193032a3SAndroid Build Coastguard Worker
34*193032a3SAndroid Build Coastguard Worker double h_pixels_rnd = round(h_pixels / CELL_GRAN) * CELL_GRAN;
35*193032a3SAndroid Build Coastguard Worker double v_lines_rnd = int_rqd ? round(v_lines / 2.0) : v_lines;
36*193032a3SAndroid Build Coastguard Worker unsigned hor_margin = margins_rqd ?
37*193032a3SAndroid Build Coastguard Worker round(h_pixels_rnd * MARGIN_PERC / 100.0 / CELL_GRAN) * CELL_GRAN : 0;
38*193032a3SAndroid Build Coastguard Worker unsigned vert_margin = margins_rqd ? round(MARGIN_PERC / 100.0 * v_lines_rnd) : 0;
39*193032a3SAndroid Build Coastguard Worker double interlace = int_rqd ? 0.5 : 0;
40*193032a3SAndroid Build Coastguard Worker double total_active_pixels = h_pixels_rnd + hor_margin * 2;
41*193032a3SAndroid Build Coastguard Worker
42*193032a3SAndroid Build Coastguard Worker t.hact = h_pixels_rnd;
43*193032a3SAndroid Build Coastguard Worker t.vact = v_lines;
44*193032a3SAndroid Build Coastguard Worker t.interlaced = int_rqd;
45*193032a3SAndroid Build Coastguard Worker
46*193032a3SAndroid Build Coastguard Worker double pixel_freq;
47*193032a3SAndroid Build Coastguard Worker double h_blank_pixels;
48*193032a3SAndroid Build Coastguard Worker double total_pixels;
49*193032a3SAndroid Build Coastguard Worker double v_sync_bp;
50*193032a3SAndroid Build Coastguard Worker
51*193032a3SAndroid Build Coastguard Worker if (ip_parm == gtf_ip_vert_freq) {
52*193032a3SAndroid Build Coastguard Worker // vertical frame frequency (Hz)
53*193032a3SAndroid Build Coastguard Worker double v_field_rate_rqd = int_rqd ? ip_freq_rqd * 2 : ip_freq_rqd;
54*193032a3SAndroid Build Coastguard Worker double h_period_est = ((1.0 / v_field_rate_rqd) - GTF_MIN_VSYNC_BP / 1000000.0) /
55*193032a3SAndroid Build Coastguard Worker (v_lines_rnd + vert_margin * 2 + GTF_MIN_PORCH + interlace) * 1000000.0;
56*193032a3SAndroid Build Coastguard Worker v_sync_bp = round(GTF_MIN_VSYNC_BP / h_period_est);
57*193032a3SAndroid Build Coastguard Worker double total_v_lines = v_lines_rnd + vert_margin * 2 +
58*193032a3SAndroid Build Coastguard Worker v_sync_bp + interlace + GTF_MIN_PORCH;
59*193032a3SAndroid Build Coastguard Worker double v_field_rate_est = 1.0 / h_period_est / total_v_lines * 1000000.0;
60*193032a3SAndroid Build Coastguard Worker double h_period = h_period_est / (v_field_rate_rqd / v_field_rate_est);
61*193032a3SAndroid Build Coastguard Worker double ideal_duty_cycle = C_PRIME - (M_PRIME * h_period / 1000.0);
62*193032a3SAndroid Build Coastguard Worker h_blank_pixels = round(total_active_pixels * ideal_duty_cycle /
63*193032a3SAndroid Build Coastguard Worker (100.0 - ideal_duty_cycle) /
64*193032a3SAndroid Build Coastguard Worker (2 * CELL_GRAN)) * 2 * CELL_GRAN;
65*193032a3SAndroid Build Coastguard Worker total_pixels = total_active_pixels + h_blank_pixels;
66*193032a3SAndroid Build Coastguard Worker pixel_freq = total_pixels / h_period;
67*193032a3SAndroid Build Coastguard Worker } else if (ip_parm == gtf_ip_hor_freq) {
68*193032a3SAndroid Build Coastguard Worker // horizontal frequency (kHz)
69*193032a3SAndroid Build Coastguard Worker double h_freq = ip_freq_rqd;
70*193032a3SAndroid Build Coastguard Worker v_sync_bp = round(GTF_MIN_VSYNC_BP * h_freq / 1000.0);
71*193032a3SAndroid Build Coastguard Worker double ideal_duty_cycle = C_PRIME - (M_PRIME / h_freq);
72*193032a3SAndroid Build Coastguard Worker h_blank_pixels = round(total_active_pixels * ideal_duty_cycle /
73*193032a3SAndroid Build Coastguard Worker (100.0 - ideal_duty_cycle) /
74*193032a3SAndroid Build Coastguard Worker (2 * CELL_GRAN)) * 2 * CELL_GRAN;
75*193032a3SAndroid Build Coastguard Worker total_pixels = total_active_pixels + h_blank_pixels;
76*193032a3SAndroid Build Coastguard Worker pixel_freq = total_pixels * h_freq / 1000.0;
77*193032a3SAndroid Build Coastguard Worker } else {
78*193032a3SAndroid Build Coastguard Worker // pixel clock rate (MHz)
79*193032a3SAndroid Build Coastguard Worker pixel_freq = ip_freq_rqd;
80*193032a3SAndroid Build Coastguard Worker double ideal_h_period =
81*193032a3SAndroid Build Coastguard Worker ((C_PRIME - 100.0) +
82*193032a3SAndroid Build Coastguard Worker sqrt(((100.0 - C_PRIME) * (100.0 - C_PRIME) +
83*193032a3SAndroid Build Coastguard Worker (0.4 * M_PRIME * (total_active_pixels + hor_margin * 2) /
84*193032a3SAndroid Build Coastguard Worker pixel_freq)))) / 2.0 / M_PRIME * 1000.0;
85*193032a3SAndroid Build Coastguard Worker double ideal_duty_cycle = C_PRIME - (M_PRIME * ideal_h_period) / 1000.0;
86*193032a3SAndroid Build Coastguard Worker h_blank_pixels = round(total_active_pixels * ideal_duty_cycle /
87*193032a3SAndroid Build Coastguard Worker (100.0 - ideal_duty_cycle) /
88*193032a3SAndroid Build Coastguard Worker (2 * CELL_GRAN)) * 2 * CELL_GRAN;
89*193032a3SAndroid Build Coastguard Worker total_pixels = total_active_pixels + h_blank_pixels;
90*193032a3SAndroid Build Coastguard Worker double h_freq = pixel_freq / total_pixels * 1000.0;
91*193032a3SAndroid Build Coastguard Worker v_sync_bp = round(GTF_MIN_VSYNC_BP * h_freq / 1000.0);
92*193032a3SAndroid Build Coastguard Worker }
93*193032a3SAndroid Build Coastguard Worker
94*193032a3SAndroid Build Coastguard Worker double v_back_porch = v_sync_bp - GTF_V_SYNC_RQD;
95*193032a3SAndroid Build Coastguard Worker
96*193032a3SAndroid Build Coastguard Worker t.vbp = v_back_porch;
97*193032a3SAndroid Build Coastguard Worker t.vsync = GTF_V_SYNC_RQD;
98*193032a3SAndroid Build Coastguard Worker t.vfp = GTF_MIN_PORCH;
99*193032a3SAndroid Build Coastguard Worker t.pixclk_khz = round(1000.0 * pixel_freq);
100*193032a3SAndroid Build Coastguard Worker t.hsync = round(GTF_H_SYNC_PERC / 100.0 * total_pixels / CELL_GRAN) * CELL_GRAN;
101*193032a3SAndroid Build Coastguard Worker t.hfp = (h_blank_pixels / 2.0) - t.hsync;
102*193032a3SAndroid Build Coastguard Worker t.hbp = t.hfp + t.hsync;
103*193032a3SAndroid Build Coastguard Worker t.hborder = hor_margin;
104*193032a3SAndroid Build Coastguard Worker t.vborder = vert_margin;
105*193032a3SAndroid Build Coastguard Worker t.pos_pol_hsync = secondary;
106*193032a3SAndroid Build Coastguard Worker t.pos_pol_vsync = !secondary;
107*193032a3SAndroid Build Coastguard Worker t.rb = secondary ? RB_GTF : RB_NONE;
108*193032a3SAndroid Build Coastguard Worker return t;
109*193032a3SAndroid Build Coastguard Worker }
110*193032a3SAndroid Build Coastguard Worker
edid_gtf_mode(unsigned refresh,struct timings & t)111*193032a3SAndroid Build Coastguard Worker void edid_state::edid_gtf_mode(unsigned refresh, struct timings &t)
112*193032a3SAndroid Build Coastguard Worker {
113*193032a3SAndroid Build Coastguard Worker unsigned hratio = t.hratio;
114*193032a3SAndroid Build Coastguard Worker unsigned vratio = t.vratio;
115*193032a3SAndroid Build Coastguard Worker t = calc_gtf_mode(t.hact, t.vact, refresh, t.interlaced);
116*193032a3SAndroid Build Coastguard Worker t.hratio = hratio;
117*193032a3SAndroid Build Coastguard Worker t.vratio = vratio;
118*193032a3SAndroid Build Coastguard Worker }
119*193032a3SAndroid Build Coastguard Worker
120*193032a3SAndroid Build Coastguard Worker #define CVT_MIN_VSYNC_BP 550.0
121*193032a3SAndroid Build Coastguard Worker #define CVT_MIN_V_PORCH 3
122*193032a3SAndroid Build Coastguard Worker #define CVT_MIN_V_BPORCH 6
123*193032a3SAndroid Build Coastguard Worker #define CVT_C_PRIME 30.0
124*193032a3SAndroid Build Coastguard Worker #define CVT_M_PRIME 300.0
125*193032a3SAndroid Build Coastguard Worker #define CVT_RB_MIN_VBLANK 460.0
126*193032a3SAndroid Build Coastguard Worker
127*193032a3SAndroid Build Coastguard Worker // If rb == RB_CVT_V2, then alt means video-optimized (i.e. 59.94 instead of 60 Hz, etc.).
128*193032a3SAndroid Build Coastguard Worker // If rb == RB_CVT_V3, then alt means that rb_h_blank is 160 instead of 80.
calc_cvt_mode(unsigned h_pixels,unsigned v_lines,double ip_freq_rqd,unsigned rb,bool int_rqd,bool margins_rqd,bool alt,unsigned rb_h_blank)129*193032a3SAndroid Build Coastguard Worker timings edid_state::calc_cvt_mode(unsigned h_pixels, unsigned v_lines,
130*193032a3SAndroid Build Coastguard Worker double ip_freq_rqd, unsigned rb, bool int_rqd,
131*193032a3SAndroid Build Coastguard Worker bool margins_rqd, bool alt, unsigned rb_h_blank)
132*193032a3SAndroid Build Coastguard Worker {
133*193032a3SAndroid Build Coastguard Worker timings t = {};
134*193032a3SAndroid Build Coastguard Worker
135*193032a3SAndroid Build Coastguard Worker t.hact = h_pixels;
136*193032a3SAndroid Build Coastguard Worker t.vact = v_lines;
137*193032a3SAndroid Build Coastguard Worker t.interlaced = int_rqd;
138*193032a3SAndroid Build Coastguard Worker
139*193032a3SAndroid Build Coastguard Worker double cell_gran = rb == RB_CVT_V2 ? 1 : CELL_GRAN;
140*193032a3SAndroid Build Coastguard Worker double h_pixels_rnd = floor(h_pixels / cell_gran) * cell_gran;
141*193032a3SAndroid Build Coastguard Worker double v_lines_rnd = int_rqd ? floor(v_lines / 2.0) : v_lines;
142*193032a3SAndroid Build Coastguard Worker unsigned hor_margin = margins_rqd ?
143*193032a3SAndroid Build Coastguard Worker floor((h_pixels_rnd * MARGIN_PERC / 100.0) / cell_gran) * cell_gran : 0;
144*193032a3SAndroid Build Coastguard Worker unsigned vert_margin = margins_rqd ? floor(MARGIN_PERC / 100.0 * v_lines_rnd) : 0;
145*193032a3SAndroid Build Coastguard Worker double interlace = int_rqd ? 0.5 : 0;
146*193032a3SAndroid Build Coastguard Worker double total_active_pixels = h_pixels_rnd + hor_margin * 2;
147*193032a3SAndroid Build Coastguard Worker double v_field_rate_rqd = int_rqd ? ip_freq_rqd * 2 : ip_freq_rqd;
148*193032a3SAndroid Build Coastguard Worker double clock_step = rb == RB_CVT_V2 ? 0.001 : 0.25;
149*193032a3SAndroid Build Coastguard Worker double h_blank = (rb == RB_CVT_V1 || (rb == RB_CVT_V3 && alt)) ? 160 : 80;
150*193032a3SAndroid Build Coastguard Worker double rb_v_fporch = rb == RB_CVT_V1 ? 3 : 1;
151*193032a3SAndroid Build Coastguard Worker double refresh_multiplier = (rb == RB_CVT_V2 && alt) ? 1000.0 / 1001.0 : 1;
152*193032a3SAndroid Build Coastguard Worker double h_sync = 32;
153*193032a3SAndroid Build Coastguard Worker
154*193032a3SAndroid Build Coastguard Worker double v_sync;
155*193032a3SAndroid Build Coastguard Worker double pixel_freq;
156*193032a3SAndroid Build Coastguard Worker double v_blank;
157*193032a3SAndroid Build Coastguard Worker double v_sync_bp;
158*193032a3SAndroid Build Coastguard Worker
159*193032a3SAndroid Build Coastguard Worker if (rb == RB_CVT_V3 && rb_h_blank) {
160*193032a3SAndroid Build Coastguard Worker h_blank = rb_h_blank & ~7;
161*193032a3SAndroid Build Coastguard Worker if (h_blank < 80)
162*193032a3SAndroid Build Coastguard Worker h_blank = 80;
163*193032a3SAndroid Build Coastguard Worker else if (h_blank > 200)
164*193032a3SAndroid Build Coastguard Worker h_blank = 200;
165*193032a3SAndroid Build Coastguard Worker }
166*193032a3SAndroid Build Coastguard Worker
167*193032a3SAndroid Build Coastguard Worker /* Determine VSync Width from aspect ratio */
168*193032a3SAndroid Build Coastguard Worker if ((t.vact * 4 / 3) == t.hact)
169*193032a3SAndroid Build Coastguard Worker v_sync = 4;
170*193032a3SAndroid Build Coastguard Worker else if ((t.vact * 16 / 9) == t.hact)
171*193032a3SAndroid Build Coastguard Worker v_sync = 5;
172*193032a3SAndroid Build Coastguard Worker else if ((t.vact * 16 / 10) == t.hact)
173*193032a3SAndroid Build Coastguard Worker v_sync = 6;
174*193032a3SAndroid Build Coastguard Worker else if (!(t.vact % 4) && ((t.vact * 5 / 4) == t.hact))
175*193032a3SAndroid Build Coastguard Worker v_sync = 7;
176*193032a3SAndroid Build Coastguard Worker else if ((t.vact * 15 / 9) == t.hact)
177*193032a3SAndroid Build Coastguard Worker v_sync = 7;
178*193032a3SAndroid Build Coastguard Worker else /* Custom */
179*193032a3SAndroid Build Coastguard Worker v_sync = 10;
180*193032a3SAndroid Build Coastguard Worker
181*193032a3SAndroid Build Coastguard Worker if (rb >= RB_CVT_V2)
182*193032a3SAndroid Build Coastguard Worker v_sync = 8;
183*193032a3SAndroid Build Coastguard Worker
184*193032a3SAndroid Build Coastguard Worker if (rb == RB_NONE) {
185*193032a3SAndroid Build Coastguard Worker double h_period_est = ((1.0 / v_field_rate_rqd) - CVT_MIN_VSYNC_BP / 1000000.0) /
186*193032a3SAndroid Build Coastguard Worker (v_lines_rnd + vert_margin * 2 + CVT_MIN_V_PORCH + interlace) * 1000000.0;
187*193032a3SAndroid Build Coastguard Worker v_sync_bp = floor(CVT_MIN_VSYNC_BP / h_period_est) + 1;
188*193032a3SAndroid Build Coastguard Worker if (v_sync_bp < v_sync + CVT_MIN_V_BPORCH)
189*193032a3SAndroid Build Coastguard Worker v_sync_bp = v_sync + CVT_MIN_V_BPORCH;
190*193032a3SAndroid Build Coastguard Worker v_blank = v_sync_bp + CVT_MIN_V_PORCH;
191*193032a3SAndroid Build Coastguard Worker double ideal_duty_cycle = CVT_C_PRIME - (CVT_M_PRIME * h_period_est / 1000.0);
192*193032a3SAndroid Build Coastguard Worker if (ideal_duty_cycle < 20)
193*193032a3SAndroid Build Coastguard Worker ideal_duty_cycle = 20;
194*193032a3SAndroid Build Coastguard Worker h_blank = floor(total_active_pixels * ideal_duty_cycle /
195*193032a3SAndroid Build Coastguard Worker (100.0 - ideal_duty_cycle) /
196*193032a3SAndroid Build Coastguard Worker (2 * CELL_GRAN)) * 2 * CELL_GRAN;
197*193032a3SAndroid Build Coastguard Worker double total_pixels = total_active_pixels + h_blank;
198*193032a3SAndroid Build Coastguard Worker h_sync = floor(total_pixels * 0.08 / CELL_GRAN) * CELL_GRAN;
199*193032a3SAndroid Build Coastguard Worker pixel_freq = floor((total_pixels / h_period_est) / clock_step) * clock_step;
200*193032a3SAndroid Build Coastguard Worker } else {
201*193032a3SAndroid Build Coastguard Worker double h_period_est = ((1000000.0 / v_field_rate_rqd) - CVT_RB_MIN_VBLANK) /
202*193032a3SAndroid Build Coastguard Worker (v_lines_rnd + vert_margin * 2);
203*193032a3SAndroid Build Coastguard Worker double vbi_lines = floor(CVT_RB_MIN_VBLANK / h_period_est) + 1;
204*193032a3SAndroid Build Coastguard Worker double rb_min_vbi = rb_v_fporch + v_sync + CVT_MIN_V_BPORCH;
205*193032a3SAndroid Build Coastguard Worker v_blank = vbi_lines < rb_min_vbi ? rb_min_vbi : vbi_lines;
206*193032a3SAndroid Build Coastguard Worker double total_v_lines = v_blank + v_lines_rnd + vert_margin * 2 + interlace;
207*193032a3SAndroid Build Coastguard Worker if (rb == RB_CVT_V1)
208*193032a3SAndroid Build Coastguard Worker v_sync_bp = v_blank - rb_v_fporch;
209*193032a3SAndroid Build Coastguard Worker else
210*193032a3SAndroid Build Coastguard Worker v_sync_bp = v_sync + CVT_MIN_V_BPORCH;
211*193032a3SAndroid Build Coastguard Worker double total_pixels = h_blank + total_active_pixels;
212*193032a3SAndroid Build Coastguard Worker double freq = v_field_rate_rqd * total_v_lines * total_pixels * refresh_multiplier;
213*193032a3SAndroid Build Coastguard Worker if (rb == RB_CVT_V3)
214*193032a3SAndroid Build Coastguard Worker pixel_freq = ceil((freq / 1000000.0) / clock_step) * clock_step;
215*193032a3SAndroid Build Coastguard Worker else
216*193032a3SAndroid Build Coastguard Worker pixel_freq = floor((freq / 1000000.0) / clock_step) * clock_step;
217*193032a3SAndroid Build Coastguard Worker }
218*193032a3SAndroid Build Coastguard Worker
219*193032a3SAndroid Build Coastguard Worker t.vbp = v_sync_bp - v_sync;
220*193032a3SAndroid Build Coastguard Worker t.vsync = v_sync;
221*193032a3SAndroid Build Coastguard Worker t.vfp = v_blank - t.vbp - t.vsync;
222*193032a3SAndroid Build Coastguard Worker t.pixclk_khz = round(1000.0 * pixel_freq);
223*193032a3SAndroid Build Coastguard Worker t.hsync = h_sync;
224*193032a3SAndroid Build Coastguard Worker if (rb == RB_CVT_V3)
225*193032a3SAndroid Build Coastguard Worker t.hfp = 8;
226*193032a3SAndroid Build Coastguard Worker else
227*193032a3SAndroid Build Coastguard Worker t.hfp = (h_blank / 2.0) - t.hsync;
228*193032a3SAndroid Build Coastguard Worker t.hbp = h_blank - t.hfp - t.hsync;
229*193032a3SAndroid Build Coastguard Worker t.hborder = hor_margin;
230*193032a3SAndroid Build Coastguard Worker t.vborder = vert_margin;
231*193032a3SAndroid Build Coastguard Worker t.rb = rb;
232*193032a3SAndroid Build Coastguard Worker if (alt && (rb == RB_CVT_V2 || rb == RB_CVT_V3))
233*193032a3SAndroid Build Coastguard Worker t.rb |= RB_ALT;
234*193032a3SAndroid Build Coastguard Worker t.pos_pol_hsync = t.rb;
235*193032a3SAndroid Build Coastguard Worker t.pos_pol_vsync = !t.rb;
236*193032a3SAndroid Build Coastguard Worker calc_ratio(&t);
237*193032a3SAndroid Build Coastguard Worker return t;
238*193032a3SAndroid Build Coastguard Worker }
239*193032a3SAndroid Build Coastguard Worker
edid_cvt_mode(unsigned refresh,struct timings & t)240*193032a3SAndroid Build Coastguard Worker void edid_state::edid_cvt_mode(unsigned refresh, struct timings &t)
241*193032a3SAndroid Build Coastguard Worker {
242*193032a3SAndroid Build Coastguard Worker unsigned hratio = t.hratio;
243*193032a3SAndroid Build Coastguard Worker unsigned vratio = t.vratio;
244*193032a3SAndroid Build Coastguard Worker
245*193032a3SAndroid Build Coastguard Worker t = calc_cvt_mode(t.hact, t.vact, refresh, t.rb & ~RB_ALT, t.interlaced,
246*193032a3SAndroid Build Coastguard Worker false, t.rb & RB_ALT);
247*193032a3SAndroid Build Coastguard Worker t.hratio = hratio;
248*193032a3SAndroid Build Coastguard Worker t.vratio = vratio;
249*193032a3SAndroid Build Coastguard Worker }
250