]> Git Repo - linux.git/blob - drivers/gpu/drm/amd/display/dc/calcs/dcn_calc_auto.c
Merge remote-tracking branch 'spi/for-5.14' into spi-linus
[linux.git] / drivers / gpu / drm / amd / display / dc / calcs / dcn_calc_auto.c
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
801                                 do {
802                                         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]);
803                                         v->line_times_for_prefetch[k] =dcn_bw_floor2(4.0 * (v->line_times_for_prefetch[k] + 0.125), 1.0) / 4;
804                                         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]);
805
806                                         if (v->pte_enable == dcn_bw_yes && v->dcc_enable[k] == dcn_bw_yes) {
807                                                 v->time_for_meta_pte_without_immediate_flip = dcn_bw_max3(
808                                                                 v->meta_pte_bytes_frame[k] / v->prefetch_bw[k],
809                                                                 v->extra_latency,
810                                                                 v->htotal[k] / v->pixel_clock[k] / 4.0);
811                                         } else {
812                                                 v->time_for_meta_pte_without_immediate_flip = v->htotal[k] / v->pixel_clock[k] / 4.0;
813                                         }
814
815                                         if (v->pte_enable == dcn_bw_yes || v->dcc_enable[k] == dcn_bw_yes) {
816                                                 v->time_for_meta_and_dpte_row_without_immediate_flip = dcn_bw_max3((
817                                                                 v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) / v->prefetch_bw[k],
818                                                                 v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_without_immediate_flip,
819                                                                 v->extra_latency);
820                                         } else {
821                                                 v->time_for_meta_and_dpte_row_without_immediate_flip = dcn_bw_max2(
822                                                                 v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_without_immediate_flip,
823                                                                 v->extra_latency - v->time_for_meta_pte_with_immediate_flip);
824                                         }
825
826                                         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;
827                                         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;
828                                         v->maximum_vstartup = v->maximum_vstartup - 1;
829
830                                         if (v->lines_for_meta_pte_without_immediate_flip[k] < 32.0 && v->lines_for_meta_and_dpte_row_without_immediate_flip[k] < 16.0)
831                                                 break;
832
833                                 } while(1);
834                         }
835                         v->bw_available_for_immediate_flip = v->return_bw_per_state[i];
836                         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
837                                 v->bw_available_for_immediate_flip = v->bw_available_for_immediate_flip -dcn_bw_max2(v->read_bandwidth[k], v->prefetch_bw[k]);
838                         }
839                         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
840                                 v->total_immediate_flip_bytes[k] = 0.0;
841                                 if ((v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
842                                         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];
843                                 }
844                         }
845                         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
846                                 if (v->pte_enable == dcn_bw_yes && v->dcc_enable[k] == dcn_bw_yes) {
847                                         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);
848                                 }
849                                 else {
850                                         v->time_for_meta_pte_with_immediate_flip = v->htotal[k] / v->pixel_clock[k] / 4.0;
851                                 }
852                                 if (v->pte_enable == dcn_bw_yes || v->dcc_enable[k] == dcn_bw_yes) {
853                                         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);
854                                 }
855                                 else {
856                                         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);
857                                 }
858                                 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;
859                                 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;
860                                 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];
861                                 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];
862                                 if (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip > 0.0) {
863                                         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;
864                                         if ((v->swath_height_yper_state[i][j][k] > 4.0)) {
865                                                 if (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0 > 0.0) {
866                                                         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));
867                                                 }
868                                                 else {
869                                                         v->v_ratio_pre_ywith_immediate_flip[i][j][k] = 999999.0;
870                                                 }
871                                         }
872                                         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;
873                                         if ((v->swath_height_cper_state[i][j][k] > 4.0)) {
874                                                 if (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0 > 0.0) {
875                                                         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));
876                                                 }
877                                                 else {
878                                                         v->v_ratio_pre_cwith_immediate_flip[i][j][k] = 999999.0;
879                                                 }
880                                         }
881                                         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]);
882                                 }
883                                 else {
884                                         v->v_ratio_pre_ywith_immediate_flip[i][j][k] = 999999.0;
885                                         v->v_ratio_pre_cwith_immediate_flip[i][j][k] = 999999.0;
886                                         v->required_prefetch_pixel_data_bw_with_immediate_flip[i][j][k] = 999999.0;
887                                 }
888                                 if (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip > 0.0) {
889                                         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;
890                                         if ((v->swath_height_yper_state[i][j][k] > 4.0)) {
891                                                 if (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0 > 0.0) {
892                                                         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));
893                                                 }
894                                                 else {
895                                                         v->v_ratio_pre_ywithout_immediate_flip[i][j][k] = 999999.0;
896                                                 }
897                                         }
898                                         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;
899                                         if ((v->swath_height_cper_state[i][j][k] > 4.0)) {
900                                                 if (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0 > 0.0) {
901                                                         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));
902                                                 }
903                                                 else {
904                                                         v->v_ratio_pre_cwithout_immediate_flip[i][j][k] = 999999.0;
905                                                 }
906                                         }
907                                         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]);
908                                 }
909                                 else {
910                                         v->v_ratio_pre_ywithout_immediate_flip[i][j][k] = 999999.0;
911                                         v->v_ratio_pre_cwithout_immediate_flip[i][j][k] = 999999.0;
912                                         v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k] = 999999.0;
913                                 }
914                         }
915                         v->maximum_read_bandwidth_with_prefetch_with_immediate_flip = 0.0;
916                         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
917                                 if ((v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
918                                         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]));
919                                 }
920                                 else {
921                                         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]);
922                                 }
923                         }
924                         v->maximum_read_bandwidth_with_prefetch_without_immediate_flip = 0.0;
925                         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
926                                 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]);
927                         }
928                         v->prefetch_supported_with_immediate_flip[i][j] = dcn_bw_yes;
929                         if (v->maximum_read_bandwidth_with_prefetch_with_immediate_flip > v->return_bw_per_state[i]) {
930                                 v->prefetch_supported_with_immediate_flip[i][j] = dcn_bw_no;
931                         }
932                         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
933                                 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) {
934                                         v->prefetch_supported_with_immediate_flip[i][j] = dcn_bw_no;
935                                 }
936                         }
937                         v->prefetch_supported_without_immediate_flip[i][j] = dcn_bw_yes;
938                         if (v->maximum_read_bandwidth_with_prefetch_without_immediate_flip > v->return_bw_per_state[i]) {
939                                 v->prefetch_supported_without_immediate_flip[i][j] = dcn_bw_no;
940                         }
941                         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
942                                 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) {
943                                         v->prefetch_supported_without_immediate_flip[i][j] = dcn_bw_no;
944                                 }
945                         }
946                 }
947         }
948         for (i = 0; i <= number_of_states_plus_one; i++) {
949                 for (j = 0; j <= 1; j++) {
950                         v->v_ratio_in_prefetch_supported_with_immediate_flip[i][j] = dcn_bw_yes;
951                         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
952                                 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)))) {
953                                         v->v_ratio_in_prefetch_supported_with_immediate_flip[i][j] = dcn_bw_no;
954                                 }
955                         }
956                         v->v_ratio_in_prefetch_supported_without_immediate_flip[i][j] = dcn_bw_yes;
957                         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
958                                 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)) {
959                                         v->v_ratio_in_prefetch_supported_without_immediate_flip[i][j] = dcn_bw_no;
960                                 }
961                         }
962                 }
963         }
964         /*mode support, voltage state and soc configuration*/
965
966         for (i = number_of_states_plus_one; i >= 0; i--) {
967                 for (j = 0; j <= 1; j++) {
968                         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) {
969                                 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) {
970                                         v->mode_support_with_immediate_flip[i][j] = dcn_bw_yes;
971                                 }
972                                 else {
973                                         v->mode_support_with_immediate_flip[i][j] = dcn_bw_no;
974                                 }
975                                 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) {
976                                         v->mode_support_without_immediate_flip[i][j] = dcn_bw_yes;
977                                 }
978                                 else {
979                                         v->mode_support_without_immediate_flip[i][j] = dcn_bw_no;
980                                 }
981                         }
982                         else {
983                                 v->mode_support_with_immediate_flip[i][j] = dcn_bw_no;
984                                 v->mode_support_without_immediate_flip[i][j] = dcn_bw_no;
985                         }
986                 }
987         }
988         for (i = number_of_states_plus_one; i >= 0; i--) {
989                 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) {
990                         v->voltage_level_with_immediate_flip = i;
991                 }
992         }
993         for (i = number_of_states_plus_one; i >= 0; i--) {
994                 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) {
995                         v->voltage_level_without_immediate_flip = i;
996                 }
997         }
998         if (v->voltage_level_with_immediate_flip == number_of_states_plus_one) {
999                 v->immediate_flip_supported = dcn_bw_no;
1000                 v->voltage_level = v->voltage_level_without_immediate_flip;
1001         }
1002         else {
1003                 v->immediate_flip_supported = dcn_bw_yes;
1004                 v->voltage_level = v->voltage_level_with_immediate_flip;
1005         }
1006         v->dcfclk = v->dcfclk_per_state[v->voltage_level];
1007         v->fabric_and_dram_bandwidth = v->fabric_and_dram_bandwidth_per_state[v->voltage_level];
1008         for (j = 0; j <= 1; j++) {
1009                 v->required_dispclk_per_ratio[j] = v->required_dispclk[v->voltage_level][j];
1010                 for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1011                         v->dpp_per_plane_per_ratio[j][k] = v->no_of_dpp[v->voltage_level][j][k];
1012                 }
1013                 v->dispclk_dppclk_support_per_ratio[j] = v->dispclk_dppclk_support[v->voltage_level][j];
1014         }
1015         v->max_phyclk = v->phyclk_per_state[v->voltage_level];
1016 }
1017 void display_pipe_configuration(struct dcn_bw_internal_vars *v)
1018 {
1019         int j;
1020         int k;
1021         /*display pipe configuration*/
1022
1023         for (j = 0; j <= 1; j++) {
1024                 v->total_number_of_active_dpp_per_ratio[j] = 0.0;
1025                 for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1026                         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];
1027                 }
1028         }
1029         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]))))) {
1030                 v->dispclk_dppclk_ratio = 1;
1031                 v->final_error_message = v->error_message[0];
1032         }
1033         else {
1034                 v->dispclk_dppclk_ratio = 2;
1035                 v->final_error_message = v->error_message[1];
1036         }
1037         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1038                 v->dpp_per_plane[k] = v->dpp_per_plane_per_ratio[v->dispclk_dppclk_ratio - 1][k];
1039         }
1040         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1041                 if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) {
1042                         v->byte_per_pix_dety = 8.0;
1043                         v->byte_per_pix_detc = 0.0;
1044                 }
1045                 else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_32) {
1046                         v->byte_per_pix_dety = 4.0;
1047                         v->byte_per_pix_detc = 0.0;
1048                 }
1049                 else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_16) {
1050                         v->byte_per_pix_dety = 2.0;
1051                         v->byte_per_pix_detc = 0.0;
1052                 }
1053                 else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8) {
1054                         v->byte_per_pix_dety = 1.0;
1055                         v->byte_per_pix_detc = 2.0;
1056                 }
1057                 else {
1058                         v->byte_per_pix_dety = 4.0f / 3.0f;
1059                         v->byte_per_pix_detc = 8.0f / 3.0f;
1060                 }
1061                 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)) {
1062                         if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1063                                 v->read256_bytes_block_height_y = 1.0;
1064                         }
1065                         else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) {
1066                                 v->read256_bytes_block_height_y = 4.0;
1067                         }
1068                         else {
1069                                 v->read256_bytes_block_height_y = 8.0;
1070                         }
1071                         v->read256_bytes_block_width_y = 256.0 /dcn_bw_ceil2(v->byte_per_pix_dety, 1.0) / v->read256_bytes_block_height_y;
1072                         v->read256_bytes_block_height_c = 0.0;
1073                         v->read256_bytes_block_width_c = 0.0;
1074                 }
1075                 else {
1076                         if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1077                                 v->read256_bytes_block_height_y = 1.0;
1078                                 v->read256_bytes_block_height_c = 1.0;
1079                         }
1080                         else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8) {
1081                                 v->read256_bytes_block_height_y = 16.0;
1082                                 v->read256_bytes_block_height_c = 8.0;
1083                         }
1084                         else {
1085                                 v->read256_bytes_block_height_y = 8.0;
1086                                 v->read256_bytes_block_height_c = 8.0;
1087                         }
1088                         v->read256_bytes_block_width_y = 256.0 /dcn_bw_ceil2(v->byte_per_pix_dety, 1.0) / v->read256_bytes_block_height_y;
1089                         v->read256_bytes_block_width_c = 256.0 /dcn_bw_ceil2(v->byte_per_pix_detc, 2.0) / v->read256_bytes_block_height_c;
1090                 }
1091                 if (v->source_scan[k] == dcn_bw_hor) {
1092                         v->maximum_swath_height_y = v->read256_bytes_block_height_y;
1093                         v->maximum_swath_height_c = v->read256_bytes_block_height_c;
1094                 }
1095                 else {
1096                         v->maximum_swath_height_y = v->read256_bytes_block_width_y;
1097                         v->maximum_swath_height_c = v->read256_bytes_block_width_c;
1098                 }
1099                 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)) {
1100                         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)) {
1101                                 v->minimum_swath_height_y = v->maximum_swath_height_y;
1102                         }
1103                         else {
1104                                 v->minimum_swath_height_y = v->maximum_swath_height_y / 2.0;
1105                         }
1106                         v->minimum_swath_height_c = v->maximum_swath_height_c;
1107                 }
1108                 else {
1109                         if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1110                                 v->minimum_swath_height_y = v->maximum_swath_height_y;
1111                                 v->minimum_swath_height_c = v->maximum_swath_height_c;
1112                         }
1113                         else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8 && v->source_scan[k] == dcn_bw_hor) {
1114                                 v->minimum_swath_height_y = v->maximum_swath_height_y / 2.0;
1115                                 if (v->bug_forcing_luma_and_chroma_request_to_same_size_fixed == dcn_bw_yes) {
1116                                         v->minimum_swath_height_c = v->maximum_swath_height_c;
1117                                 }
1118                                 else {
1119                                         v->minimum_swath_height_c = v->maximum_swath_height_c / 2.0;
1120                                 }
1121                         }
1122                         else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10 && v->source_scan[k] == dcn_bw_hor) {
1123                                 v->minimum_swath_height_c = v->maximum_swath_height_c / 2.0;
1124                                 if (v->bug_forcing_luma_and_chroma_request_to_same_size_fixed == dcn_bw_yes) {
1125                                         v->minimum_swath_height_y = v->maximum_swath_height_y;
1126                                 }
1127                                 else {
1128                                         v->minimum_swath_height_y = v->maximum_swath_height_y / 2.0;
1129                                 }
1130                         }
1131                         else {
1132                                 v->minimum_swath_height_y = v->maximum_swath_height_y;
1133                                 v->minimum_swath_height_c = v->maximum_swath_height_c;
1134                         }
1135                 }
1136                 if (v->source_scan[k] == dcn_bw_hor) {
1137                         v->swath_width = v->viewport_width[k] / v->dpp_per_plane[k];
1138                 }
1139                 else {
1140                         v->swath_width = v->viewport_height[k] / v->dpp_per_plane[k];
1141                 }
1142                 v->swath_width_granularity_y = 256.0 /dcn_bw_ceil2(v->byte_per_pix_dety, 1.0) / v->maximum_swath_height_y;
1143                 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;
1144                 if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10) {
1145                         v->rounded_up_max_swath_size_bytes_y =dcn_bw_ceil2(v->rounded_up_max_swath_size_bytes_y, 256.0) + 256;
1146                 }
1147                 if (v->maximum_swath_height_c > 0.0) {
1148                         v->swath_width_granularity_c = 256.0 /dcn_bw_ceil2(v->byte_per_pix_detc, 2.0) / v->maximum_swath_height_c;
1149                 }
1150                 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;
1151                 if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10) {
1152                         v->rounded_up_max_swath_size_bytes_c =dcn_bw_ceil2(v->rounded_up_max_swath_size_bytes_c, 256.0) + 256;
1153                 }
1154                 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) {
1155                         v->swath_height_y[k] = v->maximum_swath_height_y;
1156                         v->swath_height_c[k] = v->maximum_swath_height_c;
1157                 }
1158                 else {
1159                         v->swath_height_y[k] = v->minimum_swath_height_y;
1160                         v->swath_height_c[k] = v->minimum_swath_height_c;
1161                 }
1162                 if (v->swath_height_c[k] == 0.0) {
1163                         v->det_buffer_size_y[k] = v->det_buffer_size_in_kbyte * 1024.0;
1164                         v->det_buffer_size_c[k] = 0.0;
1165                 }
1166                 else if (v->swath_height_y[k] <= v->swath_height_c[k]) {
1167                         v->det_buffer_size_y[k] = v->det_buffer_size_in_kbyte * 1024.0 / 2.0;
1168                         v->det_buffer_size_c[k] = v->det_buffer_size_in_kbyte * 1024.0 / 2.0;
1169                 }
1170                 else {
1171                         v->det_buffer_size_y[k] = v->det_buffer_size_in_kbyte * 1024.0 * 2.0 / 3.0;
1172                         v->det_buffer_size_c[k] = v->det_buffer_size_in_kbyte * 1024.0 / 3.0;
1173                 }
1174         }
1175 }
1176 void dispclkdppclkdcfclk_deep_sleep_prefetch_parameters_watermarks_and_performance_calculation(struct dcn_bw_internal_vars *v)
1177 {
1178         int k;
1179         /*dispclk and dppclk calculation*/
1180
1181         v->dispclk_with_ramping = 0.0;
1182         v->dispclk_without_ramping = 0.0;
1183         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1184                 if (v->h_ratio[k] > 1.0) {
1185                         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));
1186                 }
1187                 else {
1188                         v->pscl_throughput[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput);
1189                 }
1190                 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);
1191                 if ((v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
1192                         v->pscl_throughput_chroma[k] = 0.0;
1193                         v->dppclk_using_single_dpp = v->dppclk_using_single_dpp_luma;
1194                 }
1195                 else {
1196                         if (v->h_ratio[k] > 1.0) {
1197                                 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));
1198                         }
1199                         else {
1200                                 v->pscl_throughput_chroma[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput);
1201                         }
1202                         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);
1203                         v->dppclk_using_single_dpp =dcn_bw_max2(v->dppclk_using_single_dpp_luma, v->dppclk_using_single_dpp_chroma);
1204                 }
1205                 if (v->odm_capable == dcn_bw_yes) {
1206                         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));
1207                         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));
1208                 }
1209                 else {
1210                         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));
1211                         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));
1212                 }
1213         }
1214         if (v->dispclk_without_ramping > v->max_dispclk[number_of_states]) {
1215                 v->dispclk = v->dispclk_without_ramping;
1216         }
1217         else if (v->dispclk_with_ramping > v->max_dispclk[number_of_states]) {
1218                 v->dispclk = v->max_dispclk[number_of_states];
1219         }
1220         else {
1221                 v->dispclk = v->dispclk_with_ramping;
1222         }
1223         v->dppclk = v->dispclk / v->dispclk_dppclk_ratio;
1224         /*urgent watermark*/
1225
1226         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);
1227         v->dcc_enabled_any_plane = dcn_bw_no;
1228         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1229                 if (v->dcc_enable[k] == dcn_bw_yes) {
1230                         v->dcc_enabled_any_plane = dcn_bw_yes;
1231                 }
1232         }
1233         v->return_bw = v->return_bandwidth_to_dcn;
1234         if (v->dcc_enabled_any_plane == dcn_bw_yes && v->return_bandwidth_to_dcn > v->dcfclk * v->return_bus_width / 4.0) {
1235                 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)));
1236         }
1237         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);
1238         if (v->dcc_enabled_any_plane == dcn_bw_yes && v->critical_compression > 1.0 && v->critical_compression < 4.0) {
1239                 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));
1240         }
1241         v->return_bandwidth_to_dcn =dcn_bw_min2(v->return_bus_width * v->dcfclk, v->fabric_and_dram_bandwidth * 1000.0);
1242         if (v->dcc_enabled_any_plane == dcn_bw_yes && v->return_bandwidth_to_dcn > v->dcfclk * v->return_bus_width / 4.0) {
1243                 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)));
1244         }
1245         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);
1246         if (v->dcc_enabled_any_plane == dcn_bw_yes && v->critical_compression > 1.0 && v->critical_compression < 4.0) {
1247                 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));
1248         }
1249         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1250                 if (v->source_scan[k] == dcn_bw_hor) {
1251                         v->swath_width_y[k] = v->viewport_width[k] / v->dpp_per_plane[k];
1252                 }
1253                 else {
1254                         v->swath_width_y[k] = v->viewport_height[k] / v->dpp_per_plane[k];
1255                 }
1256         }
1257         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1258                 if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) {
1259                         v->byte_per_pixel_dety[k] = 8.0;
1260                         v->byte_per_pixel_detc[k] = 0.0;
1261                 }
1262                 else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_32) {
1263                         v->byte_per_pixel_dety[k] = 4.0;
1264                         v->byte_per_pixel_detc[k] = 0.0;
1265                 }
1266                 else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_16) {
1267                         v->byte_per_pixel_dety[k] = 2.0;
1268                         v->byte_per_pixel_detc[k] = 0.0;
1269                 }
1270                 else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8) {
1271                         v->byte_per_pixel_dety[k] = 1.0;
1272                         v->byte_per_pixel_detc[k] = 2.0;
1273                 }
1274                 else {
1275                         v->byte_per_pixel_dety[k] = 4.0f / 3.0f;
1276                         v->byte_per_pixel_detc[k] = 8.0f / 3.0f;
1277                 }
1278         }
1279         v->total_data_read_bandwidth = 0.0;
1280         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1281                 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];
1282                 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;
1283                 v->total_data_read_bandwidth = v->total_data_read_bandwidth + v->read_bandwidth_plane_luma[k] + v->read_bandwidth_plane_chroma[k];
1284         }
1285         v->total_active_dpp = 0.0;
1286         v->total_dcc_active_dpp = 0.0;
1287         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1288                 v->total_active_dpp = v->total_active_dpp + v->dpp_per_plane[k];
1289                 if (v->dcc_enable[k] == dcn_bw_yes) {
1290                         v->total_dcc_active_dpp = v->total_dcc_active_dpp + v->dpp_per_plane[k];
1291                 }
1292         }
1293         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;
1294         v->last_pixel_of_line_extra_watermark = 0.0;
1295         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1296                 if (v->v_ratio[k] <= 1.0) {
1297                         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];
1298                 }
1299                 else {
1300                         v->display_pipe_line_delivery_time_luma[k] = v->swath_width_y[k] / v->pscl_throughput[k] / v->dppclk;
1301                 }
1302                 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);
1303                 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]);
1304                 if (v->byte_per_pixel_detc[k] == 0.0) {
1305                         v->display_pipe_line_delivery_time_chroma[k] = 0.0;
1306                 }
1307                 else {
1308                         if (v->v_ratio[k] / 2.0 <= 1.0) {
1309                                 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];
1310                         }
1311                         else {
1312                                 v->display_pipe_line_delivery_time_chroma[k] = v->swath_width_y[k] / 2.0 / v->pscl_throughput_chroma[k] / v->dppclk;
1313                         }
1314                         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);
1315                         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]);
1316                 }
1317         }
1318         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;
1319         if (v->pte_enable == dcn_bw_yes) {
1320                 v->urgent_extra_latency = v->urgent_extra_latency + v->total_active_dpp * v->pte_chunk_size * 1024.0 / v->return_bw;
1321         }
1322         v->urgent_watermark = v->urgent_latency + v->last_pixel_of_line_extra_watermark + v->urgent_extra_latency;
1323         v->ptemeta_urgent_watermark = v->urgent_watermark + 2.0 * v->urgent_latency;
1324         /*nb p-state/dram clock change watermark*/
1325
1326         v->dram_clock_change_watermark = v->dram_clock_change_latency + v->urgent_watermark;
1327         v->total_active_writeback = 0.0;
1328         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1329                 if (v->output[k] == dcn_bw_writeback) {
1330                         v->total_active_writeback = v->total_active_writeback + 1.0;
1331                 }
1332         }
1333         if (v->total_active_writeback <= 1.0) {
1334                 v->writeback_dram_clock_change_watermark = v->dram_clock_change_latency + v->write_back_latency;
1335         }
1336         else {
1337                 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;
1338         }
1339         /*stutter efficiency*/
1340
1341         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1342                 v->lines_in_dety[k] = v->det_buffer_size_y[k] / v->byte_per_pixel_dety[k] / v->swath_width_y[k];
1343                 v->lines_in_dety_rounded_down_to_swath[k] =dcn_bw_floor2(v->lines_in_dety[k], v->swath_height_y[k]);
1344                 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];
1345                 if (v->byte_per_pixel_detc[k] > 0.0) {
1346                         v->lines_in_detc[k] = v->det_buffer_size_c[k] / v->byte_per_pixel_detc[k] / (v->swath_width_y[k] / 2.0);
1347                         v->lines_in_detc_rounded_down_to_swath[k] =dcn_bw_floor2(v->lines_in_detc[k], v->swath_height_c[k]);
1348                         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);
1349                 }
1350                 else {
1351                         v->lines_in_detc[k] = 0.0;
1352                         v->lines_in_detc_rounded_down_to_swath[k] = 0.0;
1353                         v->full_det_buffering_time_c[k] = 999999.0;
1354                 }
1355         }
1356         v->min_full_det_buffering_time = 999999.0;
1357         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1358                 if (v->full_det_buffering_time_y[k] < v->min_full_det_buffering_time) {
1359                         v->min_full_det_buffering_time = v->full_det_buffering_time_y[k];
1360                         v->frame_time_for_min_full_det_buffering_time = v->vtotal[k] * v->htotal[k] / v->pixel_clock[k];
1361                 }
1362                 if (v->full_det_buffering_time_c[k] < v->min_full_det_buffering_time) {
1363                         v->min_full_det_buffering_time = v->full_det_buffering_time_c[k];
1364                         v->frame_time_for_min_full_det_buffering_time = v->vtotal[k] * v->htotal[k] / v->pixel_clock[k];
1365                 }
1366         }
1367         v->average_read_bandwidth_gbyte_per_second = 0.0;
1368         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1369                 if (v->dcc_enable[k] == dcn_bw_yes) {
1370                         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;
1371                 }
1372                 else {
1373                         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;
1374                 }
1375                 if (v->dcc_enable[k] == dcn_bw_yes) {
1376                         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;
1377                 }
1378                 if (v->pte_enable == dcn_bw_yes) {
1379                         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;
1380                 }
1381         }
1382         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));
1383         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);
1384         if (v->total_active_writeback == 0.0) {
1385                 v->stutter_efficiency_not_including_vblank = (1.0 - (v->sr_exit_time + v->stutter_burst_time) / v->min_full_det_buffering_time) * 100.0;
1386         }
1387         else {
1388                 v->stutter_efficiency_not_including_vblank = 0.0;
1389         }
1390         v->smallest_vblank = 999999.0;
1391         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1392                 if (v->synchronized_vblank == dcn_bw_yes || v->number_of_active_planes == 1) {
1393                         v->v_blank_time = (v->vtotal[k] - v->vactive[k]) * v->htotal[k] / v->pixel_clock[k];
1394                 }
1395                 else {
1396                         v->v_blank_time = 0.0;
1397                 }
1398                 v->smallest_vblank =dcn_bw_min2(v->smallest_vblank, v->v_blank_time);
1399         }
1400         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;
1401         /*dcfclk deep sleep*/
1402
1403         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1404                 if (v->byte_per_pixel_detc[k] > 0.0) {
1405                         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]);
1406                 }
1407                 else {
1408                         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];
1409                 }
1410                 v->dcfclk_deep_sleep_per_plane[k] =dcn_bw_max2(v->dcfclk_deep_sleep_per_plane[k], v->pixel_clock[k] / 16.0);
1411         }
1412         v->dcf_clk_deep_sleep = 8.0;
1413         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1414                 v->dcf_clk_deep_sleep =dcn_bw_max2(v->dcf_clk_deep_sleep, v->dcfclk_deep_sleep_per_plane[k]);
1415         }
1416         /*stutter watermark*/
1417
1418         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;
1419         v->stutter_enter_plus_exit_watermark = v->sr_enter_plus_exit_time + v->last_pixel_of_line_extra_watermark + v->urgent_extra_latency;
1420         /*urgent latency supported*/
1421
1422         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1423                 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]);
1424                 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]);
1425                 if (v->byte_per_pixel_detc[k] > 0.0) {
1426                         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]);
1427                         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]);
1428                         v->urgent_latency_support_us[k] =dcn_bw_min2(v->urgent_latency_support_us_luma, v->urgent_latency_support_us_chroma);
1429                 }
1430                 else {
1431                         v->urgent_latency_support_us[k] = v->urgent_latency_support_us_luma;
1432                 }
1433         }
1434         v->min_urgent_latency_support_us = 999999.0;
1435         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1436                 v->min_urgent_latency_support_us =dcn_bw_min2(v->min_urgent_latency_support_us, v->urgent_latency_support_us[k]);
1437         }
1438         /*non-urgent latency tolerance*/
1439
1440         v->non_urgent_latency_tolerance = v->min_urgent_latency_support_us - v->urgent_watermark;
1441         /*prefetch*/
1442
1443         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1444                 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)) {
1445                         if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1446                                 v->block_height256_bytes_y = 1.0;
1447                         }
1448                         else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) {
1449                                 v->block_height256_bytes_y = 4.0;
1450                         }
1451                         else {
1452                                 v->block_height256_bytes_y = 8.0;
1453                         }
1454                         v->block_height256_bytes_c = 0.0;
1455                 }
1456                 else {
1457                         if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1458                                 v->block_height256_bytes_y = 1.0;
1459                                 v->block_height256_bytes_c = 1.0;
1460                         }
1461                         else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8) {
1462                                 v->block_height256_bytes_y = 16.0;
1463                                 v->block_height256_bytes_c = 8.0;
1464                         }
1465                         else {
1466                                 v->block_height256_bytes_y = 8.0;
1467                                 v->block_height256_bytes_c = 8.0;
1468                         }
1469                 }
1470                 if (v->dcc_enable[k] == dcn_bw_yes) {
1471                         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);
1472                         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;
1473                         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;
1474                         if (v->pte_enable == dcn_bw_yes) {
1475                                 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;
1476                         }
1477                         else {
1478                                 v->meta_pte_bytes_frame_y = 0.0;
1479                         }
1480                         if (v->source_scan[k] == dcn_bw_hor) {
1481                                 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;
1482                         }
1483                         else {
1484                                 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;
1485                         }
1486                 }
1487                 else {
1488                         v->meta_pte_bytes_frame_y = 0.0;
1489                         v->meta_row_byte_y = 0.0;
1490                 }
1491                 if (v->pte_enable == dcn_bw_yes) {
1492                         if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1493                                 v->macro_tile_size_byte_y = 256.0;
1494                                 v->macro_tile_height_y = 1.0;
1495                         }
1496                         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) {
1497                                 v->macro_tile_size_byte_y = 4096.0;
1498                                 v->macro_tile_height_y = 4.0 * v->block_height256_bytes_y;
1499                         }
1500                         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) {
1501                                 v->macro_tile_size_byte_y = 64.0 * 1024;
1502                                 v->macro_tile_height_y = 16.0 * v->block_height256_bytes_y;
1503                         }
1504                         else {
1505                                 v->macro_tile_size_byte_y = 256.0 * 1024;
1506                                 v->macro_tile_height_y = 32.0 * v->block_height256_bytes_y;
1507                         }
1508                         if (v->macro_tile_size_byte_y <= 65536.0) {
1509                                 v->pixel_pte_req_height_y = v->macro_tile_height_y;
1510                         }
1511                         else {
1512                                 v->pixel_pte_req_height_y = 16.0 * v->block_height256_bytes_y;
1513                         }
1514                         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;
1515                         if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1516                                 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);
1517                         }
1518                         else if (v->source_scan[k] == dcn_bw_hor) {
1519                                 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);
1520                         }
1521                         else {
1522                                 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);
1523                         }
1524                 }
1525                 else {
1526                         v->pixel_pte_bytes_per_row_y = 0.0;
1527                 }
1528                 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)) {
1529                         if (v->dcc_enable[k] == dcn_bw_yes) {
1530                                 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);
1531                                 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;
1532                                 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;
1533                                 if (v->pte_enable == dcn_bw_yes) {
1534                                         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;
1535                                 }
1536                                 else {
1537                                         v->meta_pte_bytes_frame_c = 0.0;
1538                                 }
1539                                 if (v->source_scan[k] == dcn_bw_hor) {
1540                                         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;
1541                                 }
1542                                 else {
1543                                         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;
1544                                 }
1545                         }
1546                         else {
1547                                 v->meta_pte_bytes_frame_c = 0.0;
1548                                 v->meta_row_byte_c = 0.0;
1549                         }
1550                         if (v->pte_enable == dcn_bw_yes) {
1551                                 if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1552                                         v->macro_tile_size_bytes_c = 256.0;
1553                                         v->macro_tile_height_c = 1.0;
1554                                 }
1555                                 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) {
1556                                         v->macro_tile_size_bytes_c = 4096.0;
1557                                         v->macro_tile_height_c = 4.0 * v->block_height256_bytes_c;
1558                                 }
1559                                 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) {
1560                                         v->macro_tile_size_bytes_c = 64.0 * 1024;
1561                                         v->macro_tile_height_c = 16.0 * v->block_height256_bytes_c;
1562                                 }
1563                                 else {
1564                                         v->macro_tile_size_bytes_c = 256.0 * 1024;
1565                                         v->macro_tile_height_c = 32.0 * v->block_height256_bytes_c;
1566                                 }
1567                                 if (v->macro_tile_size_bytes_c <= 65536.0) {
1568                                         v->pixel_pte_req_height_c = v->macro_tile_height_c;
1569                                 }
1570                                 else {
1571                                         v->pixel_pte_req_height_c = 16.0 * v->block_height256_bytes_c;
1572                                 }
1573                                 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;
1574                                 if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
1575                                         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);
1576                                 }
1577                                 else if (v->source_scan[k] == dcn_bw_hor) {
1578                                         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);
1579                                 }
1580                                 else {
1581                                         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);
1582                                 }
1583                         }
1584                         else {
1585                                 v->pixel_pte_bytes_per_row_c = 0.0;
1586                         }
1587                 }
1588                 else {
1589                         v->pixel_pte_bytes_per_row_c = 0.0;
1590                         v->meta_pte_bytes_frame_c = 0.0;
1591                         v->meta_row_byte_c = 0.0;
1592                 }
1593                 v->pixel_pte_bytes_per_row[k] = v->pixel_pte_bytes_per_row_y + v->pixel_pte_bytes_per_row_c;
1594                 v->meta_pte_bytes_frame[k] = v->meta_pte_bytes_frame_y + v->meta_pte_bytes_frame_c;
1595                 v->meta_row_byte[k] = v->meta_row_byte_y + v->meta_row_byte_c;
1596                 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);
1597                 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;
1598                 if (v->v_init_pre_fill_y[k] > 1.0) {
1599                         v->max_partial_swath_y =dcn_bw_mod((v->v_init_pre_fill_y[k] - 2.0), v->swath_height_y[k]);
1600                 }
1601                 else {
1602                         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]);
1603                 }
1604                 v->max_partial_swath_y =dcn_bw_max2(1.0, v->max_partial_swath_y);
1605                 v->prefetch_source_lines_y[k] = v->max_num_swath_y[k] * v->swath_height_y[k] + v->max_partial_swath_y;
1606                 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)) {
1607                         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);
1608                         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;
1609                         if (v->v_init_pre_fill_c[k] > 1.0) {
1610                                 v->max_partial_swath_c =dcn_bw_mod((v->v_init_pre_fill_c[k] - 2.0), v->swath_height_c[k]);
1611                         }
1612                         else {
1613                                 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]);
1614                         }
1615                         v->max_partial_swath_c =dcn_bw_max2(1.0, v->max_partial_swath_c);
1616                 }
1617                 else {
1618                         v->max_num_swath_c[k] = 0.0;
1619                         v->max_partial_swath_c = 0.0;
1620                 }
1621                 v->prefetch_source_lines_c[k] = v->max_num_swath_c[k] * v->swath_height_c[k] + v->max_partial_swath_c;
1622         }
1623         v->t_calc = 24.0 / v->dcf_clk_deep_sleep;
1624         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1625                 if (v->can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one == dcn_bw_yes) {
1626                         v->max_vstartup_lines[k] = v->vtotal[k] - v->vactive[k] - 1.0;
1627                 }
1628                 else {
1629                         v->max_vstartup_lines[k] = v->v_sync_plus_back_porch[k] - 1.0;
1630                 }
1631         }
1632         v->next_prefetch_mode = 0.0;
1633         do {
1634                 v->v_startup_lines = 13.0;
1635                 do {
1636                         v->planes_with_room_to_increase_vstartup_prefetch_bw_less_than_active_bw = dcn_bw_yes;
1637                         v->planes_with_room_to_increase_vstartup_vratio_prefetch_more_than4 = dcn_bw_no;
1638                         v->planes_with_room_to_increase_vstartup_destination_line_times_for_prefetch_less_than2 = dcn_bw_no;
1639                         v->v_ratio_prefetch_more_than4 = dcn_bw_no;
1640                         v->destination_line_times_for_prefetch_less_than2 = dcn_bw_no;
1641                         v->prefetch_mode = v->next_prefetch_mode;
1642                         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1643                                 v->dstx_after_scaler = 90.0 * v->pixel_clock[k] / v->dppclk + 42.0 * v->pixel_clock[k] / v->dispclk;
1644                                 if (v->dpp_per_plane[k] > 1.0) {
1645                                         v->dstx_after_scaler = v->dstx_after_scaler + v->scaler_rec_out_width[k] / 2.0;
1646                                 }
1647                                 if (v->output_format[k] == dcn_bw_420) {
1648                                         v->dsty_after_scaler = 1.0;
1649                                 }
1650                                 else {
1651                                         v->dsty_after_scaler = 0.0;
1652                                 }
1653                                 v->v_update_offset_pix[k] = dcn_bw_ceil2(v->htotal[k] / 4.0, 1.0);
1654                                 v->total_repeater_delay_time = v->max_inter_dcn_tile_repeaters * (2.0 / v->dppclk + 3.0 / v->dispclk);
1655                                 v->v_update_width_pix[k] = (14.0 / v->dcf_clk_deep_sleep + 12.0 / v->dppclk + v->total_repeater_delay_time) * v->pixel_clock[k];
1656                                 v->v_ready_offset_pix[k] = 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];
1657                                 v->t_setup = (v->v_update_offset_pix[k] + v->v_update_width_pix[k] + v->v_ready_offset_pix[k]) / v->pixel_clock[k];
1658                                 v->v_startup[k] =dcn_bw_min2(v->v_startup_lines, v->max_vstartup_lines[k]);
1659                                 if (v->prefetch_mode == 0.0) {
1660                                         v->t_wait =dcn_bw_max3(v->dram_clock_change_latency + v->urgent_latency, v->sr_enter_plus_exit_time, v->urgent_latency);
1661                                 }
1662                                 else if (v->prefetch_mode == 1.0) {
1663                                         v->t_wait =dcn_bw_max2(v->sr_enter_plus_exit_time, v->urgent_latency);
1664                                 }
1665                                 else {
1666                                         v->t_wait = v->urgent_latency;
1667                                 }
1668                                 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;
1669                                 if (v->destination_lines_for_prefetch[k] > 0.0) {
1670                                         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]);
1671                                 }
1672                                 else {
1673                                         v->prefetch_bandwidth[k] = 999999.0;
1674                                 }
1675                         }
1676                         v->bandwidth_available_for_immediate_flip = v->return_bw;
1677                         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1678                                 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]);
1679                         }
1680                         v->tot_immediate_flip_bytes = 0.0;
1681                         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1682                                 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)) {
1683                                         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];
1684                                 }
1685                         }
1686                         v->max_rd_bandwidth = 0.0;
1687                         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1688                                 if (v->pte_enable == dcn_bw_yes && v->dcc_enable[k] == dcn_bw_yes) {
1689                                         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)) {
1690                                                 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);
1691                                         }
1692                                         else {
1693                                                 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);
1694                                         }
1695                                 }
1696                                 else {
1697                                         v->time_for_fetching_meta_pte = v->htotal[k] / v->pixel_clock[k] / 4.0;
1698                                 }
1699                                 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;
1700                                 if ((v->pte_enable == dcn_bw_yes || v->dcc_enable[k] == dcn_bw_yes)) {
1701                                         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)) {
1702                                                 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);
1703                                         }
1704                                         else {
1705                                                 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);
1706                                         }
1707                                 }
1708                                 else {
1709                                         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);
1710                                 }
1711                                 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;
1712                                 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];
1713                                 if (v->lines_to_request_prefetch_pixel_data > 0.0) {
1714                                         v->v_ratio_prefetch_y[k] = v->prefetch_source_lines_y[k] / v->lines_to_request_prefetch_pixel_data;
1715                                         if ((v->swath_height_y[k] > 4.0)) {
1716                                                 if (v->lines_to_request_prefetch_pixel_data > (v->v_init_pre_fill_y[k] - 3.0) / 2.0) {
1717                                                         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));
1718                                                 }
1719                                                 else {
1720                                                         v->v_ratio_prefetch_y[k] = 999999.0;
1721                                                 }
1722                                         }
1723                                 }
1724                                 else {
1725                                         v->v_ratio_prefetch_y[k] = 999999.0;
1726                                 }
1727                                 v->v_ratio_prefetch_y[k] =dcn_bw_max2(v->v_ratio_prefetch_y[k], 1.0);
1728                                 if (v->lines_to_request_prefetch_pixel_data > 0.0) {
1729                                         v->v_ratio_prefetch_c[k] = v->prefetch_source_lines_c[k] / v->lines_to_request_prefetch_pixel_data;
1730                                         if ((v->swath_height_c[k] > 4.0)) {
1731                                                 if (v->lines_to_request_prefetch_pixel_data > (v->v_init_pre_fill_c[k] - 3.0) / 2.0) {
1732                                                         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));
1733                                                 }
1734                                                 else {
1735                                                         v->v_ratio_prefetch_c[k] = 999999.0;
1736                                                 }
1737                                         }
1738                                 }
1739                                 else {
1740                                         v->v_ratio_prefetch_c[k] = 999999.0;
1741                                 }
1742                                 v->v_ratio_prefetch_c[k] =dcn_bw_max2(v->v_ratio_prefetch_c[k], 1.0);
1743                                 if (v->lines_to_request_prefetch_pixel_data > 0.0) {
1744                                         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]);
1745                                 }
1746                                 else {
1747                                         v->required_prefetch_pix_data_bw = 999999.0;
1748                                 }
1749                                 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);
1750                                 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)) {
1751                                         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]));
1752                                 }
1753                                 if (v->v_ratio_prefetch_y[k] > 4.0 || v->v_ratio_prefetch_c[k] > 4.0) {
1754                                         v->v_ratio_prefetch_more_than4 = dcn_bw_yes;
1755                                 }
1756                                 if (v->destination_lines_for_prefetch[k] < 2.0) {
1757                                         v->destination_line_times_for_prefetch_less_than2 = dcn_bw_yes;
1758                                 }
1759                                 if (v->max_vstartup_lines[k] > v->v_startup_lines) {
1760                                         if (v->required_prefetch_pix_data_bw > (v->read_bandwidth_plane_luma[k] + v->read_bandwidth_plane_chroma[k])) {
1761                                                 v->planes_with_room_to_increase_vstartup_prefetch_bw_less_than_active_bw = dcn_bw_no;
1762                                         }
1763                                         if (v->v_ratio_prefetch_y[k] > 4.0 || v->v_ratio_prefetch_c[k] > 4.0) {
1764                                                 v->planes_with_room_to_increase_vstartup_vratio_prefetch_more_than4 = dcn_bw_yes;
1765                                         }
1766                                         if (v->destination_lines_for_prefetch[k] < 2.0) {
1767                                                 v->planes_with_room_to_increase_vstartup_destination_line_times_for_prefetch_less_than2 = dcn_bw_yes;
1768                                         }
1769                                 }
1770                         }
1771                         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) {
1772                                 v->prefetch_mode_supported = dcn_bw_yes;
1773                         }
1774                         else {
1775                                 v->prefetch_mode_supported = dcn_bw_no;
1776                         }
1777                         v->v_startup_lines = v->v_startup_lines + 1.0;
1778                 } 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)));
1779                 v->next_prefetch_mode = v->next_prefetch_mode + 1.0;
1780         } while (!(v->prefetch_mode_supported == dcn_bw_yes || v->prefetch_mode == 2.0));
1781         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1782                 if (v->v_ratio_prefetch_y[k] <= 1.0) {
1783                         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];
1784                 }
1785                 else {
1786                         v->display_pipe_line_delivery_time_luma_prefetch[k] = v->swath_width_y[k] / v->pscl_throughput[k] / v->dppclk;
1787                 }
1788                 if (v->byte_per_pixel_detc[k] == 0.0) {
1789                         v->display_pipe_line_delivery_time_chroma_prefetch[k] = 0.0;
1790                 }
1791                 else {
1792                         if (v->v_ratio_prefetch_c[k] <= 1.0) {
1793                                 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];
1794                         }
1795                         else {
1796                                 v->display_pipe_line_delivery_time_chroma_prefetch[k] = v->swath_width_y[k] / v->pscl_throughput[k] / v->dppclk;
1797                         }
1798                 }
1799         }
1800         /*min ttuv_blank*/
1801
1802         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1803                 if (v->prefetch_mode == 0.0) {
1804                         v->allow_dram_clock_change_during_vblank[k] = dcn_bw_yes;
1805                         v->allow_dram_self_refresh_during_vblank[k] = dcn_bw_yes;
1806                         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);
1807                 }
1808                 else if (v->prefetch_mode == 1.0) {
1809                         v->allow_dram_clock_change_during_vblank[k] = dcn_bw_no;
1810                         v->allow_dram_self_refresh_during_vblank[k] = dcn_bw_yes;
1811                         v->min_ttuv_blank[k] = v->t_calc +dcn_bw_max2(v->stutter_enter_plus_exit_watermark, v->urgent_watermark);
1812                 }
1813                 else {
1814                         v->allow_dram_clock_change_during_vblank[k] = dcn_bw_no;
1815                         v->allow_dram_self_refresh_during_vblank[k] = dcn_bw_no;
1816                         v->min_ttuv_blank[k] = v->t_calc + v->urgent_watermark;
1817                 }
1818         }
1819         /*nb p-state/dram clock change support*/
1820
1821         v->active_dp_ps = 0.0;
1822         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1823                 v->active_dp_ps = v->active_dp_ps + v->dpp_per_plane[k];
1824         }
1825         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1826                 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);
1827                 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);
1828                 v->effective_lb_latency_hiding_y = v->lb_latency_hiding_source_lines_y / v->v_ratio[k] * (v->htotal[k] / v->pixel_clock[k]);
1829                 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]);
1830                 if (v->swath_width_y[k] > 2.0 * v->dpp_output_buffer_pixels) {
1831                         v->dpp_output_buffer_lines_y = v->dpp_output_buffer_pixels / v->swath_width_y[k];
1832                 }
1833                 else if (v->swath_width_y[k] > v->dpp_output_buffer_pixels) {
1834                         v->dpp_output_buffer_lines_y = 0.5;
1835                 }
1836                 else {
1837                         v->dpp_output_buffer_lines_y = 1.0;
1838                 }
1839                 if (v->swath_width_y[k] / 2.0 > 2.0 * v->dpp_output_buffer_pixels) {
1840                         v->dpp_output_buffer_lines_c = v->dpp_output_buffer_pixels / (v->swath_width_y[k] / 2.0);
1841                 }
1842                 else if (v->swath_width_y[k] / 2.0 > v->dpp_output_buffer_pixels) {
1843                         v->dpp_output_buffer_lines_c = 0.5;
1844                 }
1845                 else {
1846                         v->dpp_output_buffer_lines_c = 1.0;
1847                 }
1848                 v->dppopp_buffering_y = (v->htotal[k] / v->pixel_clock[k]) * (v->dpp_output_buffer_lines_y + v->opp_output_buffer_lines);
1849                 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]);
1850                 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;
1851                 if (v->active_dp_ps > 1.0) {
1852                         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]);
1853                 }
1854                 if (v->byte_per_pixel_detc[k] > 0.0) {
1855                         v->dppopp_buffering_c = (v->htotal[k] / v->pixel_clock[k]) * (v->dpp_output_buffer_lines_c + v->opp_output_buffer_lines);
1856                         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]);
1857                         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;
1858                         if (v->active_dp_ps > 1.0) {
1859                                 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]);
1860                         }
1861                         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);
1862                 }
1863                 else {
1864                         v->active_dram_clock_change_latency_margin[k] = v->active_dram_clock_change_latency_margin_y;
1865                 }
1866                 if (v->output_format[k] == dcn_bw_444) {
1867                         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;
1868                 }
1869                 else {
1870                         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;
1871                 }
1872                 if (v->output[k] == dcn_bw_writeback) {
1873                         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);
1874                 }
1875         }
1876         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1877                 if (v->allow_dram_clock_change_during_vblank[k] == dcn_bw_yes) {
1878                         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);
1879                 }
1880                 else {
1881                         v->v_blank_dram_clock_change_latency_margin[k] = 0.0;
1882                 }
1883         }
1884         v->min_active_dram_clock_change_margin = 999999.0;
1885         v->v_blank_of_min_active_dram_clock_change_margin = 999999.0;
1886         v->second_min_active_dram_clock_change_margin = 999999.0;
1887         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1888                 if (v->active_dram_clock_change_latency_margin[k] < v->min_active_dram_clock_change_margin) {
1889                         v->second_min_active_dram_clock_change_margin = v->min_active_dram_clock_change_margin;
1890                         v->min_active_dram_clock_change_margin = v->active_dram_clock_change_latency_margin[k];
1891                         v->v_blank_of_min_active_dram_clock_change_margin = v->v_blank_dram_clock_change_latency_margin[k];
1892                 }
1893                 else if (v->active_dram_clock_change_latency_margin[k] < v->second_min_active_dram_clock_change_margin) {
1894                         v->second_min_active_dram_clock_change_margin = v->active_dram_clock_change_latency_margin[k];
1895                 }
1896         }
1897         v->min_vblank_dram_clock_change_margin = 999999.0;
1898         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1899                 if (v->min_vblank_dram_clock_change_margin > v->v_blank_dram_clock_change_latency_margin[k]) {
1900                         v->min_vblank_dram_clock_change_margin = v->v_blank_dram_clock_change_latency_margin[k];
1901                 }
1902         }
1903         if (v->synchronized_vblank == dcn_bw_yes || v->number_of_active_planes == 1) {
1904                 v->dram_clock_change_margin =dcn_bw_max2(v->min_active_dram_clock_change_margin, v->min_vblank_dram_clock_change_margin);
1905         }
1906         else if (v->v_blank_of_min_active_dram_clock_change_margin > v->min_active_dram_clock_change_margin) {
1907                 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);
1908         }
1909         else {
1910                 v->dram_clock_change_margin = v->min_active_dram_clock_change_margin;
1911         }
1912         if (v->min_active_dram_clock_change_margin > 0.0) {
1913                 v->dram_clock_change_support = dcn_bw_supported_in_v_active;
1914         }
1915         else if (v->dram_clock_change_margin > 0.0) {
1916                 v->dram_clock_change_support = dcn_bw_supported_in_v_blank;
1917         }
1918         else {
1919                 v->dram_clock_change_support = dcn_bw_not_supported;
1920         }
1921         /*maximum bandwidth used*/
1922
1923         v->wr_bandwidth = 0.0;
1924         for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1925                 if (v->output[k] == dcn_bw_writeback && v->output_format[k] == dcn_bw_444) {
1926                         v->wr_bandwidth = v->wr_bandwidth + v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k]) * 4.0;
1927                 }
1928                 else if (v->output[k] == dcn_bw_writeback) {
1929                         v->wr_bandwidth = v->wr_bandwidth + v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k]) * 1.5;
1930                 }
1931         }
1932         v->max_used_bw = v->max_rd_bandwidth + v->wr_bandwidth;
1933 }
This page took 0.179313 seconds and 4 git commands to generate.