root/drivers/gpu/drm/amd/display/dc/calcs/dcn_calc_auto.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. scaler_settings_calculation
  2. mode_support_and_system_configuration
  3. display_pipe_configuration
  4. dispclkdppclkdcfclk_deep_sleep_prefetch_parameters_watermarks_and_performance_calculation

   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_bandwidth[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_bandwidth[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] < 8.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 }

/* [<][>][^][v][top][bottom][index][help] */