1 /*
2  * Copyright 2017 Advanced Micro Devices, Inc.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  *
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20  * OTHER DEALINGS IN THE SOFTWARE.
21  *
22  * Authors: AMD
23  *
24  */
25 
26 #include "dm_services.h"
27 #include "dcn_calc_auto.h"
28 #include "dcn_calc_math.h"
29 
30 /*
31  * NOTE:
32  *   This file is gcc-parseable HW gospel, coming straight from HW engineers.
33  *
34  * It doesn't adhere to Linux kernel style and sometimes will do things in odd
35  * ways. Unless there is something clearly wrong with it the code should
36  * remain as-is as it provides us with a guarantee from HW that it is correct.
37  */
38 
39 /*REVISION#250*/
40 void scaler_settings_calculation(struct dcn_bw_internal_vars *v)
41 {
42 	int k;
43 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
44 		if (v->allow_different_hratio_vratio == dcn_bw_yes) {
45 			if (v->source_scan[k] == dcn_bw_hor) {
46 				v->h_ratio[k] = v->viewport_width[k] / v->scaler_rec_out_width[k];
47 				v->v_ratio[k] = v->viewport_height[k] / v->scaler_recout_height[k];
48 			}
49 			else {
50 				v->h_ratio[k] = v->viewport_height[k] / v->scaler_rec_out_width[k];
51 				v->v_ratio[k] = v->viewport_width[k] / v->scaler_recout_height[k];
52 			}
53 		}
54 		else {
55 			if (v->source_scan[k] == dcn_bw_hor) {
56 				v->h_ratio[k] =dcn_bw_max2(v->viewport_width[k] / v->scaler_rec_out_width[k], v->viewport_height[k] / v->scaler_recout_height[k]);
57 			}
58 			else {
59 				v->h_ratio[k] =dcn_bw_max2(v->viewport_height[k] / v->scaler_rec_out_width[k], v->viewport_width[k] / v->scaler_recout_height[k]);
60 			}
61 			v->v_ratio[k] = v->h_ratio[k];
62 		}
63 		if (v->interlace_output[k] == 1.0) {
64 			v->v_ratio[k] = 2.0 * v->v_ratio[k];
65 		}
66 		if ((v->underscan_output[k] == 1.0)) {
67 			v->h_ratio[k] = v->h_ratio[k] * v->under_scan_factor;
68 			v->v_ratio[k] = v->v_ratio[k] * v->under_scan_factor;
69 		}
70 	}
71 	/*scaler taps calculation*/
72 
73 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
74 		if (v->h_ratio[k] > 1.0) {
75 			v->acceptable_quality_hta_ps =dcn_bw_min2(v->max_hscl_taps, 2.0 *dcn_bw_ceil2(v->h_ratio[k], 1.0));
76 		}
77 		else if (v->h_ratio[k] < 1.0) {
78 			v->acceptable_quality_hta_ps = 4.0;
79 		}
80 		else {
81 			v->acceptable_quality_hta_ps = 1.0;
82 		}
83 		if (v->ta_pscalculation == dcn_bw_override) {
84 			v->htaps[k] = v->override_hta_ps[k];
85 		}
86 		else {
87 			v->htaps[k] = v->acceptable_quality_hta_ps;
88 		}
89 		if (v->v_ratio[k] > 1.0) {
90 			v->acceptable_quality_vta_ps =dcn_bw_min2(v->max_vscl_taps, 2.0 *dcn_bw_ceil2(v->v_ratio[k], 1.0));
91 		}
92 		else if (v->v_ratio[k] < 1.0) {
93 			v->acceptable_quality_vta_ps = 4.0;
94 		}
95 		else {
96 			v->acceptable_quality_vta_ps = 1.0;
97 		}
98 		if (v->ta_pscalculation == dcn_bw_override) {
99 			v->vtaps[k] = v->override_vta_ps[k];
100 		}
101 		else {
102 			v->vtaps[k] = v->acceptable_quality_vta_ps;
103 		}
104 		if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64 || v->source_pixel_format[k] == dcn_bw_rgb_sub_32 || v->source_pixel_format[k] == dcn_bw_rgb_sub_16) {
105 			v->vta_pschroma[k] = 0.0;
106 			v->hta_pschroma[k] = 0.0;
107 		}
108 		else {
109 			if (v->ta_pscalculation == dcn_bw_override) {
110 				v->vta_pschroma[k] = v->override_vta_pschroma[k];
111 				v->hta_pschroma[k] = v->override_hta_pschroma[k];
112 			}
113 			else {
114 				v->vta_pschroma[k] = v->acceptable_quality_vta_ps;
115 				v->hta_pschroma[k] = v->acceptable_quality_hta_ps;
116 			}
117 		}
118 	}
119 }
120 
121 void mode_support_and_system_configuration(struct dcn_bw_internal_vars *v)
122 {
123 	int i;
124 	int j;
125 	int k;
126 	/*mode support, voltage state and soc configuration*/
127 
128 	/*scale ratio support check*/
129 
130 	v->scale_ratio_support = dcn_bw_yes;
131 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
132 		if (v->h_ratio[k] > v->max_hscl_ratio || v->v_ratio[k] > v->max_vscl_ratio || v->h_ratio[k] > v->htaps[k] || v->v_ratio[k] > v->vtaps[k] || (v->source_pixel_format[k] != dcn_bw_rgb_sub_64 && v->source_pixel_format[k] != dcn_bw_rgb_sub_32 && v->source_pixel_format[k] != dcn_bw_rgb_sub_16 && (v->h_ratio[k] / 2.0 > v->hta_pschroma[k] || v->v_ratio[k] / 2.0 > v->vta_pschroma[k]))) {
133 			v->scale_ratio_support = dcn_bw_no;
134 		}
135 	}
136 	/*source format, pixel format and scan support check*/
137 
138 	v->source_format_pixel_and_scan_support = dcn_bw_yes;
139 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
140 		if ((v->source_surface_mode[k] == dcn_bw_sw_linear && v->source_scan[k] != dcn_bw_hor) || ((v->source_surface_mode[k] == dcn_bw_sw_4_kb_d || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d_x || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_x || v->source_surface_mode[k] == dcn_bw_sw_var_d || v->source_surface_mode[k] == dcn_bw_sw_var_d_x) && v->source_pixel_format[k] != dcn_bw_rgb_sub_64)) {
141 			v->source_format_pixel_and_scan_support = dcn_bw_no;
142 		}
143 	}
144 	/*bandwidth support check*/
145 
146 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
147 		if (v->source_scan[k] == dcn_bw_hor) {
148 			v->swath_width_ysingle_dpp[k] = v->viewport_width[k];
149 		}
150 		else {
151 			v->swath_width_ysingle_dpp[k] = v->viewport_height[k];
152 		}
153 		if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) {
154 			v->byte_per_pixel_in_dety[k] = 8.0;
155 			v->byte_per_pixel_in_detc[k] = 0.0;
156 		}
157 		else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_32) {
158 			v->byte_per_pixel_in_dety[k] = 4.0;
159 			v->byte_per_pixel_in_detc[k] = 0.0;
160 		}
161 		else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_16) {
162 			v->byte_per_pixel_in_dety[k] = 2.0;
163 			v->byte_per_pixel_in_detc[k] = 0.0;
164 		}
165 		else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8) {
166 			v->byte_per_pixel_in_dety[k] = 1.0;
167 			v->byte_per_pixel_in_detc[k] = 2.0;
168 		}
169 		else {
170 			v->byte_per_pixel_in_dety[k] = 4.0f / 3.0f;
171 			v->byte_per_pixel_in_detc[k] = 8.0f / 3.0f;
172 		}
173 	}
174 	v->total_read_bandwidth_consumed_gbyte_per_second = 0.0;
175 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
176 		v->read_bandwidth[k] = v->swath_width_ysingle_dpp[k] * (dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) * v->v_ratio[k] +dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 2.0 * v->v_ratio[k] / 2) / (v->htotal[k] / v->pixel_clock[k]);
177 		if (v->dcc_enable[k] == dcn_bw_yes) {
178 			v->read_bandwidth[k] = v->read_bandwidth[k] * (1 + 1 / 256);
179 		}
180 		if (v->pte_enable == dcn_bw_yes && v->source_scan[k] != dcn_bw_hor && (v->source_surface_mode[k] == dcn_bw_sw_4_kb_s || v->source_surface_mode[k] == dcn_bw_sw_4_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d_x)) {
181 			v->read_bandwidth[k] = v->read_bandwidth[k] * (1 + 1 / 64);
182 		}
183 		else if (v->pte_enable == dcn_bw_yes && v->source_scan[k] == dcn_bw_hor && (v->source_pixel_format[k] == dcn_bw_rgb_sub_64 || v->source_pixel_format[k] == dcn_bw_rgb_sub_32) && (v->source_surface_mode[k] == dcn_bw_sw_64_kb_s || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_x)) {
184 			v->read_bandwidth[k] = v->read_bandwidth[k] * (1 + 1 / 256);
185 		}
186 		else if (v->pte_enable == dcn_bw_yes) {
187 			v->read_bandwidth[k] = v->read_bandwidth[k] * (1 + 1 / 512);
188 		}
189 		v->total_read_bandwidth_consumed_gbyte_per_second = v->total_read_bandwidth_consumed_gbyte_per_second + v->read_bandwidth[k] / 1000.0;
190 	}
191 	v->total_write_bandwidth_consumed_gbyte_per_second = 0.0;
192 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
193 		if (v->output[k] == dcn_bw_writeback && v->output_format[k] == dcn_bw_444) {
194 			v->write_bandwidth[k] = v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k]) * 4.0;
195 		}
196 		else if (v->output[k] == dcn_bw_writeback) {
197 			v->write_bandwidth[k] = v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k]) * 1.5;
198 		}
199 		else {
200 			v->write_bandwidth[k] = 0.0;
201 		}
202 		v->total_write_bandwidth_consumed_gbyte_per_second = v->total_write_bandwidth_consumed_gbyte_per_second + v->write_bandwidth[k] / 1000.0;
203 	}
204 	v->total_bandwidth_consumed_gbyte_per_second = v->total_read_bandwidth_consumed_gbyte_per_second + v->total_write_bandwidth_consumed_gbyte_per_second;
205 	v->dcc_enabled_in_any_plane = dcn_bw_no;
206 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
207 		if (v->dcc_enable[k] == dcn_bw_yes) {
208 			v->dcc_enabled_in_any_plane = dcn_bw_yes;
209 		}
210 	}
211 	for (i = 0; i <= number_of_states_plus_one; i++) {
212 		v->return_bw_todcn_per_state =dcn_bw_min2(v->return_bus_width * v->dcfclk_per_state[i], v->fabric_and_dram_bandwidth_per_state[i] * 1000.0 * v->percent_of_ideal_drambw_received_after_urg_latency / 100.0);
213 		v->return_bw_per_state[i] = v->return_bw_todcn_per_state;
214 		if (v->dcc_enabled_in_any_plane == dcn_bw_yes && v->return_bw_todcn_per_state > v->dcfclk_per_state[i] * v->return_bus_width / 4.0) {
215 			v->return_bw_per_state[i] =dcn_bw_min2(v->return_bw_per_state[i], v->return_bw_todcn_per_state * 4.0 * (1.0 - v->urgent_latency / ((v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 / (v->return_bw_todcn_per_state - v->dcfclk_per_state[i] * v->return_bus_width / 4.0) + v->urgent_latency)));
216 		}
217 		v->critical_point = 2.0 * v->return_bus_width * v->dcfclk_per_state[i] * v->urgent_latency / (v->return_bw_todcn_per_state * v->urgent_latency + (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0);
218 		if (v->dcc_enabled_in_any_plane == dcn_bw_yes && v->critical_point > 1.0 && v->critical_point < 4.0) {
219 			v->return_bw_per_state[i] =dcn_bw_min2(v->return_bw_per_state[i], dcn_bw_pow(4.0 * v->return_bw_todcn_per_state * (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 * v->return_bus_width * v->dcfclk_per_state[i] * v->urgent_latency / (v->return_bw_todcn_per_state * v->urgent_latency + (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0), 2));
220 		}
221 		v->return_bw_todcn_per_state =dcn_bw_min2(v->return_bus_width * v->dcfclk_per_state[i], v->fabric_and_dram_bandwidth_per_state[i] * 1000.0);
222 		if (v->dcc_enabled_in_any_plane == dcn_bw_yes && v->return_bw_todcn_per_state > v->dcfclk_per_state[i] * v->return_bus_width / 4.0) {
223 			v->return_bw_per_state[i] =dcn_bw_min2(v->return_bw_per_state[i], v->return_bw_todcn_per_state * 4.0 * (1.0 - v->urgent_latency / ((v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 / (v->return_bw_todcn_per_state - v->dcfclk_per_state[i] * v->return_bus_width / 4.0) + v->urgent_latency)));
224 		}
225 		v->critical_point = 2.0 * v->return_bus_width * v->dcfclk_per_state[i] * v->urgent_latency / (v->return_bw_todcn_per_state * v->urgent_latency + (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0);
226 		if (v->dcc_enabled_in_any_plane == dcn_bw_yes && v->critical_point > 1.0 && v->critical_point < 4.0) {
227 			v->return_bw_per_state[i] =dcn_bw_min2(v->return_bw_per_state[i], dcn_bw_pow(4.0 * v->return_bw_todcn_per_state * (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 * v->return_bus_width * v->dcfclk_per_state[i] * v->urgent_latency / (v->return_bw_todcn_per_state * v->urgent_latency + (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0), 2));
228 		}
229 	}
230 	for (i = 0; i <= number_of_states_plus_one; i++) {
231 		if ((v->total_read_bandwidth_consumed_gbyte_per_second * 1000.0 <= v->return_bw_per_state[i]) && (v->total_bandwidth_consumed_gbyte_per_second * 1000.0 <= v->fabric_and_dram_bandwidth_per_state[i] * 1000.0 * v->percent_of_ideal_drambw_received_after_urg_latency / 100.0)) {
232 			v->bandwidth_support[i] = dcn_bw_yes;
233 		}
234 		else {
235 			v->bandwidth_support[i] = dcn_bw_no;
236 		}
237 	}
238 	/*writeback latency support check*/
239 
240 	v->writeback_latency_support = dcn_bw_yes;
241 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
242 		if (v->output[k] == dcn_bw_writeback && v->output_format[k] == dcn_bw_444 && v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k]) * 4.0 > (v->writeback_luma_buffer_size + v->writeback_chroma_buffer_size) * 1024.0 / v->write_back_latency) {
243 			v->writeback_latency_support = dcn_bw_no;
244 		}
245 		else if (v->output[k] == dcn_bw_writeback && v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k]) >dcn_bw_min2(v->writeback_luma_buffer_size, 2.0 * v->writeback_chroma_buffer_size) * 1024.0 / v->write_back_latency) {
246 			v->writeback_latency_support = dcn_bw_no;
247 		}
248 	}
249 	/*re-ordering buffer support check*/
250 
251 	for (i = 0; i <= number_of_states_plus_one; i++) {
252 		v->urgent_round_trip_and_out_of_order_latency_per_state[i] = (v->round_trip_ping_latency_cycles + 32.0) / v->dcfclk_per_state[i] + v->urgent_out_of_order_return_per_channel * v->number_of_channels / v->return_bw_per_state[i];
253 		if ((v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 / v->return_bw_per_state[i] > v->urgent_round_trip_and_out_of_order_latency_per_state[i]) {
254 			v->rob_support[i] = dcn_bw_yes;
255 		}
256 		else {
257 			v->rob_support[i] = dcn_bw_no;
258 		}
259 	}
260 	/*display io support check*/
261 
262 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
263 		if (v->output[k] == dcn_bw_dp && v->dsc_capability == dcn_bw_yes) {
264 			if (v->output_format[k] == dcn_bw_420) {
265 				v->required_output_bw = v->pixel_clock[k] / 2.0;
266 			}
267 			else {
268 				v->required_output_bw = v->pixel_clock[k];
269 			}
270 		}
271 		else if (v->output_format[k] == dcn_bw_420) {
272 			v->required_output_bw = v->pixel_clock[k] * 3.0 / 2.0;
273 		}
274 		else {
275 			v->required_output_bw = v->pixel_clock[k] * 3.0;
276 		}
277 		if (v->output[k] == dcn_bw_hdmi) {
278 			v->required_phyclk[k] = v->required_output_bw;
279 			switch (v->output_deep_color[k]) {
280 			case dcn_bw_encoder_10bpc:
281 				v->required_phyclk[k] =  v->required_phyclk[k] * 5.0 / 4;
282 			break;
283 			case dcn_bw_encoder_12bpc:
284 				v->required_phyclk[k] =  v->required_phyclk[k] * 3.0 / 2;
285 				break;
286 			default:
287 				break;
288 			}
289 			v->required_phyclk[k] = v->required_phyclk[k] / 3.0;
290 		}
291 		else if (v->output[k] == dcn_bw_dp) {
292 			v->required_phyclk[k] = v->required_output_bw / 4.0;
293 		}
294 		else {
295 			v->required_phyclk[k] = 0.0;
296 		}
297 	}
298 	for (i = 0; i <= number_of_states_plus_one; i++) {
299 		v->dio_support[i] = dcn_bw_yes;
300 		for (k = 0; k <= v->number_of_active_planes - 1; k++) {
301 			if (v->required_phyclk[k] > v->phyclk_per_state[i] || (v->output[k] == dcn_bw_hdmi && v->required_phyclk[k] > 600.0)) {
302 				v->dio_support[i] = dcn_bw_no;
303 			}
304 		}
305 	}
306 	/*total available writeback support check*/
307 
308 	v->total_number_of_active_writeback = 0.0;
309 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
310 		if (v->output[k] == dcn_bw_writeback) {
311 			v->total_number_of_active_writeback = v->total_number_of_active_writeback + 1.0;
312 		}
313 	}
314 	if (v->total_number_of_active_writeback <= v->max_num_writeback) {
315 		v->total_available_writeback_support = dcn_bw_yes;
316 	}
317 	else {
318 		v->total_available_writeback_support = dcn_bw_no;
319 	}
320 	/*maximum dispclk/dppclk support check*/
321 
322 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
323 		if (v->h_ratio[k] > 1.0) {
324 			v->pscl_factor[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput * v->h_ratio[k] /dcn_bw_ceil2(v->htaps[k] / 6.0, 1.0));
325 		}
326 		else {
327 			v->pscl_factor[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput);
328 		}
329 		if (v->byte_per_pixel_in_detc[k] == 0.0) {
330 			v->pscl_factor_chroma[k] = 0.0;
331 			v->min_dppclk_using_single_dpp[k] = v->pixel_clock[k] *dcn_bw_max3(v->vtaps[k] / 6.0 *dcn_bw_min2(1.0, v->h_ratio[k]), v->h_ratio[k] * v->v_ratio[k] / v->pscl_factor[k], 1.0);
332 		}
333 		else {
334 			if (v->h_ratio[k] / 2.0 > 1.0) {
335 				v->pscl_factor_chroma[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput * v->h_ratio[k] / 2.0 /dcn_bw_ceil2(v->hta_pschroma[k] / 6.0, 1.0));
336 			}
337 			else {
338 				v->pscl_factor_chroma[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput);
339 			}
340 			v->min_dppclk_using_single_dpp[k] = v->pixel_clock[k] *dcn_bw_max5(v->vtaps[k] / 6.0 *dcn_bw_min2(1.0, v->h_ratio[k]), v->h_ratio[k] * v->v_ratio[k] / v->pscl_factor[k], v->vta_pschroma[k] / 6.0 *dcn_bw_min2(1.0, v->h_ratio[k] / 2.0), v->h_ratio[k] * v->v_ratio[k] / 4.0 / v->pscl_factor_chroma[k], 1.0);
341 		}
342 	}
343 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
344 		if ((v->source_pixel_format[k] == dcn_bw_rgb_sub_64 || v->source_pixel_format[k] == dcn_bw_rgb_sub_32 || v->source_pixel_format[k] == dcn_bw_rgb_sub_16)) {
345 			if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
346 				v->read256_block_height_y[k] = 1.0;
347 			}
348 			else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) {
349 				v->read256_block_height_y[k] = 4.0;
350 			}
351 			else {
352 				v->read256_block_height_y[k] = 8.0;
353 			}
354 			v->read256_block_width_y[k] = 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / v->read256_block_height_y[k];
355 			v->read256_block_height_c[k] = 0.0;
356 			v->read256_block_width_c[k] = 0.0;
357 		}
358 		else {
359 			if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
360 				v->read256_block_height_y[k] = 1.0;
361 				v->read256_block_height_c[k] = 1.0;
362 			}
363 			else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8) {
364 				v->read256_block_height_y[k] = 16.0;
365 				v->read256_block_height_c[k] = 8.0;
366 			}
367 			else {
368 				v->read256_block_height_y[k] = 8.0;
369 				v->read256_block_height_c[k] = 8.0;
370 			}
371 			v->read256_block_width_y[k] = 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / v->read256_block_height_y[k];
372 			v->read256_block_width_c[k] = 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / v->read256_block_height_c[k];
373 		}
374 		if (v->source_scan[k] == dcn_bw_hor) {
375 			v->max_swath_height_y[k] = v->read256_block_height_y[k];
376 			v->max_swath_height_c[k] = v->read256_block_height_c[k];
377 		}
378 		else {
379 			v->max_swath_height_y[k] = v->read256_block_width_y[k];
380 			v->max_swath_height_c[k] = v->read256_block_width_c[k];
381 		}
382 		if ((v->source_pixel_format[k] == dcn_bw_rgb_sub_64 || v->source_pixel_format[k] == dcn_bw_rgb_sub_32 || v->source_pixel_format[k] == dcn_bw_rgb_sub_16)) {
383 			if (v->source_surface_mode[k] == dcn_bw_sw_linear || (v->source_pixel_format[k] == dcn_bw_rgb_sub_64 && (v->source_surface_mode[k] == dcn_bw_sw_4_kb_s || v->source_surface_mode[k] == dcn_bw_sw_4_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_var_s || v->source_surface_mode[k] == dcn_bw_sw_var_s_x) && v->source_scan[k] == dcn_bw_hor)) {
384 				v->min_swath_height_y[k] = v->max_swath_height_y[k];
385 			}
386 			else {
387 				v->min_swath_height_y[k] = v->max_swath_height_y[k] / 2.0;
388 			}
389 			v->min_swath_height_c[k] = v->max_swath_height_c[k];
390 		}
391 		else {
392 			if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
393 				v->min_swath_height_y[k] = v->max_swath_height_y[k];
394 				v->min_swath_height_c[k] = v->max_swath_height_c[k];
395 			}
396 			else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8 && v->source_scan[k] == dcn_bw_hor) {
397 				v->min_swath_height_y[k] = v->max_swath_height_y[k] / 2.0;
398 				if (v->bug_forcing_luma_and_chroma_request_to_same_size_fixed == dcn_bw_yes) {
399 					v->min_swath_height_c[k] = v->max_swath_height_c[k];
400 				}
401 				else {
402 					v->min_swath_height_c[k] = v->max_swath_height_c[k] / 2.0;
403 				}
404 			}
405 			else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10 && v->source_scan[k] == dcn_bw_hor) {
406 				v->min_swath_height_c[k] = v->max_swath_height_c[k] / 2.0;
407 				if (v->bug_forcing_luma_and_chroma_request_to_same_size_fixed == dcn_bw_yes) {
408 					v->min_swath_height_y[k] = v->max_swath_height_y[k];
409 				}
410 				else {
411 					v->min_swath_height_y[k] = v->max_swath_height_y[k] / 2.0;
412 				}
413 			}
414 			else {
415 				v->min_swath_height_y[k] = v->max_swath_height_y[k];
416 				v->min_swath_height_c[k] = v->max_swath_height_c[k];
417 			}
418 		}
419 		if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
420 			v->maximum_swath_width = 8192.0;
421 		}
422 		else {
423 			v->maximum_swath_width = 5120.0;
424 		}
425 		v->number_of_dpp_required_for_det_size =dcn_bw_ceil2(v->swath_width_ysingle_dpp[k] /dcn_bw_min2(v->maximum_swath_width, v->det_buffer_size_in_kbyte * 1024.0 / 2.0 / (v->byte_per_pixel_in_dety[k] * v->min_swath_height_y[k] + v->byte_per_pixel_in_detc[k] / 2.0 * v->min_swath_height_c[k])), 1.0);
426 		if (v->byte_per_pixel_in_detc[k] == 0.0) {
427 			v->number_of_dpp_required_for_lb_size =dcn_bw_ceil2((v->vtaps[k] +dcn_bw_max2(dcn_bw_ceil2(v->v_ratio[k], 1.0) - 2, 0.0)) * v->swath_width_ysingle_dpp[k] /dcn_bw_max2(v->h_ratio[k], 1.0) * v->lb_bit_per_pixel[k] / v->line_buffer_size, 1.0);
428 		}
429 		else {
430 			v->number_of_dpp_required_for_lb_size =dcn_bw_max2(dcn_bw_ceil2((v->vtaps[k] +dcn_bw_max2(dcn_bw_ceil2(v->v_ratio[k], 1.0) - 2, 0.0)) * v->swath_width_ysingle_dpp[k] /dcn_bw_max2(v->h_ratio[k], 1.0) * v->lb_bit_per_pixel[k] / v->line_buffer_size, 1.0),dcn_bw_ceil2((v->vta_pschroma[k] +dcn_bw_max2(dcn_bw_ceil2(v->v_ratio[k] / 2.0, 1.0) - 2, 0.0)) * v->swath_width_ysingle_dpp[k] / 2.0 /dcn_bw_max2(v->h_ratio[k] / 2.0, 1.0) * v->lb_bit_per_pixel[k] / v->line_buffer_size, 1.0));
431 		}
432 		v->number_of_dpp_required_for_det_and_lb_size[k] =dcn_bw_max2(v->number_of_dpp_required_for_det_size, v->number_of_dpp_required_for_lb_size);
433 	}
434 	for (i = 0; i <= number_of_states_plus_one; i++) {
435 		for (j = 0; j <= 1; j++) {
436 			v->total_number_of_active_dpp[i][j] = 0.0;
437 			v->required_dispclk[i][j] = 0.0;
438 			v->dispclk_dppclk_support[i][j] = dcn_bw_yes;
439 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
440 				v->min_dispclk_using_single_dpp =dcn_bw_max2(v->pixel_clock[k], v->min_dppclk_using_single_dpp[k] * (j + 1)) * (1.0 + v->downspreading / 100.0);
441 				if (v->odm_capability == dcn_bw_yes) {
442 					v->min_dispclk_using_dual_dpp =dcn_bw_max2(v->pixel_clock[k] / 2.0, v->min_dppclk_using_single_dpp[k] / 2.0 * (j + 1)) * (1.0 + v->downspreading / 100.0);
443 				}
444 				else {
445 					v->min_dispclk_using_dual_dpp =dcn_bw_max2(v->pixel_clock[k], v->min_dppclk_using_single_dpp[k] / 2.0 * (j + 1)) * (1.0 + v->downspreading / 100.0);
446 				}
447 				if (i < number_of_states) {
448 					v->min_dispclk_using_single_dpp = v->min_dispclk_using_single_dpp * (1.0 + v->dispclk_ramping_margin / 100.0);
449 					v->min_dispclk_using_dual_dpp = v->min_dispclk_using_dual_dpp * (1.0 + v->dispclk_ramping_margin / 100.0);
450 				}
451 				if (v->min_dispclk_using_single_dpp <=dcn_bw_min2(v->max_dispclk[i], (j + 1) * v->max_dppclk[i]) && v->number_of_dpp_required_for_det_and_lb_size[k] <= 1.0) {
452 					v->no_of_dpp[i][j][k] = 1.0;
453 					v->required_dispclk[i][j] =dcn_bw_max2(v->required_dispclk[i][j], v->min_dispclk_using_single_dpp);
454 				}
455 				else if (v->min_dispclk_using_dual_dpp <=dcn_bw_min2(v->max_dispclk[i], (j + 1) * v->max_dppclk[i])) {
456 					v->no_of_dpp[i][j][k] = 2.0;
457 					v->required_dispclk[i][j] =dcn_bw_max2(v->required_dispclk[i][j], v->min_dispclk_using_dual_dpp);
458 				}
459 				else {
460 					v->no_of_dpp[i][j][k] = 2.0;
461 					v->required_dispclk[i][j] =dcn_bw_max2(v->required_dispclk[i][j], v->min_dispclk_using_dual_dpp);
462 					v->dispclk_dppclk_support[i][j] = dcn_bw_no;
463 				}
464 				v->total_number_of_active_dpp[i][j] = v->total_number_of_active_dpp[i][j] + v->no_of_dpp[i][j][k];
465 			}
466 			if (v->total_number_of_active_dpp[i][j] > v->max_num_dpp) {
467 				v->total_number_of_active_dpp[i][j] = 0.0;
468 				v->required_dispclk[i][j] = 0.0;
469 				v->dispclk_dppclk_support[i][j] = dcn_bw_yes;
470 				for (k = 0; k <= v->number_of_active_planes - 1; k++) {
471 					v->min_dispclk_using_single_dpp =dcn_bw_max2(v->pixel_clock[k], v->min_dppclk_using_single_dpp[k] * (j + 1)) * (1.0 + v->downspreading / 100.0);
472 					v->min_dispclk_using_dual_dpp =dcn_bw_max2(v->pixel_clock[k], v->min_dppclk_using_single_dpp[k] / 2.0 * (j + 1)) * (1.0 + v->downspreading / 100.0);
473 					if (i < number_of_states) {
474 						v->min_dispclk_using_single_dpp = v->min_dispclk_using_single_dpp * (1.0 + v->dispclk_ramping_margin / 100.0);
475 						v->min_dispclk_using_dual_dpp = v->min_dispclk_using_dual_dpp * (1.0 + v->dispclk_ramping_margin / 100.0);
476 					}
477 					if (v->number_of_dpp_required_for_det_and_lb_size[k] <= 1.0) {
478 						v->no_of_dpp[i][j][k] = 1.0;
479 						v->required_dispclk[i][j] =dcn_bw_max2(v->required_dispclk[i][j], v->min_dispclk_using_single_dpp);
480 						if (v->min_dispclk_using_single_dpp >dcn_bw_min2(v->max_dispclk[i], (j + 1) * v->max_dppclk[i])) {
481 							v->dispclk_dppclk_support[i][j] = dcn_bw_no;
482 						}
483 					}
484 					else {
485 						v->no_of_dpp[i][j][k] = 2.0;
486 						v->required_dispclk[i][j] =dcn_bw_max2(v->required_dispclk[i][j], v->min_dispclk_using_dual_dpp);
487 						if (v->min_dispclk_using_dual_dpp >dcn_bw_min2(v->max_dispclk[i], (j + 1) * v->max_dppclk[i])) {
488 							v->dispclk_dppclk_support[i][j] = dcn_bw_no;
489 						}
490 					}
491 					v->total_number_of_active_dpp[i][j] = v->total_number_of_active_dpp[i][j] + v->no_of_dpp[i][j][k];
492 				}
493 			}
494 		}
495 	}
496 	/*viewport size check*/
497 
498 	v->viewport_size_support = dcn_bw_yes;
499 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
500 		if (v->number_of_dpp_required_for_det_and_lb_size[k] > 2.0) {
501 			v->viewport_size_support = dcn_bw_no;
502 		}
503 	}
504 	/*total available pipes support check*/
505 
506 	for (i = 0; i <= number_of_states_plus_one; i++) {
507 		for (j = 0; j <= 1; j++) {
508 			if (v->total_number_of_active_dpp[i][j] <= v->max_num_dpp) {
509 				v->total_available_pipes_support[i][j] = dcn_bw_yes;
510 			}
511 			else {
512 				v->total_available_pipes_support[i][j] = dcn_bw_no;
513 			}
514 		}
515 	}
516 	/*urgent latency support check*/
517 
518 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
519 		for (i = 0; i <= number_of_states_plus_one; i++) {
520 			for (j = 0; j <= 1; j++) {
521 				v->swath_width_yper_state[i][j][k] = v->swath_width_ysingle_dpp[k] / v->no_of_dpp[i][j][k];
522 				v->swath_width_granularity_y = 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / v->max_swath_height_y[k];
523 				v->rounded_up_max_swath_size_bytes_y = (dcn_bw_ceil2(v->swath_width_yper_state[i][j][k] - 1.0, v->swath_width_granularity_y) + v->swath_width_granularity_y) * v->byte_per_pixel_in_dety[k] * v->max_swath_height_y[k];
524 				if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10) {
525 					v->rounded_up_max_swath_size_bytes_y =dcn_bw_ceil2(v->rounded_up_max_swath_size_bytes_y, 256.0) + 256;
526 				}
527 				if (v->max_swath_height_c[k] > 0.0) {
528 					v->swath_width_granularity_c = 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / v->max_swath_height_c[k];
529 				}
530 				v->rounded_up_max_swath_size_bytes_c = (dcn_bw_ceil2(v->swath_width_yper_state[i][j][k] / 2.0 - 1.0, v->swath_width_granularity_c) + v->swath_width_granularity_c) * v->byte_per_pixel_in_detc[k] * v->max_swath_height_c[k];
531 				if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10) {
532 					v->rounded_up_max_swath_size_bytes_c =dcn_bw_ceil2(v->rounded_up_max_swath_size_bytes_c, 256.0) + 256;
533 				}
534 				if (v->rounded_up_max_swath_size_bytes_y + v->rounded_up_max_swath_size_bytes_c <= v->det_buffer_size_in_kbyte * 1024.0 / 2.0) {
535 					v->swath_height_yper_state[i][j][k] = v->max_swath_height_y[k];
536 					v->swath_height_cper_state[i][j][k] = v->max_swath_height_c[k];
537 				}
538 				else {
539 					v->swath_height_yper_state[i][j][k] = v->min_swath_height_y[k];
540 					v->swath_height_cper_state[i][j][k] = v->min_swath_height_c[k];
541 				}
542 				if (v->byte_per_pixel_in_detc[k] == 0.0) {
543 					v->lines_in_det_luma = v->det_buffer_size_in_kbyte * 1024.0 / v->byte_per_pixel_in_dety[k] / v->swath_width_yper_state[i][j][k];
544 					v->lines_in_det_chroma = 0.0;
545 				}
546 				else if (v->swath_height_yper_state[i][j][k] <= v->swath_height_cper_state[i][j][k]) {
547 					v->lines_in_det_luma = v->det_buffer_size_in_kbyte * 1024.0 / 2.0 / v->byte_per_pixel_in_dety[k] / v->swath_width_yper_state[i][j][k];
548 					v->lines_in_det_chroma = v->det_buffer_size_in_kbyte * 1024.0 / 2.0 / v->byte_per_pixel_in_detc[k] / (v->swath_width_yper_state[i][j][k] / 2.0);
549 				}
550 				else {
551 					v->lines_in_det_luma = v->det_buffer_size_in_kbyte * 1024.0 * 2.0 / 3.0 / v->byte_per_pixel_in_dety[k] / v->swath_width_yper_state[i][j][k];
552 					v->lines_in_det_chroma = v->det_buffer_size_in_kbyte * 1024.0 / 3.0 / v->byte_per_pixel_in_dety[k] / (v->swath_width_yper_state[i][j][k] / 2.0);
553 				}
554 				v->effective_lb_latency_hiding_source_lines_luma =dcn_bw_min2(v->max_line_buffer_lines,dcn_bw_floor2(v->line_buffer_size / v->lb_bit_per_pixel[k] / (v->swath_width_yper_state[i][j][k] /dcn_bw_max2(v->h_ratio[k], 1.0)), 1.0)) - (v->vtaps[k] - 1.0);
555 				v->effective_lb_latency_hiding_source_lines_chroma =dcn_bw_min2(v->max_line_buffer_lines,dcn_bw_floor2(v->line_buffer_size / v->lb_bit_per_pixel[k] / (v->swath_width_yper_state[i][j][k] / 2.0 /dcn_bw_max2(v->h_ratio[k] / 2.0, 1.0)), 1.0)) - (v->vta_pschroma[k] - 1.0);
556 				v->effective_detlb_lines_luma =dcn_bw_floor2(v->lines_in_det_luma +dcn_bw_min2(v->lines_in_det_luma * v->required_dispclk[i][j] * v->byte_per_pixel_in_dety[k] * v->pscl_factor[k] / v->return_bw_per_state[i], v->effective_lb_latency_hiding_source_lines_luma), v->swath_height_yper_state[i][j][k]);
557 				v->effective_detlb_lines_chroma =dcn_bw_floor2(v->lines_in_det_chroma +dcn_bw_min2(v->lines_in_det_chroma * v->required_dispclk[i][j] * v->byte_per_pixel_in_detc[k] * v->pscl_factor_chroma[k] / v->return_bw_per_state[i], v->effective_lb_latency_hiding_source_lines_chroma), v->swath_height_cper_state[i][j][k]);
558 				if (v->byte_per_pixel_in_detc[k] == 0.0) {
559 					v->urgent_latency_support_us_per_state[i][j][k] = v->effective_detlb_lines_luma * (v->htotal[k] / v->pixel_clock[k]) / v->v_ratio[k] - v->effective_detlb_lines_luma * v->swath_width_yper_state[i][j][k] *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / (v->return_bw_per_state[i] / v->no_of_dpp[i][j][k]);
560 				}
561 				else {
562 					v->urgent_latency_support_us_per_state[i][j][k] =dcn_bw_min2(v->effective_detlb_lines_luma * (v->htotal[k] / v->pixel_clock[k]) / v->v_ratio[k] - v->effective_detlb_lines_luma * v->swath_width_yper_state[i][j][k] *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / (v->return_bw_per_state[i] / v->no_of_dpp[i][j][k]), v->effective_detlb_lines_chroma * (v->htotal[k] / v->pixel_clock[k]) / (v->v_ratio[k] / 2.0) - v->effective_detlb_lines_chroma * v->swath_width_yper_state[i][j][k] / 2.0 *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / (v->return_bw_per_state[i] / v->no_of_dpp[i][j][k]));
563 				}
564 			}
565 		}
566 	}
567 	for (i = 0; i <= number_of_states_plus_one; i++) {
568 		for (j = 0; j <= 1; j++) {
569 			v->urgent_latency_support[i][j] = dcn_bw_yes;
570 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
571 				if (v->urgent_latency_support_us_per_state[i][j][k] < v->urgent_latency / 1.0) {
572 					v->urgent_latency_support[i][j] = dcn_bw_no;
573 				}
574 			}
575 		}
576 	}
577 	/*prefetch check*/
578 
579 	for (i = 0; i <= number_of_states_plus_one; i++) {
580 		for (j = 0; j <= 1; j++) {
581 			v->total_number_of_dcc_active_dpp[i][j] = 0.0;
582 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
583 				if (v->dcc_enable[k] == dcn_bw_yes) {
584 					v->total_number_of_dcc_active_dpp[i][j] = v->total_number_of_dcc_active_dpp[i][j] + v->no_of_dpp[i][j][k];
585 				}
586 			}
587 		}
588 	}
589 	for (i = 0; i <= number_of_states_plus_one; i++) {
590 		for (j = 0; j <= 1; j++) {
591 			v->projected_dcfclk_deep_sleep = 8.0;
592 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
593 				v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, v->pixel_clock[k] / 16.0);
594 				if (v->byte_per_pixel_in_detc[k] == 0.0) {
595 					if (v->v_ratio[k] <= 1.0) {
596 						v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, 1.1 *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 64.0 * v->h_ratio[k] * v->pixel_clock[k] / v->no_of_dpp[i][j][k]);
597 					}
598 					else {
599 						v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, 1.1 *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 64.0 * v->pscl_factor[k] * v->required_dispclk[i][j] / (1 + j));
600 					}
601 				}
602 				else {
603 					if (v->v_ratio[k] <= 1.0) {
604 						v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, 1.1 *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 32.0 * v->h_ratio[k] * v->pixel_clock[k] / v->no_of_dpp[i][j][k]);
605 					}
606 					else {
607 						v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, 1.1 *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 32.0 * v->pscl_factor[k] * v->required_dispclk[i][j] / (1 + j));
608 					}
609 					if (v->v_ratio[k] / 2.0 <= 1.0) {
610 						v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, 1.1 *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 32.0 * v->h_ratio[k] / 2.0 * v->pixel_clock[k] / v->no_of_dpp[i][j][k]);
611 					}
612 					else {
613 						v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, 1.1 *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 32.0 * v->pscl_factor_chroma[k] * v->required_dispclk[i][j] / (1 + j));
614 					}
615 				}
616 			}
617 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
618 				if (v->dcc_enable[k] == dcn_bw_yes) {
619 					v->meta_req_height_y = 8.0 * v->read256_block_height_y[k];
620 					v->meta_req_width_y = 64.0 * 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / v->meta_req_height_y;
621 					v->meta_surface_width_y =dcn_bw_ceil2(v->viewport_width[k] / v->no_of_dpp[i][j][k] - 1.0, v->meta_req_width_y) + v->meta_req_width_y;
622 					v->meta_surface_height_y =dcn_bw_ceil2(v->viewport_height[k] - 1.0, v->meta_req_height_y) + v->meta_req_height_y;
623 					if (v->pte_enable == dcn_bw_yes) {
624 						v->meta_pte_bytes_per_frame_y = (dcn_bw_ceil2((v->meta_surface_width_y * v->meta_surface_height_y *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 256.0 - 4096.0) / 8.0 / 4096.0, 1.0) + 1) * 64.0;
625 					}
626 					else {
627 						v->meta_pte_bytes_per_frame_y = 0.0;
628 					}
629 					if (v->source_scan[k] == dcn_bw_hor) {
630 						v->meta_row_bytes_y = v->meta_surface_width_y * v->meta_req_height_y *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 256.0;
631 					}
632 					else {
633 						v->meta_row_bytes_y = v->meta_surface_height_y * v->meta_req_width_y *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 256.0;
634 					}
635 				}
636 				else {
637 					v->meta_pte_bytes_per_frame_y = 0.0;
638 					v->meta_row_bytes_y = 0.0;
639 				}
640 				if (v->pte_enable == dcn_bw_yes) {
641 					if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
642 						v->macro_tile_block_size_bytes_y = 256.0;
643 						v->macro_tile_block_height_y = 1.0;
644 					}
645 					else if (v->source_surface_mode[k] == dcn_bw_sw_4_kb_s || v->source_surface_mode[k] == dcn_bw_sw_4_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d_x) {
646 						v->macro_tile_block_size_bytes_y = 4096.0;
647 						v->macro_tile_block_height_y = 4.0 * v->read256_block_height_y[k];
648 					}
649 					else if (v->source_surface_mode[k] == dcn_bw_sw_64_kb_s || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_x) {
650 						v->macro_tile_block_size_bytes_y = 64.0 * 1024;
651 						v->macro_tile_block_height_y = 16.0 * v->read256_block_height_y[k];
652 					}
653 					else {
654 						v->macro_tile_block_size_bytes_y = 256.0 * 1024;
655 						v->macro_tile_block_height_y = 32.0 * v->read256_block_height_y[k];
656 					}
657 					if (v->macro_tile_block_size_bytes_y <= 65536.0) {
658 						v->data_pte_req_height_y = v->macro_tile_block_height_y;
659 					}
660 					else {
661 						v->data_pte_req_height_y = 16.0 * v->read256_block_height_y[k];
662 					}
663 					v->data_pte_req_width_y = 4096.0 /dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / v->data_pte_req_height_y * 8;
664 					if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
665 						v->dpte_bytes_per_row_y = 64.0 * (dcn_bw_ceil2((v->viewport_width[k] / v->no_of_dpp[i][j][k] *dcn_bw_min2(128.0, dcn_bw_pow(2.0,dcn_bw_floor2(dcn_bw_log(v->pte_buffer_size_in_requests * v->data_pte_req_width_y / (v->viewport_width[k] / v->no_of_dpp[i][j][k]), 2.0), 1.0))) - 1.0) / v->data_pte_req_width_y, 1.0) + 1);
666 					}
667 					else if (v->source_scan[k] == dcn_bw_hor) {
668 						v->dpte_bytes_per_row_y = 64.0 * (dcn_bw_ceil2((v->viewport_width[k] / v->no_of_dpp[i][j][k] - 1.0) / v->data_pte_req_width_y, 1.0) + 1);
669 					}
670 					else {
671 						v->dpte_bytes_per_row_y = 64.0 * (dcn_bw_ceil2((v->viewport_height[k] - 1.0) / v->data_pte_req_height_y, 1.0) + 1);
672 					}
673 				}
674 				else {
675 					v->dpte_bytes_per_row_y = 0.0;
676 				}
677 				if ((v->source_pixel_format[k] != dcn_bw_rgb_sub_64 && v->source_pixel_format[k] != dcn_bw_rgb_sub_32 && v->source_pixel_format[k] != dcn_bw_rgb_sub_16)) {
678 					if (v->dcc_enable[k] == dcn_bw_yes) {
679 						v->meta_req_height_c = 8.0 * v->read256_block_height_c[k];
680 						v->meta_req_width_c = 64.0 * 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / v->meta_req_height_c;
681 						v->meta_surface_width_c =dcn_bw_ceil2(v->viewport_width[k] / v->no_of_dpp[i][j][k] / 2.0 - 1.0, v->meta_req_width_c) + v->meta_req_width_c;
682 						v->meta_surface_height_c =dcn_bw_ceil2(v->viewport_height[k] / 2.0 - 1.0, v->meta_req_height_c) + v->meta_req_height_c;
683 						if (v->pte_enable == dcn_bw_yes) {
684 							v->meta_pte_bytes_per_frame_c = (dcn_bw_ceil2((v->meta_surface_width_c * v->meta_surface_height_c *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 256.0 - 4096.0) / 8.0 / 4096.0, 1.0) + 1) * 64.0;
685 						}
686 						else {
687 							v->meta_pte_bytes_per_frame_c = 0.0;
688 						}
689 						if (v->source_scan[k] == dcn_bw_hor) {
690 							v->meta_row_bytes_c = v->meta_surface_width_c * v->meta_req_height_c *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 256.0;
691 						}
692 						else {
693 							v->meta_row_bytes_c = v->meta_surface_height_c * v->meta_req_width_c *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 256.0;
694 						}
695 					}
696 					else {
697 						v->meta_pte_bytes_per_frame_c = 0.0;
698 						v->meta_row_bytes_c = 0.0;
699 					}
700 					if (v->pte_enable == dcn_bw_yes) {
701 						if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
702 							v->macro_tile_block_size_bytes_c = 256.0;
703 							v->macro_tile_block_height_c = 1.0;
704 						}
705 						else if (v->source_surface_mode[k] == dcn_bw_sw_4_kb_s || v->source_surface_mode[k] == dcn_bw_sw_4_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d_x) {
706 							v->macro_tile_block_size_bytes_c = 4096.0;
707 							v->macro_tile_block_height_c = 4.0 * v->read256_block_height_c[k];
708 						}
709 						else if (v->source_surface_mode[k] == dcn_bw_sw_64_kb_s || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_x) {
710 							v->macro_tile_block_size_bytes_c = 64.0 * 1024;
711 							v->macro_tile_block_height_c = 16.0 * v->read256_block_height_c[k];
712 						}
713 						else {
714 							v->macro_tile_block_size_bytes_c = 256.0 * 1024;
715 							v->macro_tile_block_height_c = 32.0 * v->read256_block_height_c[k];
716 						}
717 						v->macro_tile_block_width_c = v->macro_tile_block_size_bytes_c /dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / v->macro_tile_block_height_c;
718 						if (v->macro_tile_block_size_bytes_c <= 65536.0) {
719 							v->data_pte_req_height_c = v->macro_tile_block_height_c;
720 						}
721 						else {
722 							v->data_pte_req_height_c = 16.0 * v->read256_block_height_c[k];
723 						}
724 						v->data_pte_req_width_c = 4096.0 /dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / v->data_pte_req_height_c * 8;
725 						if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
726 							v->dpte_bytes_per_row_c = 64.0 * (dcn_bw_ceil2((v->viewport_width[k] / v->no_of_dpp[i][j][k] / 2.0 * dcn_bw_min2(128.0, dcn_bw_pow(2.0,dcn_bw_floor2(dcn_bw_log(v->pte_buffer_size_in_requests * v->data_pte_req_width_c / (v->viewport_width[k] / v->no_of_dpp[i][j][k] / 2.0), 2.0), 1.0))) - 1.0) / v->data_pte_req_width_c, 1.0) + 1);
727 						}
728 						else if (v->source_scan[k] == dcn_bw_hor) {
729 							v->dpte_bytes_per_row_c = 64.0 * (dcn_bw_ceil2((v->viewport_width[k] / v->no_of_dpp[i][j][k] / 2.0 - 1.0) / v->data_pte_req_width_c, 1.0) + 1);
730 						}
731 						else {
732 							v->dpte_bytes_per_row_c = 64.0 * (dcn_bw_ceil2((v->viewport_height[k] / 2.0 - 1.0) / v->data_pte_req_height_c, 1.0) + 1);
733 						}
734 					}
735 					else {
736 						v->dpte_bytes_per_row_c = 0.0;
737 					}
738 				}
739 				else {
740 					v->dpte_bytes_per_row_c = 0.0;
741 					v->meta_pte_bytes_per_frame_c = 0.0;
742 					v->meta_row_bytes_c = 0.0;
743 				}
744 				v->dpte_bytes_per_row[k] = v->dpte_bytes_per_row_y + v->dpte_bytes_per_row_c;
745 				v->meta_pte_bytes_per_frame[k] = v->meta_pte_bytes_per_frame_y + v->meta_pte_bytes_per_frame_c;
746 				v->meta_row_bytes[k] = v->meta_row_bytes_y + v->meta_row_bytes_c;
747 				v->v_init_y = (v->v_ratio[k] + v->vtaps[k] + 1.0 + v->interlace_output[k] * 0.5 * v->v_ratio[k]) / 2.0;
748 				v->prefill_y[k] =dcn_bw_floor2(v->v_init_y, 1.0);
749 				v->max_num_sw_y[k] =dcn_bw_ceil2((v->prefill_y[k] - 1.0) / v->swath_height_yper_state[i][j][k], 1.0) + 1;
750 				if (v->prefill_y[k] > 1.0) {
751 					v->max_partial_sw_y =dcn_bw_mod((v->prefill_y[k] - 2.0), v->swath_height_yper_state[i][j][k]);
752 				}
753 				else {
754 					v->max_partial_sw_y =dcn_bw_mod((v->prefill_y[k] + v->swath_height_yper_state[i][j][k] - 2.0), v->swath_height_yper_state[i][j][k]);
755 				}
756 				v->max_partial_sw_y =dcn_bw_max2(1.0, v->max_partial_sw_y);
757 				v->prefetch_lines_y[k] = v->max_num_sw_y[k] * v->swath_height_yper_state[i][j][k] + v->max_partial_sw_y;
758 				if ((v->source_pixel_format[k] != dcn_bw_rgb_sub_64 && v->source_pixel_format[k] != dcn_bw_rgb_sub_32 && v->source_pixel_format[k] != dcn_bw_rgb_sub_16)) {
759 					v->v_init_c = (v->v_ratio[k] / 2.0 + v->vtaps[k] + 1.0 + v->interlace_output[k] * 0.5 * v->v_ratio[k] / 2.0) / 2.0;
760 					v->prefill_c[k] =dcn_bw_floor2(v->v_init_c, 1.0);
761 					v->max_num_sw_c[k] =dcn_bw_ceil2((v->prefill_c[k] - 1.0) / v->swath_height_cper_state[i][j][k], 1.0) + 1;
762 					if (v->prefill_c[k] > 1.0) {
763 						v->max_partial_sw_c =dcn_bw_mod((v->prefill_c[k] - 2.0), v->swath_height_cper_state[i][j][k]);
764 					}
765 					else {
766 						v->max_partial_sw_c =dcn_bw_mod((v->prefill_c[k] + v->swath_height_cper_state[i][j][k] - 2.0), v->swath_height_cper_state[i][j][k]);
767 					}
768 					v->max_partial_sw_c =dcn_bw_max2(1.0, v->max_partial_sw_c);
769 					v->prefetch_lines_c[k] = v->max_num_sw_c[k] * v->swath_height_cper_state[i][j][k] + v->max_partial_sw_c;
770 				}
771 				else {
772 					v->prefetch_lines_c[k] = 0.0;
773 				}
774 				v->dst_x_after_scaler = 90.0 * v->pixel_clock[k] / (v->required_dispclk[i][j] / (j + 1)) + 42.0 * v->pixel_clock[k] / v->required_dispclk[i][j];
775 				if (v->no_of_dpp[i][j][k] > 1.0) {
776 					v->dst_x_after_scaler = v->dst_x_after_scaler + v->scaler_rec_out_width[k] / 2.0;
777 				}
778 				if (v->output_format[k] == dcn_bw_420) {
779 					v->dst_y_after_scaler = 1.0;
780 				}
781 				else {
782 					v->dst_y_after_scaler = 0.0;
783 				}
784 				v->time_calc = 24.0 / v->projected_dcfclk_deep_sleep;
785 				v->v_update_offset[k][j] = dcn_bw_ceil2(v->htotal[k] / 4.0, 1.0);
786 				v->total_repeater_delay = v->max_inter_dcn_tile_repeaters * (2.0 / (v->required_dispclk[i][j] / (j + 1)) + 3.0 / v->required_dispclk[i][j]);
787 				v->v_update_width[k][j] = (14.0 / v->projected_dcfclk_deep_sleep + 12.0 / (v->required_dispclk[i][j] / (j + 1)) + v->total_repeater_delay) * v->pixel_clock[k];
788 				v->v_ready_offset[k][j] = dcn_bw_max2(150.0 / (v->required_dispclk[i][j] / (j + 1)), v->total_repeater_delay + 20.0 / v->projected_dcfclk_deep_sleep + 10.0 / (v->required_dispclk[i][j] / (j + 1))) * v->pixel_clock[k];
789 				v->time_setup = (v->v_update_offset[k][j] + v->v_update_width[k][j] + v->v_ready_offset[k][j]) / v->pixel_clock[k];
790 				v->extra_latency = v->urgent_round_trip_and_out_of_order_latency_per_state[i] + (v->total_number_of_active_dpp[i][j] * v->pixel_chunk_size_in_kbyte + v->total_number_of_dcc_active_dpp[i][j] * v->meta_chunk_size) * 1024.0 / v->return_bw_per_state[i];
791 				if (v->pte_enable == dcn_bw_yes) {
792 					v->extra_latency = v->extra_latency + v->total_number_of_active_dpp[i][j] * v->pte_chunk_size * 1024.0 / v->return_bw_per_state[i];
793 				}
794 				if (v->can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one == dcn_bw_yes) {
795 					v->maximum_vstartup = v->vtotal[k] - v->vactive[k] - 1.0;
796 				}
797 				else {
798 					v->maximum_vstartup = v->v_sync_plus_back_porch[k] - 1.0;
799 				}
800 				v->line_times_for_prefetch[k] = v->maximum_vstartup - v->urgent_latency / (v->htotal[k] / v->pixel_clock[k]) - (v->time_calc + v->time_setup) / (v->htotal[k] / v->pixel_clock[k]) - (v->dst_y_after_scaler + v->dst_x_after_scaler / v->htotal[k]);
801 				v->line_times_for_prefetch[k] =dcn_bw_floor2(4.0 * (v->line_times_for_prefetch[k] + 0.125), 1.0) / 4;
802 				v->prefetch_bw[k] = (v->meta_pte_bytes_per_frame[k] + 2.0 * v->meta_row_bytes[k] + 2.0 * v->dpte_bytes_per_row[k] + v->prefetch_lines_y[k] * v->swath_width_yper_state[i][j][k] *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) + v->prefetch_lines_c[k] * v->swath_width_yper_state[i][j][k] / 2.0 *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0)) / (v->line_times_for_prefetch[k] * v->htotal[k] / v->pixel_clock[k]);
803 			}
804 			v->bw_available_for_immediate_flip = v->return_bw_per_state[i];
805 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
806 				v->bw_available_for_immediate_flip = v->bw_available_for_immediate_flip -dcn_bw_max2(v->read_bandwidth[k], v->prefetch_bw[k]);
807 			}
808 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
809 				v->total_immediate_flip_bytes[k] = 0.0;
810 				if ((v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
811 					v->total_immediate_flip_bytes[k] = v->total_immediate_flip_bytes[k] + v->meta_pte_bytes_per_frame[k] + v->meta_row_bytes[k] + v->dpte_bytes_per_row[k];
812 				}
813 			}
814 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
815 				if (v->pte_enable == dcn_bw_yes && v->dcc_enable[k] == dcn_bw_yes) {
816 					v->time_for_meta_pte_with_immediate_flip =dcn_bw_max5(v->meta_pte_bytes_per_frame[k] / v->prefetch_bw[k], v->meta_pte_bytes_per_frame[k] * v->total_immediate_flip_bytes[k] / (v->bw_available_for_immediate_flip * (v->meta_pte_bytes_per_frame[k] + v->meta_row_bytes[k] + v->dpte_bytes_per_row[k])), v->extra_latency, v->urgent_latency, v->htotal[k] / v->pixel_clock[k] / 4.0);
817 					v->time_for_meta_pte_without_immediate_flip =dcn_bw_max3(v->meta_pte_bytes_per_frame[k] / v->prefetch_bw[k], v->extra_latency, v->htotal[k] / v->pixel_clock[k] / 4.0);
818 				}
819 				else {
820 					v->time_for_meta_pte_with_immediate_flip = v->htotal[k] / v->pixel_clock[k] / 4.0;
821 					v->time_for_meta_pte_without_immediate_flip = v->htotal[k] / v->pixel_clock[k] / 4.0;
822 				}
823 				if (v->pte_enable == dcn_bw_yes || v->dcc_enable[k] == dcn_bw_yes) {
824 					v->time_for_meta_and_dpte_row_with_immediate_flip =dcn_bw_max5((v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) / v->prefetch_bw[k], (v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) * v->total_immediate_flip_bytes[k] / (v->bw_available_for_immediate_flip * (v->meta_pte_bytes_per_frame[k] + v->meta_row_bytes[k] + v->dpte_bytes_per_row[k])), v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_with_immediate_flip, v->extra_latency, 2.0 * v->urgent_latency);
825 					v->time_for_meta_and_dpte_row_without_immediate_flip =dcn_bw_max3((v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) / v->prefetch_bw[k], v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_without_immediate_flip, v->extra_latency);
826 				}
827 				else {
828 					v->time_for_meta_and_dpte_row_with_immediate_flip =dcn_bw_max2(v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_with_immediate_flip, v->extra_latency - v->time_for_meta_pte_with_immediate_flip);
829 					v->time_for_meta_and_dpte_row_without_immediate_flip =dcn_bw_max2(v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_without_immediate_flip, v->extra_latency - v->time_for_meta_pte_without_immediate_flip);
830 				}
831 				v->lines_for_meta_pte_with_immediate_flip[k] =dcn_bw_floor2(4.0 * (v->time_for_meta_pte_with_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
832 				v->lines_for_meta_pte_without_immediate_flip[k] =dcn_bw_floor2(4.0 * (v->time_for_meta_pte_without_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
833 				v->lines_for_meta_and_dpte_row_with_immediate_flip[k] =dcn_bw_floor2(4.0 * (v->time_for_meta_and_dpte_row_with_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
834 				v->lines_for_meta_and_dpte_row_without_immediate_flip[k] =dcn_bw_floor2(4.0 * (v->time_for_meta_and_dpte_row_without_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
835 				v->line_times_to_request_prefetch_pixel_data_with_immediate_flip = v->line_times_for_prefetch[k] - v->lines_for_meta_pte_with_immediate_flip[k] - v->lines_for_meta_and_dpte_row_with_immediate_flip[k];
836 				v->line_times_to_request_prefetch_pixel_data_without_immediate_flip = v->line_times_for_prefetch[k] - v->lines_for_meta_pte_without_immediate_flip[k] - v->lines_for_meta_and_dpte_row_without_immediate_flip[k];
837 				if (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip > 0.0) {
838 					v->v_ratio_pre_ywith_immediate_flip[i][j][k] = v->prefetch_lines_y[k] / v->line_times_to_request_prefetch_pixel_data_with_immediate_flip;
839 					if ((v->swath_height_yper_state[i][j][k] > 4.0)) {
840 						if (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0 > 0.0) {
841 							v->v_ratio_pre_ywith_immediate_flip[i][j][k] =dcn_bw_max2(v->v_ratio_pre_ywith_immediate_flip[i][j][k], (v->max_num_sw_y[k] * v->swath_height_yper_state[i][j][k]) / (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0));
842 						}
843 						else {
844 							v->v_ratio_pre_ywith_immediate_flip[i][j][k] = 999999.0;
845 						}
846 					}
847 					v->v_ratio_pre_cwith_immediate_flip[i][j][k] = v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_with_immediate_flip;
848 					if ((v->swath_height_cper_state[i][j][k] > 4.0)) {
849 						if (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0 > 0.0) {
850 							v->v_ratio_pre_cwith_immediate_flip[i][j][k] =dcn_bw_max2(v->v_ratio_pre_cwith_immediate_flip[i][j][k], (v->max_num_sw_c[k] * v->swath_height_cper_state[i][j][k]) / (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0));
851 						}
852 						else {
853 							v->v_ratio_pre_cwith_immediate_flip[i][j][k] = 999999.0;
854 						}
855 					}
856 					v->required_prefetch_pixel_data_bw_with_immediate_flip[i][j][k] = v->no_of_dpp[i][j][k] * (v->prefetch_lines_y[k] / v->line_times_to_request_prefetch_pixel_data_with_immediate_flip *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) + v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_with_immediate_flip *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 2.0) * v->swath_width_yper_state[i][j][k] / (v->htotal[k] / v->pixel_clock[k]);
857 				}
858 				else {
859 					v->v_ratio_pre_ywith_immediate_flip[i][j][k] = 999999.0;
860 					v->v_ratio_pre_cwith_immediate_flip[i][j][k] = 999999.0;
861 					v->required_prefetch_pixel_data_bw_with_immediate_flip[i][j][k] = 999999.0;
862 				}
863 				if (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip > 0.0) {
864 					v->v_ratio_pre_ywithout_immediate_flip[i][j][k] = v->prefetch_lines_y[k] / v->line_times_to_request_prefetch_pixel_data_without_immediate_flip;
865 					if ((v->swath_height_yper_state[i][j][k] > 4.0)) {
866 						if (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0 > 0.0) {
867 							v->v_ratio_pre_ywithout_immediate_flip[i][j][k] =dcn_bw_max2(v->v_ratio_pre_ywithout_immediate_flip[i][j][k], (v->max_num_sw_y[k] * v->swath_height_yper_state[i][j][k]) / (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0));
868 						}
869 						else {
870 							v->v_ratio_pre_ywithout_immediate_flip[i][j][k] = 999999.0;
871 						}
872 					}
873 					v->v_ratio_pre_cwithout_immediate_flip[i][j][k] = v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_without_immediate_flip;
874 					if ((v->swath_height_cper_state[i][j][k] > 4.0)) {
875 						if (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0 > 0.0) {
876 							v->v_ratio_pre_cwithout_immediate_flip[i][j][k] =dcn_bw_max2(v->v_ratio_pre_cwithout_immediate_flip[i][j][k], (v->max_num_sw_c[k] * v->swath_height_cper_state[i][j][k]) / (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0));
877 						}
878 						else {
879 							v->v_ratio_pre_cwithout_immediate_flip[i][j][k] = 999999.0;
880 						}
881 					}
882 					v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k] = v->no_of_dpp[i][j][k] * (v->prefetch_lines_y[k] / v->line_times_to_request_prefetch_pixel_data_without_immediate_flip *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) + v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_without_immediate_flip *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 2.0) * v->swath_width_yper_state[i][j][k] / (v->htotal[k] / v->pixel_clock[k]);
883 				}
884 				else {
885 					v->v_ratio_pre_ywithout_immediate_flip[i][j][k] = 999999.0;
886 					v->v_ratio_pre_cwithout_immediate_flip[i][j][k] = 999999.0;
887 					v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k] = 999999.0;
888 				}
889 			}
890 			v->maximum_read_bandwidth_with_prefetch_with_immediate_flip = 0.0;
891 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
892 				if ((v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
893 					v->maximum_read_bandwidth_with_prefetch_with_immediate_flip = v->maximum_read_bandwidth_with_prefetch_with_immediate_flip +dcn_bw_max2(v->read_bandwidth[k], v->required_prefetch_pixel_data_bw_with_immediate_flip[i][j][k]) +dcn_bw_max2(v->meta_pte_bytes_per_frame[k] / (v->lines_for_meta_pte_with_immediate_flip[k] * v->htotal[k] / v->pixel_clock[k]), (v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) / (v->lines_for_meta_and_dpte_row_with_immediate_flip[k] * v->htotal[k] / v->pixel_clock[k]));
894 				}
895 				else {
896 					v->maximum_read_bandwidth_with_prefetch_with_immediate_flip = v->maximum_read_bandwidth_with_prefetch_with_immediate_flip +dcn_bw_max2(v->read_bandwidth[k], v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k]);
897 				}
898 			}
899 			v->maximum_read_bandwidth_with_prefetch_without_immediate_flip = 0.0;
900 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
901 				v->maximum_read_bandwidth_with_prefetch_without_immediate_flip = v->maximum_read_bandwidth_with_prefetch_without_immediate_flip +dcn_bw_max2(v->read_bandwidth[k], v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k]);
902 			}
903 			v->prefetch_supported_with_immediate_flip[i][j] = dcn_bw_yes;
904 			if (v->maximum_read_bandwidth_with_prefetch_with_immediate_flip > v->return_bw_per_state[i]) {
905 				v->prefetch_supported_with_immediate_flip[i][j] = dcn_bw_no;
906 			}
907 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
908 				if (v->line_times_for_prefetch[k] < 2.0 || v->lines_for_meta_pte_with_immediate_flip[k] >= 8.0 || v->lines_for_meta_and_dpte_row_with_immediate_flip[k] >= 16.0) {
909 					v->prefetch_supported_with_immediate_flip[i][j] = dcn_bw_no;
910 				}
911 			}
912 			v->prefetch_supported_without_immediate_flip[i][j] = dcn_bw_yes;
913 			if (v->maximum_read_bandwidth_with_prefetch_without_immediate_flip > v->return_bw_per_state[i]) {
914 				v->prefetch_supported_without_immediate_flip[i][j] = dcn_bw_no;
915 			}
916 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
917 				if (v->line_times_for_prefetch[k] < 2.0 || v->lines_for_meta_pte_without_immediate_flip[k] >= 8.0 || v->lines_for_meta_and_dpte_row_without_immediate_flip[k] >= 16.0) {
918 					v->prefetch_supported_without_immediate_flip[i][j] = dcn_bw_no;
919 				}
920 			}
921 		}
922 	}
923 	for (i = 0; i <= number_of_states_plus_one; i++) {
924 		for (j = 0; j <= 1; j++) {
925 			v->v_ratio_in_prefetch_supported_with_immediate_flip[i][j] = dcn_bw_yes;
926 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
927 				if ((((v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10) && (v->v_ratio_pre_ywith_immediate_flip[i][j][k] > 4.0 || v->v_ratio_pre_cwith_immediate_flip[i][j][k] > 4.0)) || ((v->source_pixel_format[k] == dcn_bw_yuv420_sub_8 || v->source_pixel_format[k] == dcn_bw_yuv420_sub_10) && (v->v_ratio_pre_ywithout_immediate_flip[i][j][k] > 4.0 || v->v_ratio_pre_cwithout_immediate_flip[i][j][k] > 4.0)))) {
928 					v->v_ratio_in_prefetch_supported_with_immediate_flip[i][j] = dcn_bw_no;
929 				}
930 			}
931 			v->v_ratio_in_prefetch_supported_without_immediate_flip[i][j] = dcn_bw_yes;
932 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
933 				if ((v->v_ratio_pre_ywithout_immediate_flip[i][j][k] > 4.0 || v->v_ratio_pre_cwithout_immediate_flip[i][j][k] > 4.0)) {
934 					v->v_ratio_in_prefetch_supported_without_immediate_flip[i][j] = dcn_bw_no;
935 				}
936 			}
937 		}
938 	}
939 	/*mode support, voltage state and soc configuration*/
940 
941 	for (i = number_of_states_plus_one; i >= 0; i--) {
942 		for (j = 0; j <= 1; j++) {
943 			if (v->scale_ratio_support == dcn_bw_yes && v->source_format_pixel_and_scan_support == dcn_bw_yes && v->viewport_size_support == dcn_bw_yes && v->bandwidth_support[i] == dcn_bw_yes && v->dio_support[i] == dcn_bw_yes && v->urgent_latency_support[i][j] == dcn_bw_yes && v->rob_support[i] == dcn_bw_yes && v->dispclk_dppclk_support[i][j] == dcn_bw_yes && v->total_available_pipes_support[i][j] == dcn_bw_yes && v->total_available_writeback_support == dcn_bw_yes && v->writeback_latency_support == dcn_bw_yes) {
944 				if (v->prefetch_supported_with_immediate_flip[i][j] == dcn_bw_yes && v->v_ratio_in_prefetch_supported_with_immediate_flip[i][j] == dcn_bw_yes) {
945 					v->mode_support_with_immediate_flip[i][j] = dcn_bw_yes;
946 				}
947 				else {
948 					v->mode_support_with_immediate_flip[i][j] = dcn_bw_no;
949 				}
950 				if (v->prefetch_supported_without_immediate_flip[i][j] == dcn_bw_yes && v->v_ratio_in_prefetch_supported_without_immediate_flip[i][j] == dcn_bw_yes) {
951 					v->mode_support_without_immediate_flip[i][j] = dcn_bw_yes;
952 				}
953 				else {
954 					v->mode_support_without_immediate_flip[i][j] = dcn_bw_no;
955 				}
956 			}
957 			else {
958 				v->mode_support_with_immediate_flip[i][j] = dcn_bw_no;
959 				v->mode_support_without_immediate_flip[i][j] = dcn_bw_no;
960 			}
961 		}
962 	}
963 	for (i = number_of_states_plus_one; i >= 0; i--) {
964 		if ((i == number_of_states_plus_one || v->mode_support_with_immediate_flip[i][1] == dcn_bw_yes || v->mode_support_with_immediate_flip[i][0] == dcn_bw_yes) && i >= v->voltage_override_level) {
965 			v->voltage_level_with_immediate_flip = i;
966 		}
967 	}
968 	for (i = number_of_states_plus_one; i >= 0; i--) {
969 		if ((i == number_of_states_plus_one || v->mode_support_without_immediate_flip[i][1] == dcn_bw_yes || v->mode_support_without_immediate_flip[i][0] == dcn_bw_yes) && i >= v->voltage_override_level) {
970 			v->voltage_level_without_immediate_flip = i;
971 		}
972 	}
973 	if (v->voltage_level_with_immediate_flip == number_of_states_plus_one) {
974 		v->immediate_flip_supported = dcn_bw_no;
975 		v->voltage_level = v->voltage_level_without_immediate_flip;
976 	}
977 	else {
978 		v->immediate_flip_supported = dcn_bw_yes;
979 		v->voltage_level = v->voltage_level_with_immediate_flip;
980 	}
981 	v->dcfclk = v->dcfclk_per_state[v->voltage_level];
982 	v->fabric_and_dram_bandwidth = v->fabric_and_dram_bandwidth_per_state[v->voltage_level];
983 	for (j = 0; j <= 1; j++) {
984 		v->required_dispclk_per_ratio[j] = v->required_dispclk[v->voltage_level][j];
985 		for (k = 0; k <= v->number_of_active_planes - 1; k++) {
986 			v->dpp_per_plane_per_ratio[j][k] = v->no_of_dpp[v->voltage_level][j][k];
987 		}
988 		v->dispclk_dppclk_support_per_ratio[j] = v->dispclk_dppclk_support[v->voltage_level][j];
989 	}
990 	v->max_phyclk = v->phyclk_per_state[v->voltage_level];
991 }
992 void display_pipe_configuration(struct dcn_bw_internal_vars *v)
993 {
994 	int j;
995 	int k;
996 	/*display pipe configuration*/
997 
998 	for (j = 0; j <= 1; j++) {
999 		v->total_number_of_active_dpp_per_ratio[j] = 0.0;
1000 		for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1001 			v->total_number_of_active_dpp_per_ratio[j] = v->total_number_of_active_dpp_per_ratio[j] + v->dpp_per_plane_per_ratio[j][k];
1002 		}
1003 	}
1004 	if ((v->dispclk_dppclk_support_per_ratio[0] == dcn_bw_yes && v->dispclk_dppclk_support_per_ratio[1] == dcn_bw_no) || (v->dispclk_dppclk_support_per_ratio[0] == v->dispclk_dppclk_support_per_ratio[1] && (v->total_number_of_active_dpp_per_ratio[0] < v->total_number_of_active_dpp_per_ratio[1] || (((v->total_number_of_active_dpp_per_ratio[0] == v->total_number_of_active_dpp_per_ratio[1]) && v->required_dispclk_per_ratio[0] <= 0.5 * v->required_dispclk_per_ratio[1]))))) {
1005 		v->dispclk_dppclk_ratio = 1;
1006 		v->final_error_message = v->error_message[0];
1007 	}
1008 	else {
1009 		v->dispclk_dppclk_ratio = 2;
1010 		v->final_error_message = v->error_message[1];
1011 	}
1012 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1013 		v->dpp_per_plane[k] = v->dpp_per_plane_per_ratio[v->dispclk_dppclk_ratio - 1][k];
1014 	}
1015 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1016 		if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) {
1017 			v->byte_per_pix_dety = 8.0;
1018 			v->byte_per_pix_detc = 0.0;
1019 		}
1020 		else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_32) {
1021 			v->byte_per_pix_dety = 4.0;
1022 			v->byte_per_pix_detc = 0.0;
1023 		}
1024 		else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_16) {
1025 			v->byte_per_pix_dety = 2.0;
1026 			v->byte_per_pix_detc = 0.0;
1027 		}
1028 		else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8) {
1029 			v->byte_per_pix_dety = 1.0;
1030 			v->byte_per_pix_detc = 2.0;
1031 		}
1032 		else {
1033 			v->byte_per_pix_dety = 4.0f / 3.0f;
1034 			v->byte_per_pix_detc = 8.0f / 3.0f;
1035 		}
1036 		if ((v->source_pixel_format[k] == dcn_bw_rgb_sub_64 || v->source_pixel_format[k] == dcn_bw_rgb_sub_32 || v->source_pixel_format[k] == dcn_bw_rgb_sub_16)) {
1037 			if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1038 				v->read256_bytes_block_height_y = 1.0;
1039 			}
1040 			else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) {
1041 				v->read256_bytes_block_height_y = 4.0;
1042 			}
1043 			else {
1044 				v->read256_bytes_block_height_y = 8.0;
1045 			}
1046 			v->read256_bytes_block_width_y = 256.0 /dcn_bw_ceil2(v->byte_per_pix_dety, 1.0) / v->read256_bytes_block_height_y;
1047 			v->read256_bytes_block_height_c = 0.0;
1048 			v->read256_bytes_block_width_c = 0.0;
1049 		}
1050 		else {
1051 			if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1052 				v->read256_bytes_block_height_y = 1.0;
1053 				v->read256_bytes_block_height_c = 1.0;
1054 			}
1055 			else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8) {
1056 				v->read256_bytes_block_height_y = 16.0;
1057 				v->read256_bytes_block_height_c = 8.0;
1058 			}
1059 			else {
1060 				v->read256_bytes_block_height_y = 8.0;
1061 				v->read256_bytes_block_height_c = 8.0;
1062 			}
1063 			v->read256_bytes_block_width_y = 256.0 /dcn_bw_ceil2(v->byte_per_pix_dety, 1.0) / v->read256_bytes_block_height_y;
1064 			v->read256_bytes_block_width_c = 256.0 /dcn_bw_ceil2(v->byte_per_pix_detc, 2.0) / v->read256_bytes_block_height_c;
1065 		}
1066 		if (v->source_scan[k] == dcn_bw_hor) {
1067 			v->maximum_swath_height_y = v->read256_bytes_block_height_y;
1068 			v->maximum_swath_height_c = v->read256_bytes_block_height_c;
1069 		}
1070 		else {
1071 			v->maximum_swath_height_y = v->read256_bytes_block_width_y;
1072 			v->maximum_swath_height_c = v->read256_bytes_block_width_c;
1073 		}
1074 		if ((v->source_pixel_format[k] == dcn_bw_rgb_sub_64 || v->source_pixel_format[k] == dcn_bw_rgb_sub_32 || v->source_pixel_format[k] == dcn_bw_rgb_sub_16)) {
1075 			if (v->source_surface_mode[k] == dcn_bw_sw_linear || (v->source_pixel_format[k] == dcn_bw_rgb_sub_64 && (v->source_surface_mode[k] == dcn_bw_sw_4_kb_s || v->source_surface_mode[k] == dcn_bw_sw_4_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_var_s || v->source_surface_mode[k] == dcn_bw_sw_var_s_x) && v->source_scan[k] == dcn_bw_hor)) {
1076 				v->minimum_swath_height_y = v->maximum_swath_height_y;
1077 			}
1078 			else {
1079 				v->minimum_swath_height_y = v->maximum_swath_height_y / 2.0;
1080 			}
1081 			v->minimum_swath_height_c = v->maximum_swath_height_c;
1082 		}
1083 		else {
1084 			if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1085 				v->minimum_swath_height_y = v->maximum_swath_height_y;
1086 				v->minimum_swath_height_c = v->maximum_swath_height_c;
1087 			}
1088 			else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8 && v->source_scan[k] == dcn_bw_hor) {
1089 				v->minimum_swath_height_y = v->maximum_swath_height_y / 2.0;
1090 				if (v->bug_forcing_luma_and_chroma_request_to_same_size_fixed == dcn_bw_yes) {
1091 					v->minimum_swath_height_c = v->maximum_swath_height_c;
1092 				}
1093 				else {
1094 					v->minimum_swath_height_c = v->maximum_swath_height_c / 2.0;
1095 				}
1096 			}
1097 			else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10 && v->source_scan[k] == dcn_bw_hor) {
1098 				v->minimum_swath_height_c = v->maximum_swath_height_c / 2.0;
1099 				if (v->bug_forcing_luma_and_chroma_request_to_same_size_fixed == dcn_bw_yes) {
1100 					v->minimum_swath_height_y = v->maximum_swath_height_y;
1101 				}
1102 				else {
1103 					v->minimum_swath_height_y = v->maximum_swath_height_y / 2.0;
1104 				}
1105 			}
1106 			else {
1107 				v->minimum_swath_height_y = v->maximum_swath_height_y;
1108 				v->minimum_swath_height_c = v->maximum_swath_height_c;
1109 			}
1110 		}
1111 		if (v->source_scan[k] == dcn_bw_hor) {
1112 			v->swath_width = v->viewport_width[k] / v->dpp_per_plane[k];
1113 		}
1114 		else {
1115 			v->swath_width = v->viewport_height[k] / v->dpp_per_plane[k];
1116 		}
1117 		v->swath_width_granularity_y = 256.0 /dcn_bw_ceil2(v->byte_per_pix_dety, 1.0) / v->maximum_swath_height_y;
1118 		v->rounded_up_max_swath_size_bytes_y = (dcn_bw_ceil2(v->swath_width - 1.0, v->swath_width_granularity_y) + v->swath_width_granularity_y) * v->byte_per_pix_dety * v->maximum_swath_height_y;
1119 		if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10) {
1120 			v->rounded_up_max_swath_size_bytes_y =dcn_bw_ceil2(v->rounded_up_max_swath_size_bytes_y, 256.0) + 256;
1121 		}
1122 		if (v->maximum_swath_height_c > 0.0) {
1123 			v->swath_width_granularity_c = 256.0 /dcn_bw_ceil2(v->byte_per_pix_detc, 2.0) / v->maximum_swath_height_c;
1124 		}
1125 		v->rounded_up_max_swath_size_bytes_c = (dcn_bw_ceil2(v->swath_width / 2.0 - 1.0, v->swath_width_granularity_c) + v->swath_width_granularity_c) * v->byte_per_pix_detc * v->maximum_swath_height_c;
1126 		if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10) {
1127 			v->rounded_up_max_swath_size_bytes_c =dcn_bw_ceil2(v->rounded_up_max_swath_size_bytes_c, 256.0) + 256;
1128 		}
1129 		if (v->rounded_up_max_swath_size_bytes_y + v->rounded_up_max_swath_size_bytes_c <= v->det_buffer_size_in_kbyte * 1024.0 / 2.0) {
1130 			v->swath_height_y[k] = v->maximum_swath_height_y;
1131 			v->swath_height_c[k] = v->maximum_swath_height_c;
1132 		}
1133 		else {
1134 			v->swath_height_y[k] = v->minimum_swath_height_y;
1135 			v->swath_height_c[k] = v->minimum_swath_height_c;
1136 		}
1137 		if (v->swath_height_c[k] == 0.0) {
1138 			v->det_buffer_size_y[k] = v->det_buffer_size_in_kbyte * 1024.0;
1139 			v->det_buffer_size_c[k] = 0.0;
1140 		}
1141 		else if (v->swath_height_y[k] <= v->swath_height_c[k]) {
1142 			v->det_buffer_size_y[k] = v->det_buffer_size_in_kbyte * 1024.0 / 2.0;
1143 			v->det_buffer_size_c[k] = v->det_buffer_size_in_kbyte * 1024.0 / 2.0;
1144 		}
1145 		else {
1146 			v->det_buffer_size_y[k] = v->det_buffer_size_in_kbyte * 1024.0 * 2.0 / 3.0;
1147 			v->det_buffer_size_c[k] = v->det_buffer_size_in_kbyte * 1024.0 / 3.0;
1148 		}
1149 	}
1150 }
1151 void dispclkdppclkdcfclk_deep_sleep_prefetch_parameters_watermarks_and_performance_calculation(struct dcn_bw_internal_vars *v)
1152 {
1153 	int k;
1154 	/*dispclk and dppclk calculation*/
1155 
1156 	v->dispclk_with_ramping = 0.0;
1157 	v->dispclk_without_ramping = 0.0;
1158 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1159 		if (v->h_ratio[k] > 1.0) {
1160 			v->pscl_throughput[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput * v->h_ratio[k] /dcn_bw_ceil2(v->htaps[k] / 6.0, 1.0));
1161 		}
1162 		else {
1163 			v->pscl_throughput[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput);
1164 		}
1165 		v->dppclk_using_single_dpp_luma = v->pixel_clock[k] *dcn_bw_max3(v->vtaps[k] / 6.0 *dcn_bw_min2(1.0, v->h_ratio[k]), v->h_ratio[k] * v->v_ratio[k] / v->pscl_throughput[k], 1.0);
1166 		if ((v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
1167 			v->pscl_throughput_chroma[k] = 0.0;
1168 			v->dppclk_using_single_dpp = v->dppclk_using_single_dpp_luma;
1169 		}
1170 		else {
1171 			if (v->h_ratio[k] > 1.0) {
1172 				v->pscl_throughput_chroma[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput * v->h_ratio[k] / 2.0 /dcn_bw_ceil2(v->hta_pschroma[k] / 6.0, 1.0));
1173 			}
1174 			else {
1175 				v->pscl_throughput_chroma[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput);
1176 			}
1177 			v->dppclk_using_single_dpp_chroma = v->pixel_clock[k] *dcn_bw_max3(v->vta_pschroma[k] / 6.0 *dcn_bw_min2(1.0, v->h_ratio[k] / 2.0), v->h_ratio[k] * v->v_ratio[k] / 4.0 / v->pscl_throughput_chroma[k], 1.0);
1178 			v->dppclk_using_single_dpp =dcn_bw_max2(v->dppclk_using_single_dpp_luma, v->dppclk_using_single_dpp_chroma);
1179 		}
1180 		if (v->odm_capable == dcn_bw_yes) {
1181 			v->dispclk_with_ramping =dcn_bw_max2(v->dispclk_with_ramping,dcn_bw_max2(v->dppclk_using_single_dpp / v->dpp_per_plane[k] * v->dispclk_dppclk_ratio, v->pixel_clock[k] / v->dpp_per_plane[k]) * (1.0 + v->downspreading / 100.0) * (1.0 + v->dispclk_ramping_margin / 100.0));
1182 			v->dispclk_without_ramping =dcn_bw_max2(v->dispclk_without_ramping,dcn_bw_max2(v->dppclk_using_single_dpp / v->dpp_per_plane[k] * v->dispclk_dppclk_ratio, v->pixel_clock[k] / v->dpp_per_plane[k]) * (1.0 + v->downspreading / 100.0));
1183 		}
1184 		else {
1185 			v->dispclk_with_ramping =dcn_bw_max2(v->dispclk_with_ramping,dcn_bw_max2(v->dppclk_using_single_dpp / v->dpp_per_plane[k] * v->dispclk_dppclk_ratio, v->pixel_clock[k]) * (1.0 + v->downspreading / 100.0) * (1.0 + v->dispclk_ramping_margin / 100.0));
1186 			v->dispclk_without_ramping =dcn_bw_max2(v->dispclk_without_ramping,dcn_bw_max2(v->dppclk_using_single_dpp / v->dpp_per_plane[k] * v->dispclk_dppclk_ratio, v->pixel_clock[k]) * (1.0 + v->downspreading / 100.0));
1187 		}
1188 	}
1189 	if (v->dispclk_without_ramping > v->max_dispclk[number_of_states]) {
1190 		v->dispclk = v->dispclk_without_ramping;
1191 	}
1192 	else if (v->dispclk_with_ramping > v->max_dispclk[number_of_states]) {
1193 		v->dispclk = v->max_dispclk[number_of_states];
1194 	}
1195 	else {
1196 		v->dispclk = v->dispclk_with_ramping;
1197 	}
1198 	v->dppclk = v->dispclk / v->dispclk_dppclk_ratio;
1199 	/*urgent watermark*/
1200 
1201 	v->return_bandwidth_to_dcn =dcn_bw_min2(v->return_bus_width * v->dcfclk, v->fabric_and_dram_bandwidth * 1000.0 * v->percent_of_ideal_drambw_received_after_urg_latency / 100.0);
1202 	v->dcc_enabled_any_plane = dcn_bw_no;
1203 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1204 		if (v->dcc_enable[k] == dcn_bw_yes) {
1205 			v->dcc_enabled_any_plane = dcn_bw_yes;
1206 		}
1207 	}
1208 	v->return_bw = v->return_bandwidth_to_dcn;
1209 	if (v->dcc_enabled_any_plane == dcn_bw_yes && v->return_bandwidth_to_dcn > v->dcfclk * v->return_bus_width / 4.0) {
1210 		v->return_bw =dcn_bw_min2(v->return_bw, v->return_bandwidth_to_dcn * 4.0 * (1.0 - v->urgent_latency / ((v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 / (v->return_bandwidth_to_dcn - v->dcfclk * v->return_bus_width / 4.0) + v->urgent_latency)));
1211 	}
1212 	v->critical_compression = 2.0 * v->return_bus_width * v->dcfclk * v->urgent_latency / (v->return_bandwidth_to_dcn * v->urgent_latency + (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0);
1213 	if (v->dcc_enabled_any_plane == dcn_bw_yes && v->critical_compression > 1.0 && v->critical_compression < 4.0) {
1214 		v->return_bw =dcn_bw_min2(v->return_bw, dcn_bw_pow(4.0 * v->return_bandwidth_to_dcn * (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 * v->return_bus_width * v->dcfclk * v->urgent_latency / (v->return_bandwidth_to_dcn * v->urgent_latency + (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0), 2));
1215 	}
1216 	v->return_bandwidth_to_dcn =dcn_bw_min2(v->return_bus_width * v->dcfclk, v->fabric_and_dram_bandwidth * 1000.0);
1217 	if (v->dcc_enabled_any_plane == dcn_bw_yes && v->return_bandwidth_to_dcn > v->dcfclk * v->return_bus_width / 4.0) {
1218 		v->return_bw =dcn_bw_min2(v->return_bw, v->return_bandwidth_to_dcn * 4.0 * (1.0 - v->urgent_latency / ((v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 / (v->return_bandwidth_to_dcn - v->dcfclk * v->return_bus_width / 4.0) + v->urgent_latency)));
1219 	}
1220 	v->critical_compression = 2.0 * v->return_bus_width * v->dcfclk * v->urgent_latency / (v->return_bandwidth_to_dcn * v->urgent_latency + (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0);
1221 	if (v->dcc_enabled_any_plane == dcn_bw_yes && v->critical_compression > 1.0 && v->critical_compression < 4.0) {
1222 		v->return_bw =dcn_bw_min2(v->return_bw, dcn_bw_pow(4.0 * v->return_bandwidth_to_dcn * (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 * v->return_bus_width * v->dcfclk * v->urgent_latency / (v->return_bandwidth_to_dcn * v->urgent_latency + (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0), 2));
1223 	}
1224 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1225 		if (v->source_scan[k] == dcn_bw_hor) {
1226 			v->swath_width_y[k] = v->viewport_width[k] / v->dpp_per_plane[k];
1227 		}
1228 		else {
1229 			v->swath_width_y[k] = v->viewport_height[k] / v->dpp_per_plane[k];
1230 		}
1231 	}
1232 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1233 		if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) {
1234 			v->byte_per_pixel_dety[k] = 8.0;
1235 			v->byte_per_pixel_detc[k] = 0.0;
1236 		}
1237 		else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_32) {
1238 			v->byte_per_pixel_dety[k] = 4.0;
1239 			v->byte_per_pixel_detc[k] = 0.0;
1240 		}
1241 		else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_16) {
1242 			v->byte_per_pixel_dety[k] = 2.0;
1243 			v->byte_per_pixel_detc[k] = 0.0;
1244 		}
1245 		else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8) {
1246 			v->byte_per_pixel_dety[k] = 1.0;
1247 			v->byte_per_pixel_detc[k] = 2.0;
1248 		}
1249 		else {
1250 			v->byte_per_pixel_dety[k] = 4.0f / 3.0f;
1251 			v->byte_per_pixel_detc[k] = 8.0f / 3.0f;
1252 		}
1253 	}
1254 	v->total_data_read_bandwidth = 0.0;
1255 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1256 		v->read_bandwidth_plane_luma[k] = v->swath_width_y[k] * v->dpp_per_plane[k] *dcn_bw_ceil2(v->byte_per_pixel_dety[k], 1.0) / (v->htotal[k] / v->pixel_clock[k]) * v->v_ratio[k];
1257 		v->read_bandwidth_plane_chroma[k] = v->swath_width_y[k] / 2.0 * v->dpp_per_plane[k] *dcn_bw_ceil2(v->byte_per_pixel_detc[k], 2.0) / (v->htotal[k] / v->pixel_clock[k]) * v->v_ratio[k] / 2.0;
1258 		v->total_data_read_bandwidth = v->total_data_read_bandwidth + v->read_bandwidth_plane_luma[k] + v->read_bandwidth_plane_chroma[k];
1259 	}
1260 	v->total_active_dpp = 0.0;
1261 	v->total_dcc_active_dpp = 0.0;
1262 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1263 		v->total_active_dpp = v->total_active_dpp + v->dpp_per_plane[k];
1264 		if (v->dcc_enable[k] == dcn_bw_yes) {
1265 			v->total_dcc_active_dpp = v->total_dcc_active_dpp + v->dpp_per_plane[k];
1266 		}
1267 	}
1268 	v->urgent_round_trip_and_out_of_order_latency = (v->round_trip_ping_latency_cycles + 32.0) / v->dcfclk + v->urgent_out_of_order_return_per_channel * v->number_of_channels / v->return_bw;
1269 	v->last_pixel_of_line_extra_watermark = 0.0;
1270 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1271 		if (v->v_ratio[k] <= 1.0) {
1272 			v->display_pipe_line_delivery_time_luma[k] = v->swath_width_y[k] * v->dpp_per_plane[k] / v->h_ratio[k] / v->pixel_clock[k];
1273 		}
1274 		else {
1275 			v->display_pipe_line_delivery_time_luma[k] = v->swath_width_y[k] / v->pscl_throughput[k] / v->dppclk;
1276 		}
1277 		v->data_fabric_line_delivery_time_luma = v->swath_width_y[k] * v->swath_height_y[k] *dcn_bw_ceil2(v->byte_per_pixel_dety[k], 1.0) / (v->return_bw * v->read_bandwidth_plane_luma[k] / v->dpp_per_plane[k] / v->total_data_read_bandwidth);
1278 		v->last_pixel_of_line_extra_watermark =dcn_bw_max2(v->last_pixel_of_line_extra_watermark, v->data_fabric_line_delivery_time_luma - v->display_pipe_line_delivery_time_luma[k]);
1279 		if (v->byte_per_pixel_detc[k] == 0.0) {
1280 			v->display_pipe_line_delivery_time_chroma[k] = 0.0;
1281 		}
1282 		else {
1283 			if (v->v_ratio[k] / 2.0 <= 1.0) {
1284 				v->display_pipe_line_delivery_time_chroma[k] = v->swath_width_y[k] / 2.0 * v->dpp_per_plane[k] / (v->h_ratio[k] / 2.0) / v->pixel_clock[k];
1285 			}
1286 			else {
1287 				v->display_pipe_line_delivery_time_chroma[k] = v->swath_width_y[k] / 2.0 / v->pscl_throughput_chroma[k] / v->dppclk;
1288 			}
1289 			v->data_fabric_line_delivery_time_chroma = v->swath_width_y[k] / 2.0 * v->swath_height_c[k] *dcn_bw_ceil2(v->byte_per_pixel_detc[k], 2.0) / (v->return_bw * v->read_bandwidth_plane_chroma[k] / v->dpp_per_plane[k] / v->total_data_read_bandwidth);
1290 			v->last_pixel_of_line_extra_watermark =dcn_bw_max2(v->last_pixel_of_line_extra_watermark, v->data_fabric_line_delivery_time_chroma - v->display_pipe_line_delivery_time_chroma[k]);
1291 		}
1292 	}
1293 	v->urgent_extra_latency = v->urgent_round_trip_and_out_of_order_latency + (v->total_active_dpp * v->pixel_chunk_size_in_kbyte + v->total_dcc_active_dpp * v->meta_chunk_size) * 1024.0 / v->return_bw;
1294 	if (v->pte_enable == dcn_bw_yes) {
1295 		v->urgent_extra_latency = v->urgent_extra_latency + v->total_active_dpp * v->pte_chunk_size * 1024.0 / v->return_bw;
1296 	}
1297 	v->urgent_watermark = v->urgent_latency + v->last_pixel_of_line_extra_watermark + v->urgent_extra_latency;
1298 	v->ptemeta_urgent_watermark = v->urgent_watermark + 2.0 * v->urgent_latency;
1299 	/*nb p-state/dram clock change watermark*/
1300 
1301 	v->dram_clock_change_watermark = v->dram_clock_change_latency + v->urgent_watermark;
1302 	v->total_active_writeback = 0.0;
1303 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1304 		if (v->output[k] == dcn_bw_writeback) {
1305 			v->total_active_writeback = v->total_active_writeback + 1.0;
1306 		}
1307 	}
1308 	if (v->total_active_writeback <= 1.0) {
1309 		v->writeback_dram_clock_change_watermark = v->dram_clock_change_latency + v->write_back_latency;
1310 	}
1311 	else {
1312 		v->writeback_dram_clock_change_watermark = v->dram_clock_change_latency + v->write_back_latency + v->writeback_chunk_size * 1024.0 / 32.0 / v->socclk;
1313 	}
1314 	/*stutter efficiency*/
1315 
1316 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1317 		v->lines_in_dety[k] = v->det_buffer_size_y[k] / v->byte_per_pixel_dety[k] / v->swath_width_y[k];
1318 		v->lines_in_dety_rounded_down_to_swath[k] =dcn_bw_floor2(v->lines_in_dety[k], v->swath_height_y[k]);
1319 		v->full_det_buffering_time_y[k] = v->lines_in_dety_rounded_down_to_swath[k] * (v->htotal[k] / v->pixel_clock[k]) / v->v_ratio[k];
1320 		if (v->byte_per_pixel_detc[k] > 0.0) {
1321 			v->lines_in_detc[k] = v->det_buffer_size_c[k] / v->byte_per_pixel_detc[k] / (v->swath_width_y[k] / 2.0);
1322 			v->lines_in_detc_rounded_down_to_swath[k] =dcn_bw_floor2(v->lines_in_detc[k], v->swath_height_c[k]);
1323 			v->full_det_buffering_time_c[k] = v->lines_in_detc_rounded_down_to_swath[k] * (v->htotal[k] / v->pixel_clock[k]) / (v->v_ratio[k] / 2.0);
1324 		}
1325 		else {
1326 			v->lines_in_detc[k] = 0.0;
1327 			v->lines_in_detc_rounded_down_to_swath[k] = 0.0;
1328 			v->full_det_buffering_time_c[k] = 999999.0;
1329 		}
1330 	}
1331 	v->min_full_det_buffering_time = 999999.0;
1332 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1333 		if (v->full_det_buffering_time_y[k] < v->min_full_det_buffering_time) {
1334 			v->min_full_det_buffering_time = v->full_det_buffering_time_y[k];
1335 			v->frame_time_for_min_full_det_buffering_time = v->vtotal[k] * v->htotal[k] / v->pixel_clock[k];
1336 		}
1337 		if (v->full_det_buffering_time_c[k] < v->min_full_det_buffering_time) {
1338 			v->min_full_det_buffering_time = v->full_det_buffering_time_c[k];
1339 			v->frame_time_for_min_full_det_buffering_time = v->vtotal[k] * v->htotal[k] / v->pixel_clock[k];
1340 		}
1341 	}
1342 	v->average_read_bandwidth_gbyte_per_second = 0.0;
1343 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1344 		if (v->dcc_enable[k] == dcn_bw_yes) {
1345 			v->average_read_bandwidth_gbyte_per_second = v->average_read_bandwidth_gbyte_per_second + v->read_bandwidth_plane_luma[k] / v->dcc_rate[k] / 1000.0 + v->read_bandwidth_plane_chroma[k] / v->dcc_rate[k] / 1000.0;
1346 		}
1347 		else {
1348 			v->average_read_bandwidth_gbyte_per_second = v->average_read_bandwidth_gbyte_per_second + v->read_bandwidth_plane_luma[k] / 1000.0 + v->read_bandwidth_plane_chroma[k] / 1000.0;
1349 		}
1350 		if (v->dcc_enable[k] == dcn_bw_yes) {
1351 			v->average_read_bandwidth_gbyte_per_second = v->average_read_bandwidth_gbyte_per_second + v->read_bandwidth_plane_luma[k] / 1000.0 / 256.0 + v->read_bandwidth_plane_chroma[k] / 1000.0 / 256.0;
1352 		}
1353 		if (v->pte_enable == dcn_bw_yes) {
1354 			v->average_read_bandwidth_gbyte_per_second = v->average_read_bandwidth_gbyte_per_second + v->read_bandwidth_plane_luma[k] / 1000.0 / 512.0 + v->read_bandwidth_plane_chroma[k] / 1000.0 / 512.0;
1355 		}
1356 	}
1357 	v->part_of_burst_that_fits_in_rob =dcn_bw_min2(v->min_full_det_buffering_time * v->total_data_read_bandwidth, v->rob_buffer_size_in_kbyte * 1024.0 * v->total_data_read_bandwidth / (v->average_read_bandwidth_gbyte_per_second * 1000.0));
1358 	v->stutter_burst_time = v->part_of_burst_that_fits_in_rob * (v->average_read_bandwidth_gbyte_per_second * 1000.0) / v->total_data_read_bandwidth / v->return_bw + (v->min_full_det_buffering_time * v->total_data_read_bandwidth - v->part_of_burst_that_fits_in_rob) / (v->dcfclk * 64.0);
1359 	if (v->total_active_writeback == 0.0) {
1360 		v->stutter_efficiency_not_including_vblank = (1.0 - (v->sr_exit_time + v->stutter_burst_time) / v->min_full_det_buffering_time) * 100.0;
1361 	}
1362 	else {
1363 		v->stutter_efficiency_not_including_vblank = 0.0;
1364 	}
1365 	v->smallest_vblank = 999999.0;
1366 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1367 		if (v->synchronized_vblank == dcn_bw_yes || v->number_of_active_planes == 1) {
1368 			v->v_blank_time = (v->vtotal[k] - v->vactive[k]) * v->htotal[k] / v->pixel_clock[k];
1369 		}
1370 		else {
1371 			v->v_blank_time = 0.0;
1372 		}
1373 		v->smallest_vblank =dcn_bw_min2(v->smallest_vblank, v->v_blank_time);
1374 	}
1375 	v->stutter_efficiency = (v->stutter_efficiency_not_including_vblank / 100.0 * (v->frame_time_for_min_full_det_buffering_time - v->smallest_vblank) + v->smallest_vblank) / v->frame_time_for_min_full_det_buffering_time * 100.0;
1376 	/*dcfclk deep sleep*/
1377 
1378 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1379 		if (v->byte_per_pixel_detc[k] > 0.0) {
1380 			v->dcfclk_deep_sleep_per_plane[k] =dcn_bw_max2(1.1 * v->swath_width_y[k] *dcn_bw_ceil2(v->byte_per_pixel_dety[k], 1.0) / 32.0 / v->display_pipe_line_delivery_time_luma[k], 1.1 * v->swath_width_y[k] / 2.0 *dcn_bw_ceil2(v->byte_per_pixel_detc[k], 2.0) / 32.0 / v->display_pipe_line_delivery_time_chroma[k]);
1381 		}
1382 		else {
1383 			v->dcfclk_deep_sleep_per_plane[k] = 1.1 * v->swath_width_y[k] *dcn_bw_ceil2(v->byte_per_pixel_dety[k], 1.0) / 64.0 / v->display_pipe_line_delivery_time_luma[k];
1384 		}
1385 		v->dcfclk_deep_sleep_per_plane[k] =dcn_bw_max2(v->dcfclk_deep_sleep_per_plane[k], v->pixel_clock[k] / 16.0);
1386 	}
1387 	v->dcf_clk_deep_sleep = 8.0;
1388 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1389 		v->dcf_clk_deep_sleep =dcn_bw_max2(v->dcf_clk_deep_sleep, v->dcfclk_deep_sleep_per_plane[k]);
1390 	}
1391 	/*stutter watermark*/
1392 
1393 	v->stutter_exit_watermark = v->sr_exit_time + v->last_pixel_of_line_extra_watermark + v->urgent_extra_latency + 10.0 / v->dcf_clk_deep_sleep;
1394 	v->stutter_enter_plus_exit_watermark = v->sr_enter_plus_exit_time + v->last_pixel_of_line_extra_watermark + v->urgent_extra_latency;
1395 	/*urgent latency supported*/
1396 
1397 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1398 		v->effective_det_plus_lb_lines_luma =dcn_bw_floor2(v->lines_in_dety[k] +dcn_bw_min2(v->lines_in_dety[k] * v->dppclk * v->byte_per_pixel_dety[k] * v->pscl_throughput[k] / (v->return_bw / v->dpp_per_plane[k]), v->effective_lb_latency_hiding_source_lines_luma), v->swath_height_y[k]);
1399 		v->urgent_latency_support_us_luma = v->effective_det_plus_lb_lines_luma * (v->htotal[k] / v->pixel_clock[k]) / v->v_ratio[k] - v->effective_det_plus_lb_lines_luma * v->swath_width_y[k] * v->byte_per_pixel_dety[k] / (v->return_bw / v->dpp_per_plane[k]);
1400 		if (v->byte_per_pixel_detc[k] > 0.0) {
1401 			v->effective_det_plus_lb_lines_chroma =dcn_bw_floor2(v->lines_in_detc[k] +dcn_bw_min2(v->lines_in_detc[k] * v->dppclk * v->byte_per_pixel_detc[k] * v->pscl_throughput_chroma[k] / (v->return_bw / v->dpp_per_plane[k]), v->effective_lb_latency_hiding_source_lines_chroma), v->swath_height_c[k]);
1402 			v->urgent_latency_support_us_chroma = v->effective_det_plus_lb_lines_chroma * (v->htotal[k] / v->pixel_clock[k]) / (v->v_ratio[k] / 2.0) - v->effective_det_plus_lb_lines_chroma * (v->swath_width_y[k] / 2.0) * v->byte_per_pixel_detc[k] / (v->return_bw / v->dpp_per_plane[k]);
1403 			v->urgent_latency_support_us[k] =dcn_bw_min2(v->urgent_latency_support_us_luma, v->urgent_latency_support_us_chroma);
1404 		}
1405 		else {
1406 			v->urgent_latency_support_us[k] = v->urgent_latency_support_us_luma;
1407 		}
1408 	}
1409 	v->min_urgent_latency_support_us = 999999.0;
1410 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1411 		v->min_urgent_latency_support_us =dcn_bw_min2(v->min_urgent_latency_support_us, v->urgent_latency_support_us[k]);
1412 	}
1413 	/*non-urgent latency tolerance*/
1414 
1415 	v->non_urgent_latency_tolerance = v->min_urgent_latency_support_us - v->urgent_watermark;
1416 	/*prefetch*/
1417 
1418 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1419 		if ((v->source_pixel_format[k] == dcn_bw_rgb_sub_64 || v->source_pixel_format[k] == dcn_bw_rgb_sub_32 || v->source_pixel_format[k] == dcn_bw_rgb_sub_16)) {
1420 			if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1421 				v->block_height256_bytes_y = 1.0;
1422 			}
1423 			else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) {
1424 				v->block_height256_bytes_y = 4.0;
1425 			}
1426 			else {
1427 				v->block_height256_bytes_y = 8.0;
1428 			}
1429 			v->block_height256_bytes_c = 0.0;
1430 		}
1431 		else {
1432 			if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1433 				v->block_height256_bytes_y = 1.0;
1434 				v->block_height256_bytes_c = 1.0;
1435 			}
1436 			else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8) {
1437 				v->block_height256_bytes_y = 16.0;
1438 				v->block_height256_bytes_c = 8.0;
1439 			}
1440 			else {
1441 				v->block_height256_bytes_y = 8.0;
1442 				v->block_height256_bytes_c = 8.0;
1443 			}
1444 		}
1445 		if (v->dcc_enable[k] == dcn_bw_yes) {
1446 			v->meta_request_width_y = 64.0 * 256.0 /dcn_bw_ceil2(v->byte_per_pixel_dety[k], 1.0) / (8.0 * v->block_height256_bytes_y);
1447 			v->meta_surf_width_y =dcn_bw_ceil2(v->swath_width_y[k] - 1.0, v->meta_request_width_y) + v->meta_request_width_y;
1448 			v->meta_surf_height_y =dcn_bw_ceil2(v->viewport_height[k] - 1.0, 8.0 * v->block_height256_bytes_y) + 8.0 * v->block_height256_bytes_y;
1449 			if (v->pte_enable == dcn_bw_yes) {
1450 				v->meta_pte_bytes_frame_y = (dcn_bw_ceil2((v->meta_surf_width_y * v->meta_surf_height_y *dcn_bw_ceil2(v->byte_per_pixel_dety[k], 1.0) / 256.0 - 4096.0) / 8.0 / 4096.0, 1.0) + 1) * 64.0;
1451 			}
1452 			else {
1453 				v->meta_pte_bytes_frame_y = 0.0;
1454 			}
1455 			if (v->source_scan[k] == dcn_bw_hor) {
1456 				v->meta_row_byte_y = v->meta_surf_width_y * 8.0 * v->block_height256_bytes_y *dcn_bw_ceil2(v->byte_per_pixel_dety[k], 1.0) / 256.0;
1457 			}
1458 			else {
1459 				v->meta_row_byte_y = v->meta_surf_height_y * v->meta_request_width_y *dcn_bw_ceil2(v->byte_per_pixel_dety[k], 1.0) / 256.0;
1460 			}
1461 		}
1462 		else {
1463 			v->meta_pte_bytes_frame_y = 0.0;
1464 			v->meta_row_byte_y = 0.0;
1465 		}
1466 		if (v->pte_enable == dcn_bw_yes) {
1467 			if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1468 				v->macro_tile_size_byte_y = 256.0;
1469 				v->macro_tile_height_y = 1.0;
1470 			}
1471 			else if (v->source_surface_mode[k] == dcn_bw_sw_4_kb_s || v->source_surface_mode[k] == dcn_bw_sw_4_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d_x) {
1472 				v->macro_tile_size_byte_y = 4096.0;
1473 				v->macro_tile_height_y = 4.0 * v->block_height256_bytes_y;
1474 			}
1475 			else if (v->source_surface_mode[k] == dcn_bw_sw_64_kb_s || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_x) {
1476 				v->macro_tile_size_byte_y = 64.0 * 1024;
1477 				v->macro_tile_height_y = 16.0 * v->block_height256_bytes_y;
1478 			}
1479 			else {
1480 				v->macro_tile_size_byte_y = 256.0 * 1024;
1481 				v->macro_tile_height_y = 32.0 * v->block_height256_bytes_y;
1482 			}
1483 			if (v->macro_tile_size_byte_y <= 65536.0) {
1484 				v->pixel_pte_req_height_y = v->macro_tile_height_y;
1485 			}
1486 			else {
1487 				v->pixel_pte_req_height_y = 16.0 * v->block_height256_bytes_y;
1488 			}
1489 			v->pixel_pte_req_width_y = 4096.0 /dcn_bw_ceil2(v->byte_per_pixel_dety[k], 1.0) / v->pixel_pte_req_height_y * 8;
1490 			if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1491 				v->pixel_pte_bytes_per_row_y = 64.0 * (dcn_bw_ceil2((v->swath_width_y[k] *dcn_bw_min2(128.0, dcn_bw_pow(2.0,dcn_bw_floor2(dcn_bw_log(v->pte_buffer_size_in_requests * v->pixel_pte_req_width_y / v->swath_width_y[k], 2.0), 1.0))) - 1.0) / v->pixel_pte_req_width_y, 1.0) + 1);
1492 			}
1493 			else if (v->source_scan[k] == dcn_bw_hor) {
1494 				v->pixel_pte_bytes_per_row_y = 64.0 * (dcn_bw_ceil2((v->swath_width_y[k] - 1.0) / v->pixel_pte_req_width_y, 1.0) + 1);
1495 			}
1496 			else {
1497 				v->pixel_pte_bytes_per_row_y = 64.0 * (dcn_bw_ceil2((v->viewport_height[k] - 1.0) / v->pixel_pte_req_height_y, 1.0) + 1);
1498 			}
1499 		}
1500 		else {
1501 			v->pixel_pte_bytes_per_row_y = 0.0;
1502 		}
1503 		if ((v->source_pixel_format[k] != dcn_bw_rgb_sub_64 && v->source_pixel_format[k] != dcn_bw_rgb_sub_32 && v->source_pixel_format[k] != dcn_bw_rgb_sub_16)) {
1504 			if (v->dcc_enable[k] == dcn_bw_yes) {
1505 				v->meta_request_width_c = 64.0 * 256.0 /dcn_bw_ceil2(v->byte_per_pixel_detc[k], 2.0) / (8.0 * v->block_height256_bytes_c);
1506 				v->meta_surf_width_c =dcn_bw_ceil2(v->swath_width_y[k] / 2.0 - 1.0, v->meta_request_width_c) + v->meta_request_width_c;
1507 				v->meta_surf_height_c =dcn_bw_ceil2(v->viewport_height[k] / 2.0 - 1.0, 8.0 * v->block_height256_bytes_c) + 8.0 * v->block_height256_bytes_c;
1508 				if (v->pte_enable == dcn_bw_yes) {
1509 					v->meta_pte_bytes_frame_c = (dcn_bw_ceil2((v->meta_surf_width_c * v->meta_surf_height_c *dcn_bw_ceil2(v->byte_per_pixel_detc[k], 2.0) / 256.0 - 4096.0) / 8.0 / 4096.0, 1.0) + 1) * 64.0;
1510 				}
1511 				else {
1512 					v->meta_pte_bytes_frame_c = 0.0;
1513 				}
1514 				if (v->source_scan[k] == dcn_bw_hor) {
1515 					v->meta_row_byte_c = v->meta_surf_width_c * 8.0 * v->block_height256_bytes_c *dcn_bw_ceil2(v->byte_per_pixel_detc[k], 2.0) / 256.0;
1516 				}
1517 				else {
1518 					v->meta_row_byte_c = v->meta_surf_height_c * v->meta_request_width_c *dcn_bw_ceil2(v->byte_per_pixel_detc[k], 2.0) / 256.0;
1519 				}
1520 			}
1521 			else {
1522 				v->meta_pte_bytes_frame_c = 0.0;
1523 				v->meta_row_byte_c = 0.0;
1524 			}
1525 			if (v->pte_enable == dcn_bw_yes) {
1526 				if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1527 					v->macro_tile_size_bytes_c = 256.0;
1528 					v->macro_tile_height_c = 1.0;
1529 				}
1530 				else if (v->source_surface_mode[k] == dcn_bw_sw_4_kb_s || v->source_surface_mode[k] == dcn_bw_sw_4_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d_x) {
1531 					v->macro_tile_size_bytes_c = 4096.0;
1532 					v->macro_tile_height_c = 4.0 * v->block_height256_bytes_c;
1533 				}
1534 				else if (v->source_surface_mode[k] == dcn_bw_sw_64_kb_s || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_x) {
1535 					v->macro_tile_size_bytes_c = 64.0 * 1024;
1536 					v->macro_tile_height_c = 16.0 * v->block_height256_bytes_c;
1537 				}
1538 				else {
1539 					v->macro_tile_size_bytes_c = 256.0 * 1024;
1540 					v->macro_tile_height_c = 32.0 * v->block_height256_bytes_c;
1541 				}
1542 				if (v->macro_tile_size_bytes_c <= 65536.0) {
1543 					v->pixel_pte_req_height_c = v->macro_tile_height_c;
1544 				}
1545 				else {
1546 					v->pixel_pte_req_height_c = 16.0 * v->block_height256_bytes_c;
1547 				}
1548 				v->pixel_pte_req_width_c = 4096.0 /dcn_bw_ceil2(v->byte_per_pixel_detc[k], 2.0) / v->pixel_pte_req_height_c * 8;
1549 				if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1550 					v->pixel_pte_bytes_per_row_c = 64.0 * (dcn_bw_ceil2((v->swath_width_y[k] / 2.0 * dcn_bw_min2(128.0, dcn_bw_pow(2.0,dcn_bw_floor2(dcn_bw_log(v->pte_buffer_size_in_requests * v->pixel_pte_req_width_c / (v->swath_width_y[k] / 2.0), 2.0), 1.0))) - 1.0) / v->pixel_pte_req_width_c, 1.0) + 1);
1551 				}
1552 				else if (v->source_scan[k] == dcn_bw_hor) {
1553 					v->pixel_pte_bytes_per_row_c = 64.0 * (dcn_bw_ceil2((v->swath_width_y[k] / 2.0 - 1.0) / v->pixel_pte_req_width_c, 1.0) + 1);
1554 				}
1555 				else {
1556 					v->pixel_pte_bytes_per_row_c = 64.0 * (dcn_bw_ceil2((v->viewport_height[k] / 2.0 - 1.0) / v->pixel_pte_req_height_c, 1.0) + 1);
1557 				}
1558 			}
1559 			else {
1560 				v->pixel_pte_bytes_per_row_c = 0.0;
1561 			}
1562 		}
1563 		else {
1564 			v->pixel_pte_bytes_per_row_c = 0.0;
1565 			v->meta_pte_bytes_frame_c = 0.0;
1566 			v->meta_row_byte_c = 0.0;
1567 		}
1568 		v->pixel_pte_bytes_per_row[k] = v->pixel_pte_bytes_per_row_y + v->pixel_pte_bytes_per_row_c;
1569 		v->meta_pte_bytes_frame[k] = v->meta_pte_bytes_frame_y + v->meta_pte_bytes_frame_c;
1570 		v->meta_row_byte[k] = v->meta_row_byte_y + v->meta_row_byte_c;
1571 		v->v_init_pre_fill_y[k] =dcn_bw_floor2((v->v_ratio[k] + v->vtaps[k] + 1.0 + v->interlace_output[k] * 0.5 * v->v_ratio[k]) / 2.0, 1.0);
1572 		v->max_num_swath_y[k] =dcn_bw_ceil2((v->v_init_pre_fill_y[k] - 1.0) / v->swath_height_y[k], 1.0) + 1;
1573 		if (v->v_init_pre_fill_y[k] > 1.0) {
1574 			v->max_partial_swath_y =dcn_bw_mod((v->v_init_pre_fill_y[k] - 2.0), v->swath_height_y[k]);
1575 		}
1576 		else {
1577 			v->max_partial_swath_y =dcn_bw_mod((v->v_init_pre_fill_y[k] + v->swath_height_y[k] - 2.0), v->swath_height_y[k]);
1578 		}
1579 		v->max_partial_swath_y =dcn_bw_max2(1.0, v->max_partial_swath_y);
1580 		v->prefetch_source_lines_y[k] = v->max_num_swath_y[k] * v->swath_height_y[k] + v->max_partial_swath_y;
1581 		if ((v->source_pixel_format[k] != dcn_bw_rgb_sub_64 && v->source_pixel_format[k] != dcn_bw_rgb_sub_32 && v->source_pixel_format[k] != dcn_bw_rgb_sub_16)) {
1582 			v->v_init_pre_fill_c[k] =dcn_bw_floor2((v->v_ratio[k] / 2.0 + v->vtaps[k] + 1.0 + v->interlace_output[k] * 0.5 * v->v_ratio[k] / 2.0) / 2.0, 1.0);
1583 			v->max_num_swath_c[k] =dcn_bw_ceil2((v->v_init_pre_fill_c[k] - 1.0) / v->swath_height_c[k], 1.0) + 1;
1584 			if (v->v_init_pre_fill_c[k] > 1.0) {
1585 				v->max_partial_swath_c =dcn_bw_mod((v->v_init_pre_fill_c[k] - 2.0), v->swath_height_c[k]);
1586 			}
1587 			else {
1588 				v->max_partial_swath_c =dcn_bw_mod((v->v_init_pre_fill_c[k] + v->swath_height_c[k] - 2.0), v->swath_height_c[k]);
1589 			}
1590 			v->max_partial_swath_c =dcn_bw_max2(1.0, v->max_partial_swath_c);
1591 		}
1592 		else {
1593 			v->max_num_swath_c[k] = 0.0;
1594 			v->max_partial_swath_c = 0.0;
1595 		}
1596 		v->prefetch_source_lines_c[k] = v->max_num_swath_c[k] * v->swath_height_c[k] + v->max_partial_swath_c;
1597 	}
1598 	v->t_calc = 24.0 / v->dcf_clk_deep_sleep;
1599 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1600 		if (v->can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one == dcn_bw_yes) {
1601 			v->max_vstartup_lines[k] = v->vtotal[k] - v->vactive[k] - 1.0;
1602 		}
1603 		else {
1604 			v->max_vstartup_lines[k] = v->v_sync_plus_back_porch[k] - 1.0;
1605 		}
1606 	}
1607 	v->next_prefetch_mode = 0.0;
1608 	do {
1609 		v->v_startup_lines = 13.0;
1610 		do {
1611 			v->planes_with_room_to_increase_vstartup_prefetch_bw_less_than_active_bw = dcn_bw_yes;
1612 			v->planes_with_room_to_increase_vstartup_vratio_prefetch_more_than4 = dcn_bw_no;
1613 			v->planes_with_room_to_increase_vstartup_destination_line_times_for_prefetch_less_than2 = dcn_bw_no;
1614 			v->v_ratio_prefetch_more_than4 = dcn_bw_no;
1615 			v->destination_line_times_for_prefetch_less_than2 = dcn_bw_no;
1616 			v->prefetch_mode = v->next_prefetch_mode;
1617 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1618 				v->dstx_after_scaler = 90.0 * v->pixel_clock[k] / v->dppclk + 42.0 * v->pixel_clock[k] / v->dispclk;
1619 				if (v->dpp_per_plane[k] > 1.0) {
1620 					v->dstx_after_scaler = v->dstx_after_scaler + v->scaler_rec_out_width[k] / 2.0;
1621 				}
1622 				if (v->output_format[k] == dcn_bw_420) {
1623 					v->dsty_after_scaler = 1.0;
1624 				}
1625 				else {
1626 					v->dsty_after_scaler = 0.0;
1627 				}
1628 				v->v_update_offset_pix =dcn_bw_ceil2(v->htotal[k] / 4.0, 1.0);
1629 				v->total_repeater_delay_time = v->max_inter_dcn_tile_repeaters * (2.0 / v->dppclk + 3.0 / v->dispclk);
1630 				v->v_update_width_pix = (14.0 / v->dcf_clk_deep_sleep + 12.0 / v->dppclk + v->total_repeater_delay_time) * v->pixel_clock[k];
1631 				v->v_ready_offset_pix =dcn_bw_max2(150.0 / v->dppclk, v->total_repeater_delay_time + 20.0 / v->dcf_clk_deep_sleep + 10.0 / v->dppclk) * v->pixel_clock[k];
1632 				v->t_setup = (v->v_update_offset_pix + v->v_update_width_pix + v->v_ready_offset_pix) / v->pixel_clock[k];
1633 				v->v_startup[k] =dcn_bw_min2(v->v_startup_lines, v->max_vstartup_lines[k]);
1634 				if (v->prefetch_mode == 0.0) {
1635 					v->t_wait =dcn_bw_max3(v->dram_clock_change_latency + v->urgent_latency, v->sr_enter_plus_exit_time, v->urgent_latency);
1636 				}
1637 				else if (v->prefetch_mode == 1.0) {
1638 					v->t_wait =dcn_bw_max2(v->sr_enter_plus_exit_time, v->urgent_latency);
1639 				}
1640 				else {
1641 					v->t_wait = v->urgent_latency;
1642 				}
1643 				v->destination_lines_for_prefetch[k] =dcn_bw_floor2(4.0 * (v->v_startup[k] - v->t_wait / (v->htotal[k] / v->pixel_clock[k]) - (v->t_calc + v->t_setup) / (v->htotal[k] / v->pixel_clock[k]) - (v->dsty_after_scaler + v->dstx_after_scaler / v->htotal[k]) + 0.125), 1.0) / 4;
1644 				if (v->destination_lines_for_prefetch[k] > 0.0) {
1645 					v->prefetch_bandwidth[k] = (v->meta_pte_bytes_frame[k] + 2.0 * v->meta_row_byte[k] + 2.0 * v->pixel_pte_bytes_per_row[k] + v->prefetch_source_lines_y[k] * v->swath_width_y[k] *dcn_bw_ceil2(v->byte_per_pixel_dety[k], 1.0) + v->prefetch_source_lines_c[k] * v->swath_width_y[k] / 2.0 *dcn_bw_ceil2(v->byte_per_pixel_detc[k], 2.0)) / (v->destination_lines_for_prefetch[k] * v->htotal[k] / v->pixel_clock[k]);
1646 				}
1647 				else {
1648 					v->prefetch_bandwidth[k] = 999999.0;
1649 				}
1650 			}
1651 			v->bandwidth_available_for_immediate_flip = v->return_bw;
1652 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1653 				v->bandwidth_available_for_immediate_flip = v->bandwidth_available_for_immediate_flip -dcn_bw_max2(v->read_bandwidth_plane_luma[k] + v->read_bandwidth_plane_chroma[k], v->prefetch_bandwidth[k]);
1654 			}
1655 			v->tot_immediate_flip_bytes = 0.0;
1656 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1657 				if (v->immediate_flip_supported == dcn_bw_yes && (v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
1658 					v->tot_immediate_flip_bytes = v->tot_immediate_flip_bytes + v->meta_pte_bytes_frame[k] + v->meta_row_byte[k] + v->pixel_pte_bytes_per_row[k];
1659 				}
1660 			}
1661 			v->max_rd_bandwidth = 0.0;
1662 			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1663 				if (v->pte_enable == dcn_bw_yes && v->dcc_enable[k] == dcn_bw_yes) {
1664 					if (v->immediate_flip_supported == dcn_bw_yes && (v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
1665 						v->time_for_fetching_meta_pte =dcn_bw_max5(v->meta_pte_bytes_frame[k] / v->prefetch_bandwidth[k], v->meta_pte_bytes_frame[k] * v->tot_immediate_flip_bytes / (v->bandwidth_available_for_immediate_flip * (v->meta_pte_bytes_frame[k] + v->meta_row_byte[k] + v->pixel_pte_bytes_per_row[k])), v->urgent_extra_latency, v->urgent_latency, v->htotal[k] / v->pixel_clock[k] / 4.0);
1666 					}
1667 					else {
1668 						v->time_for_fetching_meta_pte =dcn_bw_max3(v->meta_pte_bytes_frame[k] / v->prefetch_bandwidth[k], v->urgent_extra_latency, v->htotal[k] / v->pixel_clock[k] / 4.0);
1669 					}
1670 				}
1671 				else {
1672 					v->time_for_fetching_meta_pte = v->htotal[k] / v->pixel_clock[k] / 4.0;
1673 				}
1674 				v->destination_lines_to_request_vm_inv_blank[k] =dcn_bw_floor2(4.0 * (v->time_for_fetching_meta_pte / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
1675 				if ((v->pte_enable == dcn_bw_yes || v->dcc_enable[k] == dcn_bw_yes)) {
1676 					if (v->immediate_flip_supported == dcn_bw_yes && (v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
1677 						v->time_for_fetching_row_in_vblank =dcn_bw_max5((v->meta_row_byte[k] + v->pixel_pte_bytes_per_row[k]) / v->prefetch_bandwidth[k], (v->meta_row_byte[k] + v->pixel_pte_bytes_per_row[k]) * v->tot_immediate_flip_bytes / (v->bandwidth_available_for_immediate_flip * (v->meta_pte_bytes_frame[k] + v->meta_row_byte[k] + v->pixel_pte_bytes_per_row[k])), v->urgent_extra_latency, 2.0 * v->urgent_latency, v->htotal[k] / v->pixel_clock[k] - v->time_for_fetching_meta_pte);
1678 					}
1679 					else {
1680 						v->time_for_fetching_row_in_vblank =dcn_bw_max3((v->meta_row_byte[k] + v->pixel_pte_bytes_per_row[k]) / v->prefetch_bandwidth[k], v->urgent_extra_latency, v->htotal[k] / v->pixel_clock[k] - v->time_for_fetching_meta_pte);
1681 					}
1682 				}
1683 				else {
1684 					v->time_for_fetching_row_in_vblank =dcn_bw_max2(v->urgent_extra_latency - v->time_for_fetching_meta_pte, v->htotal[k] / v->pixel_clock[k] - v->time_for_fetching_meta_pte);
1685 				}
1686 				v->destination_lines_to_request_row_in_vblank[k] =dcn_bw_floor2(4.0 * (v->time_for_fetching_row_in_vblank / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
1687 				v->lines_to_request_prefetch_pixel_data = v->destination_lines_for_prefetch[k] - v->destination_lines_to_request_vm_inv_blank[k] - v->destination_lines_to_request_row_in_vblank[k];
1688 				if (v->lines_to_request_prefetch_pixel_data > 0.0) {
1689 					v->v_ratio_prefetch_y[k] = v->prefetch_source_lines_y[k] / v->lines_to_request_prefetch_pixel_data;
1690 					if ((v->swath_height_y[k] > 4.0)) {
1691 						if (v->lines_to_request_prefetch_pixel_data > (v->v_init_pre_fill_y[k] - 3.0) / 2.0) {
1692 							v->v_ratio_prefetch_y[k] =dcn_bw_max2(v->v_ratio_prefetch_y[k], v->max_num_swath_y[k] * v->swath_height_y[k] / (v->lines_to_request_prefetch_pixel_data - (v->v_init_pre_fill_y[k] - 3.0) / 2.0));
1693 						}
1694 						else {
1695 							v->v_ratio_prefetch_y[k] = 999999.0;
1696 						}
1697 					}
1698 				}
1699 				else {
1700 					v->v_ratio_prefetch_y[k] = 999999.0;
1701 				}
1702 				v->v_ratio_prefetch_y[k] =dcn_bw_max2(v->v_ratio_prefetch_y[k], 1.0);
1703 				if (v->lines_to_request_prefetch_pixel_data > 0.0) {
1704 					v->v_ratio_prefetch_c[k] = v->prefetch_source_lines_c[k] / v->lines_to_request_prefetch_pixel_data;
1705 					if ((v->swath_height_c[k] > 4.0)) {
1706 						if (v->lines_to_request_prefetch_pixel_data > (v->v_init_pre_fill_c[k] - 3.0) / 2.0) {
1707 							v->v_ratio_prefetch_c[k] =dcn_bw_max2(v->v_ratio_prefetch_c[k], v->max_num_swath_c[k] * v->swath_height_c[k] / (v->lines_to_request_prefetch_pixel_data - (v->v_init_pre_fill_c[k] - 3.0) / 2.0));
1708 						}
1709 						else {
1710 							v->v_ratio_prefetch_c[k] = 999999.0;
1711 						}
1712 					}
1713 				}
1714 				else {
1715 					v->v_ratio_prefetch_c[k] = 999999.0;
1716 				}
1717 				v->v_ratio_prefetch_c[k] =dcn_bw_max2(v->v_ratio_prefetch_c[k], 1.0);
1718 				if (v->lines_to_request_prefetch_pixel_data > 0.0) {
1719 					v->required_prefetch_pix_data_bw = v->dpp_per_plane[k] * (v->prefetch_source_lines_y[k] / v->lines_to_request_prefetch_pixel_data *dcn_bw_ceil2(v->byte_per_pixel_dety[k], 1.0) + v->prefetch_source_lines_c[k] / v->lines_to_request_prefetch_pixel_data *dcn_bw_ceil2(v->byte_per_pixel_detc[k], 2.0) / 2.0) * v->swath_width_y[k] / (v->htotal[k] / v->pixel_clock[k]);
1720 				}
1721 				else {
1722 					v->required_prefetch_pix_data_bw = 999999.0;
1723 				}
1724 				v->max_rd_bandwidth = v->max_rd_bandwidth +dcn_bw_max2(v->read_bandwidth_plane_luma[k] + v->read_bandwidth_plane_chroma[k], v->required_prefetch_pix_data_bw);
1725 				if (v->immediate_flip_supported == dcn_bw_yes && (v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
1726 					v->max_rd_bandwidth = v->max_rd_bandwidth +dcn_bw_max2(v->meta_pte_bytes_frame[k] / (v->destination_lines_to_request_vm_inv_blank[k] * v->htotal[k] / v->pixel_clock[k]), (v->meta_row_byte[k] + v->pixel_pte_bytes_per_row[k]) / (v->destination_lines_to_request_row_in_vblank[k] * v->htotal[k] / v->pixel_clock[k]));
1727 				}
1728 				if (v->v_ratio_prefetch_y[k] > 4.0 || v->v_ratio_prefetch_c[k] > 4.0) {
1729 					v->v_ratio_prefetch_more_than4 = dcn_bw_yes;
1730 				}
1731 				if (v->destination_lines_for_prefetch[k] < 2.0) {
1732 					v->destination_line_times_for_prefetch_less_than2 = dcn_bw_yes;
1733 				}
1734 				if (v->max_vstartup_lines[k] > v->v_startup_lines) {
1735 					if (v->required_prefetch_pix_data_bw > (v->read_bandwidth_plane_luma[k] + v->read_bandwidth_plane_chroma[k])) {
1736 						v->planes_with_room_to_increase_vstartup_prefetch_bw_less_than_active_bw = dcn_bw_no;
1737 					}
1738 					if (v->v_ratio_prefetch_y[k] > 4.0 || v->v_ratio_prefetch_c[k] > 4.0) {
1739 						v->planes_with_room_to_increase_vstartup_vratio_prefetch_more_than4 = dcn_bw_yes;
1740 					}
1741 					if (v->destination_lines_for_prefetch[k] < 2.0) {
1742 						v->planes_with_room_to_increase_vstartup_destination_line_times_for_prefetch_less_than2 = dcn_bw_yes;
1743 					}
1744 				}
1745 			}
1746 			if (v->max_rd_bandwidth <= v->return_bw && v->v_ratio_prefetch_more_than4 == dcn_bw_no && v->destination_line_times_for_prefetch_less_than2 == dcn_bw_no) {
1747 				v->prefetch_mode_supported = dcn_bw_yes;
1748 			}
1749 			else {
1750 				v->prefetch_mode_supported = dcn_bw_no;
1751 			}
1752 			v->v_startup_lines = v->v_startup_lines + 1.0;
1753 		} while (!(v->prefetch_mode_supported == dcn_bw_yes || (v->planes_with_room_to_increase_vstartup_prefetch_bw_less_than_active_bw == dcn_bw_yes && v->planes_with_room_to_increase_vstartup_vratio_prefetch_more_than4 == dcn_bw_no && v->planes_with_room_to_increase_vstartup_destination_line_times_for_prefetch_less_than2 == dcn_bw_no)));
1754 		v->next_prefetch_mode = v->next_prefetch_mode + 1.0;
1755 	} while (!(v->prefetch_mode_supported == dcn_bw_yes || v->prefetch_mode == 2.0));
1756 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1757 		if (v->v_ratio_prefetch_y[k] <= 1.0) {
1758 			v->display_pipe_line_delivery_time_luma_prefetch[k] = v->swath_width_y[k] * v->dpp_per_plane[k] / v->h_ratio[k] / v->pixel_clock[k];
1759 		}
1760 		else {
1761 			v->display_pipe_line_delivery_time_luma_prefetch[k] = v->swath_width_y[k] / v->pscl_throughput[k] / v->dppclk;
1762 		}
1763 		if (v->byte_per_pixel_detc[k] == 0.0) {
1764 			v->display_pipe_line_delivery_time_chroma_prefetch[k] = 0.0;
1765 		}
1766 		else {
1767 			if (v->v_ratio_prefetch_c[k] <= 1.0) {
1768 				v->display_pipe_line_delivery_time_chroma_prefetch[k] = v->swath_width_y[k] * v->dpp_per_plane[k] / v->h_ratio[k] / v->pixel_clock[k];
1769 			}
1770 			else {
1771 				v->display_pipe_line_delivery_time_chroma_prefetch[k] = v->swath_width_y[k] / v->pscl_throughput[k] / v->dppclk;
1772 			}
1773 		}
1774 	}
1775 	/*min ttuv_blank*/
1776 
1777 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1778 		if (v->prefetch_mode == 0.0) {
1779 			v->allow_dram_clock_change_during_vblank[k] = dcn_bw_yes;
1780 			v->allow_dram_self_refresh_during_vblank[k] = dcn_bw_yes;
1781 			v->min_ttuv_blank[k] = v->t_calc +dcn_bw_max3(v->dram_clock_change_watermark, v->stutter_enter_plus_exit_watermark, v->urgent_watermark);
1782 		}
1783 		else if (v->prefetch_mode == 1.0) {
1784 			v->allow_dram_clock_change_during_vblank[k] = dcn_bw_no;
1785 			v->allow_dram_self_refresh_during_vblank[k] = dcn_bw_yes;
1786 			v->min_ttuv_blank[k] = v->t_calc +dcn_bw_max2(v->stutter_enter_plus_exit_watermark, v->urgent_watermark);
1787 		}
1788 		else {
1789 			v->allow_dram_clock_change_during_vblank[k] = dcn_bw_no;
1790 			v->allow_dram_self_refresh_during_vblank[k] = dcn_bw_no;
1791 			v->min_ttuv_blank[k] = v->t_calc + v->urgent_watermark;
1792 		}
1793 	}
1794 	/*nb p-state/dram clock change support*/
1795 
1796 	v->active_dp_ps = 0.0;
1797 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1798 		v->active_dp_ps = v->active_dp_ps + v->dpp_per_plane[k];
1799 	}
1800 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1801 		v->lb_latency_hiding_source_lines_y =dcn_bw_min2(v->max_line_buffer_lines,dcn_bw_floor2(v->line_buffer_size / v->lb_bit_per_pixel[k] / (v->swath_width_y[k] /dcn_bw_max2(v->h_ratio[k], 1.0)), 1.0)) - (v->vtaps[k] - 1.0);
1802 		v->lb_latency_hiding_source_lines_c =dcn_bw_min2(v->max_line_buffer_lines,dcn_bw_floor2(v->line_buffer_size / v->lb_bit_per_pixel[k] / (v->swath_width_y[k] / 2.0 /dcn_bw_max2(v->h_ratio[k] / 2.0, 1.0)), 1.0)) - (v->vta_pschroma[k] - 1.0);
1803 		v->effective_lb_latency_hiding_y = v->lb_latency_hiding_source_lines_y / v->v_ratio[k] * (v->htotal[k] / v->pixel_clock[k]);
1804 		v->effective_lb_latency_hiding_c = v->lb_latency_hiding_source_lines_c / (v->v_ratio[k] / 2.0) * (v->htotal[k] / v->pixel_clock[k]);
1805 		if (v->swath_width_y[k] > 2.0 * v->dpp_output_buffer_pixels) {
1806 			v->dpp_output_buffer_lines_y = v->dpp_output_buffer_pixels / v->swath_width_y[k];
1807 		}
1808 		else if (v->swath_width_y[k] > v->dpp_output_buffer_pixels) {
1809 			v->dpp_output_buffer_lines_y = 0.5;
1810 		}
1811 		else {
1812 			v->dpp_output_buffer_lines_y = 1.0;
1813 		}
1814 		if (v->swath_width_y[k] / 2.0 > 2.0 * v->dpp_output_buffer_pixels) {
1815 			v->dpp_output_buffer_lines_c = v->dpp_output_buffer_pixels / (v->swath_width_y[k] / 2.0);
1816 		}
1817 		else if (v->swath_width_y[k] / 2.0 > v->dpp_output_buffer_pixels) {
1818 			v->dpp_output_buffer_lines_c = 0.5;
1819 		}
1820 		else {
1821 			v->dpp_output_buffer_lines_c = 1.0;
1822 		}
1823 		v->dppopp_buffering_y = (v->htotal[k] / v->pixel_clock[k]) * (v->dpp_output_buffer_lines_y + v->opp_output_buffer_lines);
1824 		v->max_det_buffering_time_y = v->full_det_buffering_time_y[k] + (v->lines_in_dety[k] - v->lines_in_dety_rounded_down_to_swath[k]) / v->swath_height_y[k] * (v->htotal[k] / v->pixel_clock[k]);
1825 		v->active_dram_clock_change_latency_margin_y = v->dppopp_buffering_y + v->effective_lb_latency_hiding_y + v->max_det_buffering_time_y - v->dram_clock_change_watermark;
1826 		if (v->active_dp_ps > 1.0) {
1827 			v->active_dram_clock_change_latency_margin_y = v->active_dram_clock_change_latency_margin_y - (1.0 - 1.0 / (v->active_dp_ps - 1.0)) * v->swath_height_y[k] * (v->htotal[k] / v->pixel_clock[k]);
1828 		}
1829 		if (v->byte_per_pixel_detc[k] > 0.0) {
1830 			v->dppopp_buffering_c = (v->htotal[k] / v->pixel_clock[k]) * (v->dpp_output_buffer_lines_c + v->opp_output_buffer_lines);
1831 			v->max_det_buffering_time_c = v->full_det_buffering_time_c[k] + (v->lines_in_detc[k] - v->lines_in_detc_rounded_down_to_swath[k]) / v->swath_height_c[k] * (v->htotal[k] / v->pixel_clock[k]);
1832 			v->active_dram_clock_change_latency_margin_c = v->dppopp_buffering_c + v->effective_lb_latency_hiding_c + v->max_det_buffering_time_c - v->dram_clock_change_watermark;
1833 			if (v->active_dp_ps > 1.0) {
1834 				v->active_dram_clock_change_latency_margin_c = v->active_dram_clock_change_latency_margin_c - (1.0 - 1.0 / (v->active_dp_ps - 1.0)) * v->swath_height_c[k] * (v->htotal[k] / v->pixel_clock[k]);
1835 			}
1836 			v->active_dram_clock_change_latency_margin[k] =dcn_bw_min2(v->active_dram_clock_change_latency_margin_y, v->active_dram_clock_change_latency_margin_c);
1837 		}
1838 		else {
1839 			v->active_dram_clock_change_latency_margin[k] = v->active_dram_clock_change_latency_margin_y;
1840 		}
1841 		if (v->output_format[k] == dcn_bw_444) {
1842 			v->writeback_dram_clock_change_latency_margin = (v->writeback_luma_buffer_size + v->writeback_chroma_buffer_size) * 1024.0 / (v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k]) * 4.0) - v->writeback_dram_clock_change_watermark;
1843 		}
1844 		else {
1845 			v->writeback_dram_clock_change_latency_margin =dcn_bw_min2(v->writeback_luma_buffer_size, 2.0 * v->writeback_chroma_buffer_size) * 1024.0 / (v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k])) - v->writeback_dram_clock_change_watermark;
1846 		}
1847 		if (v->output[k] == dcn_bw_writeback) {
1848 			v->active_dram_clock_change_latency_margin[k] =dcn_bw_min2(v->active_dram_clock_change_latency_margin[k], v->writeback_dram_clock_change_latency_margin);
1849 		}
1850 	}
1851 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1852 		if (v->allow_dram_clock_change_during_vblank[k] == dcn_bw_yes) {
1853 			v->v_blank_dram_clock_change_latency_margin[k] = (v->vtotal[k] - v->scaler_recout_height[k]) * (v->htotal[k] / v->pixel_clock[k]) -dcn_bw_max2(v->dram_clock_change_watermark, v->writeback_dram_clock_change_watermark);
1854 		}
1855 		else {
1856 			v->v_blank_dram_clock_change_latency_margin[k] = 0.0;
1857 		}
1858 	}
1859 	v->min_active_dram_clock_change_margin = 999999.0;
1860 	v->v_blank_of_min_active_dram_clock_change_margin = 999999.0;
1861 	v->second_min_active_dram_clock_change_margin = 999999.0;
1862 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1863 		if (v->active_dram_clock_change_latency_margin[k] < v->min_active_dram_clock_change_margin) {
1864 			v->second_min_active_dram_clock_change_margin = v->min_active_dram_clock_change_margin;
1865 			v->min_active_dram_clock_change_margin = v->active_dram_clock_change_latency_margin[k];
1866 			v->v_blank_of_min_active_dram_clock_change_margin = v->v_blank_dram_clock_change_latency_margin[k];
1867 		}
1868 		else if (v->active_dram_clock_change_latency_margin[k] < v->second_min_active_dram_clock_change_margin) {
1869 			v->second_min_active_dram_clock_change_margin = v->active_dram_clock_change_latency_margin[k];
1870 		}
1871 	}
1872 	v->min_vblank_dram_clock_change_margin = 999999.0;
1873 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1874 		if (v->min_vblank_dram_clock_change_margin > v->v_blank_dram_clock_change_latency_margin[k]) {
1875 			v->min_vblank_dram_clock_change_margin = v->v_blank_dram_clock_change_latency_margin[k];
1876 		}
1877 	}
1878 	if (v->synchronized_vblank == dcn_bw_yes || v->number_of_active_planes == 1) {
1879 		v->dram_clock_change_margin =dcn_bw_max2(v->min_active_dram_clock_change_margin, v->min_vblank_dram_clock_change_margin);
1880 	}
1881 	else if (v->v_blank_of_min_active_dram_clock_change_margin > v->min_active_dram_clock_change_margin) {
1882 		v->dram_clock_change_margin =dcn_bw_min2(v->second_min_active_dram_clock_change_margin, v->v_blank_of_min_active_dram_clock_change_margin);
1883 	}
1884 	else {
1885 		v->dram_clock_change_margin = v->min_active_dram_clock_change_margin;
1886 	}
1887 	if (v->min_active_dram_clock_change_margin > 0.0) {
1888 		v->dram_clock_change_support = dcn_bw_supported_in_v_active;
1889 	}
1890 	else if (v->dram_clock_change_margin > 0.0) {
1891 		v->dram_clock_change_support = dcn_bw_supported_in_v_blank;
1892 	}
1893 	else {
1894 		v->dram_clock_change_support = dcn_bw_not_supported;
1895 	}
1896 	/*maximum bandwidth used*/
1897 
1898 	v->wr_bandwidth = 0.0;
1899 	for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1900 		if (v->output[k] == dcn_bw_writeback && v->output_format[k] == dcn_bw_444) {
1901 			v->wr_bandwidth = v->wr_bandwidth + v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k]) * 4.0;
1902 		}
1903 		else if (v->output[k] == dcn_bw_writeback) {
1904 			v->wr_bandwidth = v->wr_bandwidth + v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k]) * 1.5;
1905 		}
1906 	}
1907 	v->max_used_bw = v->max_rd_bandwidth + v->wr_bandwidth;
1908 }
1909