linux/drivers/gpu/drm/amd/display/dc/calcs/dcn_calc_auto.c
<<
>>
Prefs
   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*/
  40void 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
 121void mode_support_and_system_configuration(struct dcn_bw_internal_vars *v)
 122{
 123        int i;
 124        int j;
 125        int k;
 126        /*mode support, voltage state and soc configuration*/
 127
 128        /*scale ratio support check*/
 129
 130        v->scale_ratio_support = dcn_bw_yes;
 131        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 132                if (v->h_ratio[k] > v->max_hscl_ratio || v->v_ratio[k] > v->max_vscl_ratio || v->h_ratio[k] > v->htaps[k] || v->v_ratio[k] > v->vtaps[k] || (v->source_pixel_format[k] != dcn_bw_rgb_sub_64 && v->source_pixel_format[k] != dcn_bw_rgb_sub_32 && v->source_pixel_format[k] != dcn_bw_rgb_sub_16 && (v->h_ratio[k] / 2.0 > v->hta_pschroma[k] || v->v_ratio[k] / 2.0 > v->vta_pschroma[k]))) {
 133                        v->scale_ratio_support = dcn_bw_no;
 134                }
 135        }
 136        /*source format, pixel format and scan support check*/
 137
 138        v->source_format_pixel_and_scan_support = dcn_bw_yes;
 139        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 140                if ((v->source_surface_mode[k] == dcn_bw_sw_linear && v->source_scan[k] != dcn_bw_hor) || ((v->source_surface_mode[k] == dcn_bw_sw_4_kb_d || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d_x || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_x || v->source_surface_mode[k] == dcn_bw_sw_var_d || v->source_surface_mode[k] == dcn_bw_sw_var_d_x) && v->source_pixel_format[k] != dcn_bw_rgb_sub_64)) {
 141                        v->source_format_pixel_and_scan_support = dcn_bw_no;
 142                }
 143        }
 144        /*bandwidth support check*/
 145
 146        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 147                if (v->source_scan[k] == dcn_bw_hor) {
 148                        v->swath_width_ysingle_dpp[k] = v->viewport_width[k];
 149                }
 150                else {
 151                        v->swath_width_ysingle_dpp[k] = v->viewport_height[k];
 152                }
 153                if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) {
 154                        v->byte_per_pixel_in_dety[k] = 8.0;
 155                        v->byte_per_pixel_in_detc[k] = 0.0;
 156                }
 157                else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_32) {
 158                        v->byte_per_pixel_in_dety[k] = 4.0;
 159                        v->byte_per_pixel_in_detc[k] = 0.0;
 160                }
 161                else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_16) {
 162                        v->byte_per_pixel_in_dety[k] = 2.0;
 163                        v->byte_per_pixel_in_detc[k] = 0.0;
 164                }
 165                else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8) {
 166                        v->byte_per_pixel_in_dety[k] = 1.0;
 167                        v->byte_per_pixel_in_detc[k] = 2.0;
 168                }
 169                else {
 170                        v->byte_per_pixel_in_dety[k] = 4.0f / 3.0f;
 171                        v->byte_per_pixel_in_detc[k] = 8.0f / 3.0f;
 172                }
 173        }
 174        v->total_read_bandwidth_consumed_gbyte_per_second = 0.0;
 175        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 176                v->read_bandwidth[k] = v->swath_width_ysingle_dpp[k] * (dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) * v->v_ratio[k] +dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 2.0 * v->v_ratio[k] / 2) / (v->htotal[k] / v->pixel_clock[k]);
 177                if (v->dcc_enable[k] == dcn_bw_yes) {
 178                        v->read_bandwidth[k] = v->read_bandwidth[k] * (1 + 1 / 256);
 179                }
 180                if (v->pte_enable == dcn_bw_yes && v->source_scan[k] != dcn_bw_hor && (v->source_surface_mode[k] == dcn_bw_sw_4_kb_s || v->source_surface_mode[k] == dcn_bw_sw_4_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d_x)) {
 181                        v->read_bandwidth[k] = v->read_bandwidth[k] * (1 + 1 / 64);
 182                }
 183                else if (v->pte_enable == dcn_bw_yes && v->source_scan[k] == dcn_bw_hor && (v->source_pixel_format[k] == dcn_bw_rgb_sub_64 || v->source_pixel_format[k] == dcn_bw_rgb_sub_32) && (v->source_surface_mode[k] == dcn_bw_sw_64_kb_s || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_x)) {
 184                        v->read_bandwidth[k] = v->read_bandwidth[k] * (1 + 1 / 256);
 185                }
 186                else if (v->pte_enable == dcn_bw_yes) {
 187                        v->read_bandwidth[k] = v->read_bandwidth[k] * (1 + 1 / 512);
 188                }
 189                v->total_read_bandwidth_consumed_gbyte_per_second = v->total_read_bandwidth_consumed_gbyte_per_second + v->read_bandwidth[k] / 1000.0;
 190        }
 191        v->total_write_bandwidth_consumed_gbyte_per_second = 0.0;
 192        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 193                if (v->output[k] == dcn_bw_writeback && v->output_format[k] == dcn_bw_444) {
 194                        v->write_bandwidth[k] = v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k]) * 4.0;
 195                }
 196                else if (v->output[k] == dcn_bw_writeback) {
 197                        v->write_bandwidth[k] = v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k]) * 1.5;
 198                }
 199                else {
 200                        v->write_bandwidth[k] = 0.0;
 201                }
 202                v->total_write_bandwidth_consumed_gbyte_per_second = v->total_write_bandwidth_consumed_gbyte_per_second + v->write_bandwidth[k] / 1000.0;
 203        }
 204        v->total_bandwidth_consumed_gbyte_per_second = v->total_read_bandwidth_consumed_gbyte_per_second + v->total_write_bandwidth_consumed_gbyte_per_second;
 205        v->dcc_enabled_in_any_plane = dcn_bw_no;
 206        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 207                if (v->dcc_enable[k] == dcn_bw_yes) {
 208                        v->dcc_enabled_in_any_plane = dcn_bw_yes;
 209                }
 210        }
 211        for (i = 0; i <= number_of_states_plus_one; i++) {
 212                v->return_bw_todcn_per_state =dcn_bw_min2(v->return_bus_width * v->dcfclk_per_state[i], v->fabric_and_dram_bandwidth_per_state[i] * 1000.0 * v->percent_of_ideal_drambw_received_after_urg_latency / 100.0);
 213                v->return_bw_per_state[i] = v->return_bw_todcn_per_state;
 214                if (v->dcc_enabled_in_any_plane == dcn_bw_yes && v->return_bw_todcn_per_state > v->dcfclk_per_state[i] * v->return_bus_width / 4.0) {
 215                        v->return_bw_per_state[i] =dcn_bw_min2(v->return_bw_per_state[i], v->return_bw_todcn_per_state * 4.0 * (1.0 - v->urgent_latency / ((v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 / (v->return_bw_todcn_per_state - v->dcfclk_per_state[i] * v->return_bus_width / 4.0) + v->urgent_latency)));
 216                }
 217                v->critical_point = 2.0 * v->return_bus_width * v->dcfclk_per_state[i] * v->urgent_latency / (v->return_bw_todcn_per_state * v->urgent_latency + (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0);
 218                if (v->dcc_enabled_in_any_plane == dcn_bw_yes && v->critical_point > 1.0 && v->critical_point < 4.0) {
 219                        v->return_bw_per_state[i] =dcn_bw_min2(v->return_bw_per_state[i], dcn_bw_pow(4.0 * v->return_bw_todcn_per_state * (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 * v->return_bus_width * v->dcfclk_per_state[i] * v->urgent_latency / (v->return_bw_todcn_per_state * v->urgent_latency + (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0), 2));
 220                }
 221                v->return_bw_todcn_per_state =dcn_bw_min2(v->return_bus_width * v->dcfclk_per_state[i], v->fabric_and_dram_bandwidth_per_state[i] * 1000.0);
 222                if (v->dcc_enabled_in_any_plane == dcn_bw_yes && v->return_bw_todcn_per_state > v->dcfclk_per_state[i] * v->return_bus_width / 4.0) {
 223                        v->return_bw_per_state[i] =dcn_bw_min2(v->return_bw_per_state[i], v->return_bw_todcn_per_state * 4.0 * (1.0 - v->urgent_latency / ((v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 / (v->return_bw_todcn_per_state - v->dcfclk_per_state[i] * v->return_bus_width / 4.0) + v->urgent_latency)));
 224                }
 225                v->critical_point = 2.0 * v->return_bus_width * v->dcfclk_per_state[i] * v->urgent_latency / (v->return_bw_todcn_per_state * v->urgent_latency + (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0);
 226                if (v->dcc_enabled_in_any_plane == dcn_bw_yes && v->critical_point > 1.0 && v->critical_point < 4.0) {
 227                        v->return_bw_per_state[i] =dcn_bw_min2(v->return_bw_per_state[i], dcn_bw_pow(4.0 * v->return_bw_todcn_per_state * (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 * v->return_bus_width * v->dcfclk_per_state[i] * v->urgent_latency / (v->return_bw_todcn_per_state * v->urgent_latency + (v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0), 2));
 228                }
 229        }
 230        for (i = 0; i <= number_of_states_plus_one; i++) {
 231                if ((v->total_read_bandwidth_consumed_gbyte_per_second * 1000.0 <= v->return_bw_per_state[i]) && (v->total_bandwidth_consumed_gbyte_per_second * 1000.0 <= v->fabric_and_dram_bandwidth_per_state[i] * 1000.0 * v->percent_of_ideal_drambw_received_after_urg_latency / 100.0)) {
 232                        v->bandwidth_support[i] = dcn_bw_yes;
 233                }
 234                else {
 235                        v->bandwidth_support[i] = dcn_bw_no;
 236                }
 237        }
 238        /*writeback latency support check*/
 239
 240        v->writeback_latency_support = dcn_bw_yes;
 241        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 242                if (v->output[k] == dcn_bw_writeback && v->output_format[k] == dcn_bw_444 && v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k]) * 4.0 > (v->writeback_luma_buffer_size + v->writeback_chroma_buffer_size) * 1024.0 / v->write_back_latency) {
 243                        v->writeback_latency_support = dcn_bw_no;
 244                }
 245                else if (v->output[k] == dcn_bw_writeback && v->scaler_rec_out_width[k] / (v->htotal[k] / v->pixel_clock[k]) >dcn_bw_min2(v->writeback_luma_buffer_size, 2.0 * v->writeback_chroma_buffer_size) * 1024.0 / v->write_back_latency) {
 246                        v->writeback_latency_support = dcn_bw_no;
 247                }
 248        }
 249        /*re-ordering buffer support check*/
 250
 251        for (i = 0; i <= number_of_states_plus_one; i++) {
 252                v->urgent_round_trip_and_out_of_order_latency_per_state[i] = (v->round_trip_ping_latency_cycles + 32.0) / v->dcfclk_per_state[i] + v->urgent_out_of_order_return_per_channel * v->number_of_channels / v->return_bw_per_state[i];
 253                if ((v->rob_buffer_size_in_kbyte - v->pixel_chunk_size_in_kbyte) * 1024.0 / v->return_bw_per_state[i] > v->urgent_round_trip_and_out_of_order_latency_per_state[i]) {
 254                        v->rob_support[i] = dcn_bw_yes;
 255                }
 256                else {
 257                        v->rob_support[i] = dcn_bw_no;
 258                }
 259        }
 260        /*display io support check*/
 261
 262        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 263                if (v->output[k] == dcn_bw_dp && v->dsc_capability == dcn_bw_yes) {
 264                        if (v->output_format[k] == dcn_bw_420) {
 265                                v->required_output_bw = v->pixel_clock[k] / 2.0;
 266                        }
 267                        else {
 268                                v->required_output_bw = v->pixel_clock[k];
 269                        }
 270                }
 271                else if (v->output_format[k] == dcn_bw_420) {
 272                        v->required_output_bw = v->pixel_clock[k] * 3.0 / 2.0;
 273                }
 274                else {
 275                        v->required_output_bw = v->pixel_clock[k] * 3.0;
 276                }
 277                if (v->output[k] == dcn_bw_hdmi) {
 278                        v->required_phyclk[k] = v->required_output_bw;
 279                        switch (v->output_deep_color[k]) {
 280                        case dcn_bw_encoder_10bpc:
 281                                v->required_phyclk[k] =  v->required_phyclk[k] * 5.0 / 4;
 282                        break;
 283                        case dcn_bw_encoder_12bpc:
 284                                v->required_phyclk[k] =  v->required_phyclk[k] * 3.0 / 2;
 285                                break;
 286                        default:
 287                                break;
 288                        }
 289                        v->required_phyclk[k] = v->required_phyclk[k] / 3.0;
 290                }
 291                else if (v->output[k] == dcn_bw_dp) {
 292                        v->required_phyclk[k] = v->required_output_bw / 4.0;
 293                }
 294                else {
 295                        v->required_phyclk[k] = 0.0;
 296                }
 297        }
 298        for (i = 0; i <= number_of_states_plus_one; i++) {
 299                v->dio_support[i] = dcn_bw_yes;
 300                for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 301                        if (v->required_phyclk[k] > v->phyclk_per_state[i] || (v->output[k] == dcn_bw_hdmi && v->required_phyclk[k] > 600.0)) {
 302                                v->dio_support[i] = dcn_bw_no;
 303                        }
 304                }
 305        }
 306        /*total available writeback support check*/
 307
 308        v->total_number_of_active_writeback = 0.0;
 309        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 310                if (v->output[k] == dcn_bw_writeback) {
 311                        v->total_number_of_active_writeback = v->total_number_of_active_writeback + 1.0;
 312                }
 313        }
 314        if (v->total_number_of_active_writeback <= v->max_num_writeback) {
 315                v->total_available_writeback_support = dcn_bw_yes;
 316        }
 317        else {
 318                v->total_available_writeback_support = dcn_bw_no;
 319        }
 320        /*maximum dispclk/dppclk support check*/
 321
 322        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 323                if (v->h_ratio[k] > 1.0) {
 324                        v->pscl_factor[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput * v->h_ratio[k] /dcn_bw_ceil2(v->htaps[k] / 6.0, 1.0));
 325                }
 326                else {
 327                        v->pscl_factor[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput);
 328                }
 329                if (v->byte_per_pixel_in_detc[k] == 0.0) {
 330                        v->pscl_factor_chroma[k] = 0.0;
 331                        v->min_dppclk_using_single_dpp[k] = v->pixel_clock[k] *dcn_bw_max3(v->vtaps[k] / 6.0 *dcn_bw_min2(1.0, v->h_ratio[k]), v->h_ratio[k] * v->v_ratio[k] / v->pscl_factor[k], 1.0);
 332                }
 333                else {
 334                        if (v->h_ratio[k] / 2.0 > 1.0) {
 335                                v->pscl_factor_chroma[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput * v->h_ratio[k] / 2.0 /dcn_bw_ceil2(v->hta_pschroma[k] / 6.0, 1.0));
 336                        }
 337                        else {
 338                                v->pscl_factor_chroma[k] =dcn_bw_min2(v->max_dchub_topscl_throughput, v->max_pscl_tolb_throughput);
 339                        }
 340                        v->min_dppclk_using_single_dpp[k] = v->pixel_clock[k] *dcn_bw_max5(v->vtaps[k] / 6.0 *dcn_bw_min2(1.0, v->h_ratio[k]), v->h_ratio[k] * v->v_ratio[k] / v->pscl_factor[k], v->vta_pschroma[k] / 6.0 *dcn_bw_min2(1.0, v->h_ratio[k] / 2.0), v->h_ratio[k] * v->v_ratio[k] / 4.0 / v->pscl_factor_chroma[k], 1.0);
 341                }
 342        }
 343        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 344                if ((v->source_pixel_format[k] == dcn_bw_rgb_sub_64 || v->source_pixel_format[k] == dcn_bw_rgb_sub_32 || v->source_pixel_format[k] == dcn_bw_rgb_sub_16)) {
 345                        if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
 346                                v->read256_block_height_y[k] = 1.0;
 347                        }
 348                        else if (v->source_pixel_format[k] == dcn_bw_rgb_sub_64) {
 349                                v->read256_block_height_y[k] = 4.0;
 350                        }
 351                        else {
 352                                v->read256_block_height_y[k] = 8.0;
 353                        }
 354                        v->read256_block_width_y[k] = 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / v->read256_block_height_y[k];
 355                        v->read256_block_height_c[k] = 0.0;
 356                        v->read256_block_width_c[k] = 0.0;
 357                }
 358                else {
 359                        if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
 360                                v->read256_block_height_y[k] = 1.0;
 361                                v->read256_block_height_c[k] = 1.0;
 362                        }
 363                        else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8) {
 364                                v->read256_block_height_y[k] = 16.0;
 365                                v->read256_block_height_c[k] = 8.0;
 366                        }
 367                        else {
 368                                v->read256_block_height_y[k] = 8.0;
 369                                v->read256_block_height_c[k] = 8.0;
 370                        }
 371                        v->read256_block_width_y[k] = 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / v->read256_block_height_y[k];
 372                        v->read256_block_width_c[k] = 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / v->read256_block_height_c[k];
 373                }
 374                if (v->source_scan[k] == dcn_bw_hor) {
 375                        v->max_swath_height_y[k] = v->read256_block_height_y[k];
 376                        v->max_swath_height_c[k] = v->read256_block_height_c[k];
 377                }
 378                else {
 379                        v->max_swath_height_y[k] = v->read256_block_width_y[k];
 380                        v->max_swath_height_c[k] = v->read256_block_width_c[k];
 381                }
 382                if ((v->source_pixel_format[k] == dcn_bw_rgb_sub_64 || v->source_pixel_format[k] == dcn_bw_rgb_sub_32 || v->source_pixel_format[k] == dcn_bw_rgb_sub_16)) {
 383                        if (v->source_surface_mode[k] == dcn_bw_sw_linear || (v->source_pixel_format[k] == dcn_bw_rgb_sub_64 && (v->source_surface_mode[k] == dcn_bw_sw_4_kb_s || v->source_surface_mode[k] == dcn_bw_sw_4_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_var_s || v->source_surface_mode[k] == dcn_bw_sw_var_s_x) && v->source_scan[k] == dcn_bw_hor)) {
 384                                v->min_swath_height_y[k] = v->max_swath_height_y[k];
 385                        }
 386                        else {
 387                                v->min_swath_height_y[k] = v->max_swath_height_y[k] / 2.0;
 388                        }
 389                        v->min_swath_height_c[k] = v->max_swath_height_c[k];
 390                }
 391                else {
 392                        if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
 393                                v->min_swath_height_y[k] = v->max_swath_height_y[k];
 394                                v->min_swath_height_c[k] = v->max_swath_height_c[k];
 395                        }
 396                        else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_8 && v->source_scan[k] == dcn_bw_hor) {
 397                                v->min_swath_height_y[k] = v->max_swath_height_y[k] / 2.0;
 398                                if (v->bug_forcing_luma_and_chroma_request_to_same_size_fixed == dcn_bw_yes) {
 399                                        v->min_swath_height_c[k] = v->max_swath_height_c[k];
 400                                }
 401                                else {
 402                                        v->min_swath_height_c[k] = v->max_swath_height_c[k] / 2.0;
 403                                }
 404                        }
 405                        else if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10 && v->source_scan[k] == dcn_bw_hor) {
 406                                v->min_swath_height_c[k] = v->max_swath_height_c[k] / 2.0;
 407                                if (v->bug_forcing_luma_and_chroma_request_to_same_size_fixed == dcn_bw_yes) {
 408                                        v->min_swath_height_y[k] = v->max_swath_height_y[k];
 409                                }
 410                                else {
 411                                        v->min_swath_height_y[k] = v->max_swath_height_y[k] / 2.0;
 412                                }
 413                        }
 414                        else {
 415                                v->min_swath_height_y[k] = v->max_swath_height_y[k];
 416                                v->min_swath_height_c[k] = v->max_swath_height_c[k];
 417                        }
 418                }
 419                if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
 420                        v->maximum_swath_width = 8192.0;
 421                }
 422                else {
 423                        v->maximum_swath_width = 5120.0;
 424                }
 425                v->number_of_dpp_required_for_det_size =dcn_bw_ceil2(v->swath_width_ysingle_dpp[k] /dcn_bw_min2(v->maximum_swath_width, v->det_buffer_size_in_kbyte * 1024.0 / 2.0 / (v->byte_per_pixel_in_dety[k] * v->min_swath_height_y[k] + v->byte_per_pixel_in_detc[k] / 2.0 * v->min_swath_height_c[k])), 1.0);
 426                if (v->byte_per_pixel_in_detc[k] == 0.0) {
 427                        v->number_of_dpp_required_for_lb_size =dcn_bw_ceil2((v->vtaps[k] +dcn_bw_max2(dcn_bw_ceil2(v->v_ratio[k], 1.0) - 2, 0.0)) * v->swath_width_ysingle_dpp[k] /dcn_bw_max2(v->h_ratio[k], 1.0) * v->lb_bit_per_pixel[k] / v->line_buffer_size, 1.0);
 428                }
 429                else {
 430                        v->number_of_dpp_required_for_lb_size =dcn_bw_max2(dcn_bw_ceil2((v->vtaps[k] +dcn_bw_max2(dcn_bw_ceil2(v->v_ratio[k], 1.0) - 2, 0.0)) * v->swath_width_ysingle_dpp[k] /dcn_bw_max2(v->h_ratio[k], 1.0) * v->lb_bit_per_pixel[k] / v->line_buffer_size, 1.0),dcn_bw_ceil2((v->vta_pschroma[k] +dcn_bw_max2(dcn_bw_ceil2(v->v_ratio[k] / 2.0, 1.0) - 2, 0.0)) * v->swath_width_ysingle_dpp[k] / 2.0 /dcn_bw_max2(v->h_ratio[k] / 2.0, 1.0) * v->lb_bit_per_pixel[k] / v->line_buffer_size, 1.0));
 431                }
 432                v->number_of_dpp_required_for_det_and_lb_size[k] =dcn_bw_max2(v->number_of_dpp_required_for_det_size, v->number_of_dpp_required_for_lb_size);
 433        }
 434        for (i = 0; i <= number_of_states_plus_one; i++) {
 435                for (j = 0; j <= 1; j++) {
 436                        v->total_number_of_active_dpp[i][j] = 0.0;
 437                        v->required_dispclk[i][j] = 0.0;
 438                        v->dispclk_dppclk_support[i][j] = dcn_bw_yes;
 439                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 440                                v->min_dispclk_using_single_dpp =dcn_bw_max2(v->pixel_clock[k], v->min_dppclk_using_single_dpp[k] * (j + 1)) * (1.0 + v->downspreading / 100.0);
 441                                if (v->odm_capability == dcn_bw_yes) {
 442                                        v->min_dispclk_using_dual_dpp =dcn_bw_max2(v->pixel_clock[k] / 2.0, v->min_dppclk_using_single_dpp[k] / 2.0 * (j + 1)) * (1.0 + v->downspreading / 100.0);
 443                                }
 444                                else {
 445                                        v->min_dispclk_using_dual_dpp =dcn_bw_max2(v->pixel_clock[k], v->min_dppclk_using_single_dpp[k] / 2.0 * (j + 1)) * (1.0 + v->downspreading / 100.0);
 446                                }
 447                                if (i < number_of_states) {
 448                                        v->min_dispclk_using_single_dpp = v->min_dispclk_using_single_dpp * (1.0 + v->dispclk_ramping_margin / 100.0);
 449                                        v->min_dispclk_using_dual_dpp = v->min_dispclk_using_dual_dpp * (1.0 + v->dispclk_ramping_margin / 100.0);
 450                                }
 451                                if (v->min_dispclk_using_single_dpp <=dcn_bw_min2(v->max_dispclk[i], (j + 1) * v->max_dppclk[i]) && v->number_of_dpp_required_for_det_and_lb_size[k] <= 1.0) {
 452                                        v->no_of_dpp[i][j][k] = 1.0;
 453                                        v->required_dispclk[i][j] =dcn_bw_max2(v->required_dispclk[i][j], v->min_dispclk_using_single_dpp);
 454                                }
 455                                else if (v->min_dispclk_using_dual_dpp <=dcn_bw_min2(v->max_dispclk[i], (j + 1) * v->max_dppclk[i])) {
 456                                        v->no_of_dpp[i][j][k] = 2.0;
 457                                        v->required_dispclk[i][j] =dcn_bw_max2(v->required_dispclk[i][j], v->min_dispclk_using_dual_dpp);
 458                                }
 459                                else {
 460                                        v->no_of_dpp[i][j][k] = 2.0;
 461                                        v->required_dispclk[i][j] =dcn_bw_max2(v->required_dispclk[i][j], v->min_dispclk_using_dual_dpp);
 462                                        v->dispclk_dppclk_support[i][j] = dcn_bw_no;
 463                                }
 464                                v->total_number_of_active_dpp[i][j] = v->total_number_of_active_dpp[i][j] + v->no_of_dpp[i][j][k];
 465                        }
 466                        if (v->total_number_of_active_dpp[i][j] > v->max_num_dpp) {
 467                                v->total_number_of_active_dpp[i][j] = 0.0;
 468                                v->required_dispclk[i][j] = 0.0;
 469                                v->dispclk_dppclk_support[i][j] = dcn_bw_yes;
 470                                for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 471                                        v->min_dispclk_using_single_dpp =dcn_bw_max2(v->pixel_clock[k], v->min_dppclk_using_single_dpp[k] * (j + 1)) * (1.0 + v->downspreading / 100.0);
 472                                        v->min_dispclk_using_dual_dpp =dcn_bw_max2(v->pixel_clock[k], v->min_dppclk_using_single_dpp[k] / 2.0 * (j + 1)) * (1.0 + v->downspreading / 100.0);
 473                                        if (i < number_of_states) {
 474                                                v->min_dispclk_using_single_dpp = v->min_dispclk_using_single_dpp * (1.0 + v->dispclk_ramping_margin / 100.0);
 475                                                v->min_dispclk_using_dual_dpp = v->min_dispclk_using_dual_dpp * (1.0 + v->dispclk_ramping_margin / 100.0);
 476                                        }
 477                                        if (v->number_of_dpp_required_for_det_and_lb_size[k] <= 1.0) {
 478                                                v->no_of_dpp[i][j][k] = 1.0;
 479                                                v->required_dispclk[i][j] =dcn_bw_max2(v->required_dispclk[i][j], v->min_dispclk_using_single_dpp);
 480                                                if (v->min_dispclk_using_single_dpp >dcn_bw_min2(v->max_dispclk[i], (j + 1) * v->max_dppclk[i])) {
 481                                                        v->dispclk_dppclk_support[i][j] = dcn_bw_no;
 482                                                }
 483                                        }
 484                                        else {
 485                                                v->no_of_dpp[i][j][k] = 2.0;
 486                                                v->required_dispclk[i][j] =dcn_bw_max2(v->required_dispclk[i][j], v->min_dispclk_using_dual_dpp);
 487                                                if (v->min_dispclk_using_dual_dpp >dcn_bw_min2(v->max_dispclk[i], (j + 1) * v->max_dppclk[i])) {
 488                                                        v->dispclk_dppclk_support[i][j] = dcn_bw_no;
 489                                                }
 490                                        }
 491                                        v->total_number_of_active_dpp[i][j] = v->total_number_of_active_dpp[i][j] + v->no_of_dpp[i][j][k];
 492                                }
 493                        }
 494                }
 495        }
 496        /*viewport size check*/
 497
 498        v->viewport_size_support = dcn_bw_yes;
 499        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 500                if (v->number_of_dpp_required_for_det_and_lb_size[k] > 2.0) {
 501                        v->viewport_size_support = dcn_bw_no;
 502                }
 503        }
 504        /*total available pipes support check*/
 505
 506        for (i = 0; i <= number_of_states_plus_one; i++) {
 507                for (j = 0; j <= 1; j++) {
 508                        if (v->total_number_of_active_dpp[i][j] <= v->max_num_dpp) {
 509                                v->total_available_pipes_support[i][j] = dcn_bw_yes;
 510                        }
 511                        else {
 512                                v->total_available_pipes_support[i][j] = dcn_bw_no;
 513                        }
 514                }
 515        }
 516        /*urgent latency support check*/
 517
 518        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 519                for (i = 0; i <= number_of_states_plus_one; i++) {
 520                        for (j = 0; j <= 1; j++) {
 521                                v->swath_width_yper_state[i][j][k] = v->swath_width_ysingle_dpp[k] / v->no_of_dpp[i][j][k];
 522                                v->swath_width_granularity_y = 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / v->max_swath_height_y[k];
 523                                v->rounded_up_max_swath_size_bytes_y = (dcn_bw_ceil2(v->swath_width_yper_state[i][j][k] - 1.0, v->swath_width_granularity_y) + v->swath_width_granularity_y) * v->byte_per_pixel_in_dety[k] * v->max_swath_height_y[k];
 524                                if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10) {
 525                                        v->rounded_up_max_swath_size_bytes_y =dcn_bw_ceil2(v->rounded_up_max_swath_size_bytes_y, 256.0) + 256;
 526                                }
 527                                if (v->max_swath_height_c[k] > 0.0) {
 528                                        v->swath_width_granularity_c = 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / v->max_swath_height_c[k];
 529                                }
 530                                v->rounded_up_max_swath_size_bytes_c = (dcn_bw_ceil2(v->swath_width_yper_state[i][j][k] / 2.0 - 1.0, v->swath_width_granularity_c) + v->swath_width_granularity_c) * v->byte_per_pixel_in_detc[k] * v->max_swath_height_c[k];
 531                                if (v->source_pixel_format[k] == dcn_bw_yuv420_sub_10) {
 532                                        v->rounded_up_max_swath_size_bytes_c =dcn_bw_ceil2(v->rounded_up_max_swath_size_bytes_c, 256.0) + 256;
 533                                }
 534                                if (v->rounded_up_max_swath_size_bytes_y + v->rounded_up_max_swath_size_bytes_c <= v->det_buffer_size_in_kbyte * 1024.0 / 2.0) {
 535                                        v->swath_height_yper_state[i][j][k] = v->max_swath_height_y[k];
 536                                        v->swath_height_cper_state[i][j][k] = v->max_swath_height_c[k];
 537                                }
 538                                else {
 539                                        v->swath_height_yper_state[i][j][k] = v->min_swath_height_y[k];
 540                                        v->swath_height_cper_state[i][j][k] = v->min_swath_height_c[k];
 541                                }
 542                                if (v->byte_per_pixel_in_detc[k] == 0.0) {
 543                                        v->lines_in_det_luma = v->det_buffer_size_in_kbyte * 1024.0 / v->byte_per_pixel_in_dety[k] / v->swath_width_yper_state[i][j][k];
 544                                        v->lines_in_det_chroma = 0.0;
 545                                }
 546                                else if (v->swath_height_yper_state[i][j][k] <= v->swath_height_cper_state[i][j][k]) {
 547                                        v->lines_in_det_luma = v->det_buffer_size_in_kbyte * 1024.0 / 2.0 / v->byte_per_pixel_in_dety[k] / v->swath_width_yper_state[i][j][k];
 548                                        v->lines_in_det_chroma = v->det_buffer_size_in_kbyte * 1024.0 / 2.0 / v->byte_per_pixel_in_detc[k] / (v->swath_width_yper_state[i][j][k] / 2.0);
 549                                }
 550                                else {
 551                                        v->lines_in_det_luma = v->det_buffer_size_in_kbyte * 1024.0 * 2.0 / 3.0 / v->byte_per_pixel_in_dety[k] / v->swath_width_yper_state[i][j][k];
 552                                        v->lines_in_det_chroma = v->det_buffer_size_in_kbyte * 1024.0 / 3.0 / v->byte_per_pixel_in_dety[k] / (v->swath_width_yper_state[i][j][k] / 2.0);
 553                                }
 554                                v->effective_lb_latency_hiding_source_lines_luma =dcn_bw_min2(v->max_line_buffer_lines,dcn_bw_floor2(v->line_buffer_size / v->lb_bit_per_pixel[k] / (v->swath_width_yper_state[i][j][k] /dcn_bw_max2(v->h_ratio[k], 1.0)), 1.0)) - (v->vtaps[k] - 1.0);
 555                                v->effective_lb_latency_hiding_source_lines_chroma =dcn_bw_min2(v->max_line_buffer_lines,dcn_bw_floor2(v->line_buffer_size / v->lb_bit_per_pixel[k] / (v->swath_width_yper_state[i][j][k] / 2.0 /dcn_bw_max2(v->h_ratio[k] / 2.0, 1.0)), 1.0)) - (v->vta_pschroma[k] - 1.0);
 556                                v->effective_detlb_lines_luma =dcn_bw_floor2(v->lines_in_det_luma +dcn_bw_min2(v->lines_in_det_luma * v->required_dispclk[i][j] * v->byte_per_pixel_in_dety[k] * v->pscl_factor[k] / v->return_bw_per_state[i], v->effective_lb_latency_hiding_source_lines_luma), v->swath_height_yper_state[i][j][k]);
 557                                v->effective_detlb_lines_chroma =dcn_bw_floor2(v->lines_in_det_chroma +dcn_bw_min2(v->lines_in_det_chroma * v->required_dispclk[i][j] * v->byte_per_pixel_in_detc[k] * v->pscl_factor_chroma[k] / v->return_bw_per_state[i], v->effective_lb_latency_hiding_source_lines_chroma), v->swath_height_cper_state[i][j][k]);
 558                                if (v->byte_per_pixel_in_detc[k] == 0.0) {
 559                                        v->urgent_latency_support_us_per_state[i][j][k] = v->effective_detlb_lines_luma * (v->htotal[k] / v->pixel_clock[k]) / v->v_ratio[k] - v->effective_detlb_lines_luma * v->swath_width_yper_state[i][j][k] *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / (v->return_bw_per_state[i] / v->no_of_dpp[i][j][k]);
 560                                }
 561                                else {
 562                                        v->urgent_latency_support_us_per_state[i][j][k] =dcn_bw_min2(v->effective_detlb_lines_luma * (v->htotal[k] / v->pixel_clock[k]) / v->v_ratio[k] - v->effective_detlb_lines_luma * v->swath_width_yper_state[i][j][k] *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / (v->return_bw_per_state[i] / v->no_of_dpp[i][j][k]), v->effective_detlb_lines_chroma * (v->htotal[k] / v->pixel_clock[k]) / (v->v_ratio[k] / 2.0) - v->effective_detlb_lines_chroma * v->swath_width_yper_state[i][j][k] / 2.0 *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / (v->return_bw_per_state[i] / v->no_of_dpp[i][j][k]));
 563                                }
 564                        }
 565                }
 566        }
 567        for (i = 0; i <= number_of_states_plus_one; i++) {
 568                for (j = 0; j <= 1; j++) {
 569                        v->urgent_latency_support[i][j] = dcn_bw_yes;
 570                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 571                                if (v->urgent_latency_support_us_per_state[i][j][k] < v->urgent_latency / 1.0) {
 572                                        v->urgent_latency_support[i][j] = dcn_bw_no;
 573                                }
 574                        }
 575                }
 576        }
 577        /*prefetch check*/
 578
 579        for (i = 0; i <= number_of_states_plus_one; i++) {
 580                for (j = 0; j <= 1; j++) {
 581                        v->total_number_of_dcc_active_dpp[i][j] = 0.0;
 582                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 583                                if (v->dcc_enable[k] == dcn_bw_yes) {
 584                                        v->total_number_of_dcc_active_dpp[i][j] = v->total_number_of_dcc_active_dpp[i][j] + v->no_of_dpp[i][j][k];
 585                                }
 586                        }
 587                }
 588        }
 589        for (i = 0; i <= number_of_states_plus_one; i++) {
 590                for (j = 0; j <= 1; j++) {
 591                        v->projected_dcfclk_deep_sleep = 8.0;
 592                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 593                                v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, v->pixel_clock[k] / 16.0);
 594                                if (v->byte_per_pixel_in_detc[k] == 0.0) {
 595                                        if (v->v_ratio[k] <= 1.0) {
 596                                                v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, 1.1 *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 64.0 * v->h_ratio[k] * v->pixel_clock[k] / v->no_of_dpp[i][j][k]);
 597                                        }
 598                                        else {
 599                                                v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, 1.1 *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 64.0 * v->pscl_factor[k] * v->required_dispclk[i][j] / (1 + j));
 600                                        }
 601                                }
 602                                else {
 603                                        if (v->v_ratio[k] <= 1.0) {
 604                                                v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, 1.1 *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 32.0 * v->h_ratio[k] * v->pixel_clock[k] / v->no_of_dpp[i][j][k]);
 605                                        }
 606                                        else {
 607                                                v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, 1.1 *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 32.0 * v->pscl_factor[k] * v->required_dispclk[i][j] / (1 + j));
 608                                        }
 609                                        if (v->v_ratio[k] / 2.0 <= 1.0) {
 610                                                v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, 1.1 *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 32.0 * v->h_ratio[k] / 2.0 * v->pixel_clock[k] / v->no_of_dpp[i][j][k]);
 611                                        }
 612                                        else {
 613                                                v->projected_dcfclk_deep_sleep =dcn_bw_max2(v->projected_dcfclk_deep_sleep, 1.1 *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 32.0 * v->pscl_factor_chroma[k] * v->required_dispclk[i][j] / (1 + j));
 614                                        }
 615                                }
 616                        }
 617                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 618                                if (v->dcc_enable[k] == dcn_bw_yes) {
 619                                        v->meta_req_height_y = 8.0 * v->read256_block_height_y[k];
 620                                        v->meta_req_width_y = 64.0 * 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / v->meta_req_height_y;
 621                                        v->meta_surface_width_y =dcn_bw_ceil2(v->viewport_width[k] / v->no_of_dpp[i][j][k] - 1.0, v->meta_req_width_y) + v->meta_req_width_y;
 622                                        v->meta_surface_height_y =dcn_bw_ceil2(v->viewport_height[k] - 1.0, v->meta_req_height_y) + v->meta_req_height_y;
 623                                        if (v->pte_enable == dcn_bw_yes) {
 624                                                v->meta_pte_bytes_per_frame_y = (dcn_bw_ceil2((v->meta_surface_width_y * v->meta_surface_height_y *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 256.0 - 4096.0) / 8.0 / 4096.0, 1.0) + 1) * 64.0;
 625                                        }
 626                                        else {
 627                                                v->meta_pte_bytes_per_frame_y = 0.0;
 628                                        }
 629                                        if (v->source_scan[k] == dcn_bw_hor) {
 630                                                v->meta_row_bytes_y = v->meta_surface_width_y * v->meta_req_height_y *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 256.0;
 631                                        }
 632                                        else {
 633                                                v->meta_row_bytes_y = v->meta_surface_height_y * v->meta_req_width_y *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / 256.0;
 634                                        }
 635                                }
 636                                else {
 637                                        v->meta_pte_bytes_per_frame_y = 0.0;
 638                                        v->meta_row_bytes_y = 0.0;
 639                                }
 640                                if (v->pte_enable == dcn_bw_yes) {
 641                                        if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
 642                                                v->macro_tile_block_size_bytes_y = 256.0;
 643                                                v->macro_tile_block_height_y = 1.0;
 644                                        }
 645                                        else if (v->source_surface_mode[k] == dcn_bw_sw_4_kb_s || v->source_surface_mode[k] == dcn_bw_sw_4_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d_x) {
 646                                                v->macro_tile_block_size_bytes_y = 4096.0;
 647                                                v->macro_tile_block_height_y = 4.0 * v->read256_block_height_y[k];
 648                                        }
 649                                        else if (v->source_surface_mode[k] == dcn_bw_sw_64_kb_s || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_x) {
 650                                                v->macro_tile_block_size_bytes_y = 64.0 * 1024;
 651                                                v->macro_tile_block_height_y = 16.0 * v->read256_block_height_y[k];
 652                                        }
 653                                        else {
 654                                                v->macro_tile_block_size_bytes_y = 256.0 * 1024;
 655                                                v->macro_tile_block_height_y = 32.0 * v->read256_block_height_y[k];
 656                                        }
 657                                        if (v->macro_tile_block_size_bytes_y <= 65536.0) {
 658                                                v->data_pte_req_height_y = v->macro_tile_block_height_y;
 659                                        }
 660                                        else {
 661                                                v->data_pte_req_height_y = 16.0 * v->read256_block_height_y[k];
 662                                        }
 663                                        v->data_pte_req_width_y = 4096.0 /dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) / v->data_pte_req_height_y * 8;
 664                                        if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
 665                                                v->dpte_bytes_per_row_y = 64.0 * (dcn_bw_ceil2((v->viewport_width[k] / v->no_of_dpp[i][j][k] *dcn_bw_min2(128.0, dcn_bw_pow(2.0,dcn_bw_floor2(dcn_bw_log(v->pte_buffer_size_in_requests * v->data_pte_req_width_y / (v->viewport_width[k] / v->no_of_dpp[i][j][k]), 2.0), 1.0))) - 1.0) / v->data_pte_req_width_y, 1.0) + 1);
 666                                        }
 667                                        else if (v->source_scan[k] == dcn_bw_hor) {
 668                                                v->dpte_bytes_per_row_y = 64.0 * (dcn_bw_ceil2((v->viewport_width[k] / v->no_of_dpp[i][j][k] - 1.0) / v->data_pte_req_width_y, 1.0) + 1);
 669                                        }
 670                                        else {
 671                                                v->dpte_bytes_per_row_y = 64.0 * (dcn_bw_ceil2((v->viewport_height[k] - 1.0) / v->data_pte_req_height_y, 1.0) + 1);
 672                                        }
 673                                }
 674                                else {
 675                                        v->dpte_bytes_per_row_y = 0.0;
 676                                }
 677                                if ((v->source_pixel_format[k] != dcn_bw_rgb_sub_64 && v->source_pixel_format[k] != dcn_bw_rgb_sub_32 && v->source_pixel_format[k] != dcn_bw_rgb_sub_16)) {
 678                                        if (v->dcc_enable[k] == dcn_bw_yes) {
 679                                                v->meta_req_height_c = 8.0 * v->read256_block_height_c[k];
 680                                                v->meta_req_width_c = 64.0 * 256.0 /dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / v->meta_req_height_c;
 681                                                v->meta_surface_width_c =dcn_bw_ceil2(v->viewport_width[k] / v->no_of_dpp[i][j][k] / 2.0 - 1.0, v->meta_req_width_c) + v->meta_req_width_c;
 682                                                v->meta_surface_height_c =dcn_bw_ceil2(v->viewport_height[k] / 2.0 - 1.0, v->meta_req_height_c) + v->meta_req_height_c;
 683                                                if (v->pte_enable == dcn_bw_yes) {
 684                                                        v->meta_pte_bytes_per_frame_c = (dcn_bw_ceil2((v->meta_surface_width_c * v->meta_surface_height_c *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 256.0 - 4096.0) / 8.0 / 4096.0, 1.0) + 1) * 64.0;
 685                                                }
 686                                                else {
 687                                                        v->meta_pte_bytes_per_frame_c = 0.0;
 688                                                }
 689                                                if (v->source_scan[k] == dcn_bw_hor) {
 690                                                        v->meta_row_bytes_c = v->meta_surface_width_c * v->meta_req_height_c *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 256.0;
 691                                                }
 692                                                else {
 693                                                        v->meta_row_bytes_c = v->meta_surface_height_c * v->meta_req_width_c *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 256.0;
 694                                                }
 695                                        }
 696                                        else {
 697                                                v->meta_pte_bytes_per_frame_c = 0.0;
 698                                                v->meta_row_bytes_c = 0.0;
 699                                        }
 700                                        if (v->pte_enable == dcn_bw_yes) {
 701                                                if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
 702                                                        v->macro_tile_block_size_bytes_c = 256.0;
 703                                                        v->macro_tile_block_height_c = 1.0;
 704                                                }
 705                                                else if (v->source_surface_mode[k] == dcn_bw_sw_4_kb_s || v->source_surface_mode[k] == dcn_bw_sw_4_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d || v->source_surface_mode[k] == dcn_bw_sw_4_kb_d_x) {
 706                                                        v->macro_tile_block_size_bytes_c = 4096.0;
 707                                                        v->macro_tile_block_height_c = 4.0 * v->read256_block_height_c[k];
 708                                                }
 709                                                else if (v->source_surface_mode[k] == dcn_bw_sw_64_kb_s || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_s_x || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_t || v->source_surface_mode[k] == dcn_bw_sw_64_kb_d_x) {
 710                                                        v->macro_tile_block_size_bytes_c = 64.0 * 1024;
 711                                                        v->macro_tile_block_height_c = 16.0 * v->read256_block_height_c[k];
 712                                                }
 713                                                else {
 714                                                        v->macro_tile_block_size_bytes_c = 256.0 * 1024;
 715                                                        v->macro_tile_block_height_c = 32.0 * v->read256_block_height_c[k];
 716                                                }
 717                                                v->macro_tile_block_width_c = v->macro_tile_block_size_bytes_c /dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / v->macro_tile_block_height_c;
 718                                                if (v->macro_tile_block_size_bytes_c <= 65536.0) {
 719                                                        v->data_pte_req_height_c = v->macro_tile_block_height_c;
 720                                                }
 721                                                else {
 722                                                        v->data_pte_req_height_c = 16.0 * v->read256_block_height_c[k];
 723                                                }
 724                                                v->data_pte_req_width_c = 4096.0 /dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / v->data_pte_req_height_c * 8;
 725                                                if (v->source_surface_mode[k] == dcn_bw_sw_linear) {
 726                                                        v->dpte_bytes_per_row_c = 64.0 * (dcn_bw_ceil2((v->viewport_width[k] / v->no_of_dpp[i][j][k] / 2.0 * dcn_bw_min2(128.0, dcn_bw_pow(2.0,dcn_bw_floor2(dcn_bw_log(v->pte_buffer_size_in_requests * v->data_pte_req_width_c / (v->viewport_width[k] / v->no_of_dpp[i][j][k] / 2.0), 2.0), 1.0))) - 1.0) / v->data_pte_req_width_c, 1.0) + 1);
 727                                                }
 728                                                else if (v->source_scan[k] == dcn_bw_hor) {
 729                                                        v->dpte_bytes_per_row_c = 64.0 * (dcn_bw_ceil2((v->viewport_width[k] / v->no_of_dpp[i][j][k] / 2.0 - 1.0) / v->data_pte_req_width_c, 1.0) + 1);
 730                                                }
 731                                                else {
 732                                                        v->dpte_bytes_per_row_c = 64.0 * (dcn_bw_ceil2((v->viewport_height[k] / 2.0 - 1.0) / v->data_pte_req_height_c, 1.0) + 1);
 733                                                }
 734                                        }
 735                                        else {
 736                                                v->dpte_bytes_per_row_c = 0.0;
 737                                        }
 738                                }
 739                                else {
 740                                        v->dpte_bytes_per_row_c = 0.0;
 741                                        v->meta_pte_bytes_per_frame_c = 0.0;
 742                                        v->meta_row_bytes_c = 0.0;
 743                                }
 744                                v->dpte_bytes_per_row[k] = v->dpte_bytes_per_row_y + v->dpte_bytes_per_row_c;
 745                                v->meta_pte_bytes_per_frame[k] = v->meta_pte_bytes_per_frame_y + v->meta_pte_bytes_per_frame_c;
 746                                v->meta_row_bytes[k] = v->meta_row_bytes_y + v->meta_row_bytes_c;
 747                                v->v_init_y = (v->v_ratio[k] + v->vtaps[k] + 1.0 + v->interlace_output[k] * 0.5 * v->v_ratio[k]) / 2.0;
 748                                v->prefill_y[k] =dcn_bw_floor2(v->v_init_y, 1.0);
 749                                v->max_num_sw_y[k] =dcn_bw_ceil2((v->prefill_y[k] - 1.0) / v->swath_height_yper_state[i][j][k], 1.0) + 1;
 750                                if (v->prefill_y[k] > 1.0) {
 751                                        v->max_partial_sw_y =dcn_bw_mod((v->prefill_y[k] - 2.0), v->swath_height_yper_state[i][j][k]);
 752                                }
 753                                else {
 754                                        v->max_partial_sw_y =dcn_bw_mod((v->prefill_y[k] + v->swath_height_yper_state[i][j][k] - 2.0), v->swath_height_yper_state[i][j][k]);
 755                                }
 756                                v->max_partial_sw_y =dcn_bw_max2(1.0, v->max_partial_sw_y);
 757                                v->prefetch_lines_y[k] = v->max_num_sw_y[k] * v->swath_height_yper_state[i][j][k] + v->max_partial_sw_y;
 758                                if ((v->source_pixel_format[k] != dcn_bw_rgb_sub_64 && v->source_pixel_format[k] != dcn_bw_rgb_sub_32 && v->source_pixel_format[k] != dcn_bw_rgb_sub_16)) {
 759                                        v->v_init_c = (v->v_ratio[k] / 2.0 + v->vtaps[k] + 1.0 + v->interlace_output[k] * 0.5 * v->v_ratio[k] / 2.0) / 2.0;
 760                                        v->prefill_c[k] =dcn_bw_floor2(v->v_init_c, 1.0);
 761                                        v->max_num_sw_c[k] =dcn_bw_ceil2((v->prefill_c[k] - 1.0) / v->swath_height_cper_state[i][j][k], 1.0) + 1;
 762                                        if (v->prefill_c[k] > 1.0) {
 763                                                v->max_partial_sw_c =dcn_bw_mod((v->prefill_c[k] - 2.0), v->swath_height_cper_state[i][j][k]);
 764                                        }
 765                                        else {
 766                                                v->max_partial_sw_c =dcn_bw_mod((v->prefill_c[k] + v->swath_height_cper_state[i][j][k] - 2.0), v->swath_height_cper_state[i][j][k]);
 767                                        }
 768                                        v->max_partial_sw_c =dcn_bw_max2(1.0, v->max_partial_sw_c);
 769                                        v->prefetch_lines_c[k] = v->max_num_sw_c[k] * v->swath_height_cper_state[i][j][k] + v->max_partial_sw_c;
 770                                }
 771                                else {
 772                                        v->prefetch_lines_c[k] = 0.0;
 773                                }
 774                                v->dst_x_after_scaler = 90.0 * v->pixel_clock[k] / (v->required_dispclk[i][j] / (j + 1)) + 42.0 * v->pixel_clock[k] / v->required_dispclk[i][j];
 775                                if (v->no_of_dpp[i][j][k] > 1.0) {
 776                                        v->dst_x_after_scaler = v->dst_x_after_scaler + v->scaler_rec_out_width[k] / 2.0;
 777                                }
 778                                if (v->output_format[k] == dcn_bw_420) {
 779                                        v->dst_y_after_scaler = 1.0;
 780                                }
 781                                else {
 782                                        v->dst_y_after_scaler = 0.0;
 783                                }
 784                                v->time_calc = 24.0 / v->projected_dcfclk_deep_sleep;
 785                                v->v_update_offset[k][j] = dcn_bw_ceil2(v->htotal[k] / 4.0, 1.0);
 786                                v->total_repeater_delay = v->max_inter_dcn_tile_repeaters * (2.0 / (v->required_dispclk[i][j] / (j + 1)) + 3.0 / v->required_dispclk[i][j]);
 787                                v->v_update_width[k][j] = (14.0 / v->projected_dcfclk_deep_sleep + 12.0 / (v->required_dispclk[i][j] / (j + 1)) + v->total_repeater_delay) * v->pixel_clock[k];
 788                                v->v_ready_offset[k][j] = dcn_bw_max2(150.0 / (v->required_dispclk[i][j] / (j + 1)), v->total_repeater_delay + 20.0 / v->projected_dcfclk_deep_sleep + 10.0 / (v->required_dispclk[i][j] / (j + 1))) * v->pixel_clock[k];
 789                                v->time_setup = (v->v_update_offset[k][j] + v->v_update_width[k][j] + v->v_ready_offset[k][j]) / v->pixel_clock[k];
 790                                v->extra_latency = v->urgent_round_trip_and_out_of_order_latency_per_state[i] + (v->total_number_of_active_dpp[i][j] * v->pixel_chunk_size_in_kbyte + v->total_number_of_dcc_active_dpp[i][j] * v->meta_chunk_size) * 1024.0 / v->return_bw_per_state[i];
 791                                if (v->pte_enable == dcn_bw_yes) {
 792                                        v->extra_latency = v->extra_latency + v->total_number_of_active_dpp[i][j] * v->pte_chunk_size * 1024.0 / v->return_bw_per_state[i];
 793                                }
 794                                if (v->can_vstartup_lines_exceed_vsync_plus_back_porch_lines_minus_one == dcn_bw_yes) {
 795                                        v->maximum_vstartup = v->vtotal[k] - v->vactive[k] - 1.0;
 796                                }
 797                                else {
 798                                        v->maximum_vstartup = v->v_sync_plus_back_porch[k] - 1.0;
 799                                }
 800
 801                                do {
 802                                        v->line_times_for_prefetch[k] = v->maximum_vstartup - v->urgent_latency / (v->htotal[k] / v->pixel_clock[k]) - (v->time_calc + v->time_setup) / (v->htotal[k] / v->pixel_clock[k]) - (v->dst_y_after_scaler + v->dst_x_after_scaler / v->htotal[k]);
 803                                        v->line_times_for_prefetch[k] =dcn_bw_floor2(4.0 * (v->line_times_for_prefetch[k] + 0.125), 1.0) / 4;
 804                                        v->prefetch_bw[k] = (v->meta_pte_bytes_per_frame[k] + 2.0 * v->meta_row_bytes[k] + 2.0 * v->dpte_bytes_per_row[k] + v->prefetch_lines_y[k] * v->swath_width_yper_state[i][j][k] *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) + v->prefetch_lines_c[k] * v->swath_width_yper_state[i][j][k] / 2.0 *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0)) / (v->line_times_for_prefetch[k] * v->htotal[k] / v->pixel_clock[k]);
 805
 806                                        if (v->pte_enable == dcn_bw_yes && v->dcc_enable[k] == dcn_bw_yes) {
 807                                                v->time_for_meta_pte_without_immediate_flip = dcn_bw_max3(
 808                                                                v->meta_pte_bytes_frame[k] / v->prefetch_bw[k],
 809                                                                v->extra_latency,
 810                                                                v->htotal[k] / v->pixel_clock[k] / 4.0);
 811                                        } else {
 812                                                v->time_for_meta_pte_without_immediate_flip = v->htotal[k] / v->pixel_clock[k] / 4.0;
 813                                        }
 814
 815                                        if (v->pte_enable == dcn_bw_yes || v->dcc_enable[k] == dcn_bw_yes) {
 816                                                v->time_for_meta_and_dpte_row_without_immediate_flip = dcn_bw_max3((
 817                                                                v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) / v->prefetch_bw[k],
 818                                                                v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_without_immediate_flip,
 819                                                                v->extra_latency);
 820                                        } else {
 821                                                v->time_for_meta_and_dpte_row_without_immediate_flip = dcn_bw_max2(
 822                                                                v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_without_immediate_flip,
 823                                                                v->extra_latency - v->time_for_meta_pte_with_immediate_flip);
 824                                        }
 825
 826                                        v->lines_for_meta_pte_without_immediate_flip[k] =dcn_bw_floor2(4.0 * (v->time_for_meta_pte_without_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
 827                                        v->lines_for_meta_and_dpte_row_without_immediate_flip[k] =dcn_bw_floor2(4.0 * (v->time_for_meta_and_dpte_row_without_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
 828                                        v->maximum_vstartup = v->maximum_vstartup - 1;
 829
 830                                        if (v->lines_for_meta_pte_without_immediate_flip[k] < 32.0 && v->lines_for_meta_and_dpte_row_without_immediate_flip[k] < 16.0)
 831                                                break;
 832
 833                                } while(1);
 834                        }
 835                        v->bw_available_for_immediate_flip = v->return_bw_per_state[i];
 836                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 837                                v->bw_available_for_immediate_flip = v->bw_available_for_immediate_flip -dcn_bw_max2(v->read_bandwidth[k], v->prefetch_bw[k]);
 838                        }
 839                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 840                                v->total_immediate_flip_bytes[k] = 0.0;
 841                                if ((v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
 842                                        v->total_immediate_flip_bytes[k] = v->total_immediate_flip_bytes[k] + v->meta_pte_bytes_per_frame[k] + v->meta_row_bytes[k] + v->dpte_bytes_per_row[k];
 843                                }
 844                        }
 845                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 846                                if (v->pte_enable == dcn_bw_yes && v->dcc_enable[k] == dcn_bw_yes) {
 847                                        v->time_for_meta_pte_with_immediate_flip =dcn_bw_max5(v->meta_pte_bytes_per_frame[k] / v->prefetch_bw[k], v->meta_pte_bytes_per_frame[k] * v->total_immediate_flip_bytes[k] / (v->bw_available_for_immediate_flip * (v->meta_pte_bytes_per_frame[k] + v->meta_row_bytes[k] + v->dpte_bytes_per_row[k])), v->extra_latency, v->urgent_latency, v->htotal[k] / v->pixel_clock[k] / 4.0);
 848                                }
 849                                else {
 850                                        v->time_for_meta_pte_with_immediate_flip = v->htotal[k] / v->pixel_clock[k] / 4.0;
 851                                }
 852                                if (v->pte_enable == dcn_bw_yes || v->dcc_enable[k] == dcn_bw_yes) {
 853                                        v->time_for_meta_and_dpte_row_with_immediate_flip =dcn_bw_max5((v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) / v->prefetch_bw[k], (v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) * v->total_immediate_flip_bytes[k] / (v->bw_available_for_immediate_flip * (v->meta_pte_bytes_per_frame[k] + v->meta_row_bytes[k] + v->dpte_bytes_per_row[k])), v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_with_immediate_flip, v->extra_latency, 2.0 * v->urgent_latency);
 854                                }
 855                                else {
 856                                        v->time_for_meta_and_dpte_row_with_immediate_flip =dcn_bw_max2(v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_with_immediate_flip, v->extra_latency - v->time_for_meta_pte_with_immediate_flip);
 857                                }
 858                                v->lines_for_meta_pte_with_immediate_flip[k] =dcn_bw_floor2(4.0 * (v->time_for_meta_pte_with_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
 859                                v->lines_for_meta_and_dpte_row_with_immediate_flip[k] =dcn_bw_floor2(4.0 * (v->time_for_meta_and_dpte_row_with_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
 860                                v->line_times_to_request_prefetch_pixel_data_with_immediate_flip = v->line_times_for_prefetch[k] - v->lines_for_meta_pte_with_immediate_flip[k] - v->lines_for_meta_and_dpte_row_with_immediate_flip[k];
 861                                v->line_times_to_request_prefetch_pixel_data_without_immediate_flip = v->line_times_for_prefetch[k] - v->lines_for_meta_pte_without_immediate_flip[k] - v->lines_for_meta_and_dpte_row_without_immediate_flip[k];
 862                                if (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip > 0.0) {
 863                                        v->v_ratio_pre_ywith_immediate_flip[i][j][k] = v->prefetch_lines_y[k] / v->line_times_to_request_prefetch_pixel_data_with_immediate_flip;
 864                                        if ((v->swath_height_yper_state[i][j][k] > 4.0)) {
 865                                                if (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0 > 0.0) {
 866                                                        v->v_ratio_pre_ywith_immediate_flip[i][j][k] =dcn_bw_max2(v->v_ratio_pre_ywith_immediate_flip[i][j][k], (v->max_num_sw_y[k] * v->swath_height_yper_state[i][j][k]) / (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0));
 867                                                }
 868                                                else {
 869                                                        v->v_ratio_pre_ywith_immediate_flip[i][j][k] = 999999.0;
 870                                                }
 871                                        }
 872                                        v->v_ratio_pre_cwith_immediate_flip[i][j][k] = v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_with_immediate_flip;
 873                                        if ((v->swath_height_cper_state[i][j][k] > 4.0)) {
 874                                                if (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0 > 0.0) {
 875                                                        v->v_ratio_pre_cwith_immediate_flip[i][j][k] =dcn_bw_max2(v->v_ratio_pre_cwith_immediate_flip[i][j][k], (v->max_num_sw_c[k] * v->swath_height_cper_state[i][j][k]) / (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0));
 876                                                }
 877                                                else {
 878                                                        v->v_ratio_pre_cwith_immediate_flip[i][j][k] = 999999.0;
 879                                                }
 880                                        }
 881                                        v->required_prefetch_pixel_data_bw_with_immediate_flip[i][j][k] = v->no_of_dpp[i][j][k] * (v->prefetch_lines_y[k] / v->line_times_to_request_prefetch_pixel_data_with_immediate_flip *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) + v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_with_immediate_flip *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 2.0) * v->swath_width_yper_state[i][j][k] / (v->htotal[k] / v->pixel_clock[k]);
 882                                }
 883                                else {
 884                                        v->v_ratio_pre_ywith_immediate_flip[i][j][k] = 999999.0;
 885                                        v->v_ratio_pre_cwith_immediate_flip[i][j][k] = 999999.0;
 886                                        v->required_prefetch_pixel_data_bw_with_immediate_flip[i][j][k] = 999999.0;
 887                                }
 888                                if (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip > 0.0) {
 889                                        v->v_ratio_pre_ywithout_immediate_flip[i][j][k] = v->prefetch_lines_y[k] / v->line_times_to_request_prefetch_pixel_data_without_immediate_flip;
 890                                        if ((v->swath_height_yper_state[i][j][k] > 4.0)) {
 891                                                if (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0 > 0.0) {
 892                                                        v->v_ratio_pre_ywithout_immediate_flip[i][j][k] =dcn_bw_max2(v->v_ratio_pre_ywithout_immediate_flip[i][j][k], (v->max_num_sw_y[k] * v->swath_height_yper_state[i][j][k]) / (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0));
 893                                                }
 894                                                else {
 895                                                        v->v_ratio_pre_ywithout_immediate_flip[i][j][k] = 999999.0;
 896                                                }
 897                                        }
 898                                        v->v_ratio_pre_cwithout_immediate_flip[i][j][k] = v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_without_immediate_flip;
 899                                        if ((v->swath_height_cper_state[i][j][k] > 4.0)) {
 900                                                if (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0 > 0.0) {
 901                                                        v->v_ratio_pre_cwithout_immediate_flip[i][j][k] =dcn_bw_max2(v->v_ratio_pre_cwithout_immediate_flip[i][j][k], (v->max_num_sw_c[k] * v->swath_height_cper_state[i][j][k]) / (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0));
 902                                                }
 903                                                else {
 904                                                        v->v_ratio_pre_cwithout_immediate_flip[i][j][k] = 999999.0;
 905                                                }
 906                                        }
 907                                        v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k] = v->no_of_dpp[i][j][k] * (v->prefetch_lines_y[k] / v->line_times_to_request_prefetch_pixel_data_without_immediate_flip *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) + v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_without_immediate_flip *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 2.0) * v->swath_width_yper_state[i][j][k] / (v->htotal[k] / v->pixel_clock[k]);
 908                                }
 909                                else {
 910                                        v->v_ratio_pre_ywithout_immediate_flip[i][j][k] = 999999.0;
 911                                        v->v_ratio_pre_cwithout_immediate_flip[i][j][k] = 999999.0;
 912                                        v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k] = 999999.0;
 913                                }
 914                        }
 915                        v->maximum_read_bandwidth_with_prefetch_with_immediate_flip = 0.0;
 916                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 917                                if ((v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
 918                                        v->maximum_read_bandwidth_with_prefetch_with_immediate_flip = v->maximum_read_bandwidth_with_prefetch_with_immediate_flip +dcn_bw_max2(v->read_bandwidth[k], v->required_prefetch_pixel_data_bw_with_immediate_flip[i][j][k]) +dcn_bw_max2(v->meta_pte_bytes_per_frame[k] / (v->lines_for_meta_pte_with_immediate_flip[k] * v->htotal[k] / v->pixel_clock[k]), (v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) / (v->lines_for_meta_and_dpte_row_with_immediate_flip[k] * v->htotal[k] / v->pixel_clock[k]));
 919                                }
 920                                else {
 921                                        v->maximum_read_bandwidth_with_prefetch_with_immediate_flip = v->maximum_read_bandwidth_with_prefetch_with_immediate_flip +dcn_bw_max2(v->read_bandwidth[k], v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k]);
 922                                }
 923                        }
 924                        v->maximum_read_bandwidth_with_prefetch_without_immediate_flip = 0.0;
 925                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 926                                v->maximum_read_bandwidth_with_prefetch_without_immediate_flip = v->maximum_read_bandwidth_with_prefetch_without_immediate_flip +dcn_bw_max2(v->read_bandwidth[k], v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k]);
 927                        }
 928                        v->prefetch_supported_with_immediate_flip[i][j] = dcn_bw_yes;
 929                        if (v->maximum_read_bandwidth_with_prefetch_with_immediate_flip > v->return_bw_per_state[i]) {
 930                                v->prefetch_supported_with_immediate_flip[i][j] = dcn_bw_no;
 931                        }
 932                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 933                                if (v->line_times_for_prefetch[k] < 2.0 || v->lines_for_meta_pte_with_immediate_flip[k] >= 8.0 || v->lines_for_meta_and_dpte_row_with_immediate_flip[k] >= 16.0) {
 934                                        v->prefetch_supported_with_immediate_flip[i][j] = dcn_bw_no;
 935                                }
 936                        }
 937                        v->prefetch_supported_without_immediate_flip[i][j] = dcn_bw_yes;
 938                        if (v->maximum_read_bandwidth_with_prefetch_without_immediate_flip > v->return_bw_per_state[i]) {
 939                                v->prefetch_supported_without_immediate_flip[i][j] = dcn_bw_no;
 940                        }
 941                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 942                                if (v->line_times_for_prefetch[k] < 2.0 || v->lines_for_meta_pte_without_immediate_flip[k] >= 8.0 || v->lines_for_meta_and_dpte_row_without_immediate_flip[k] >= 16.0) {
 943                                        v->prefetch_supported_without_immediate_flip[i][j] = dcn_bw_no;
 944                                }
 945                        }
 946                }
 947        }
 948        for (i = 0; i <= number_of_states_plus_one; i++) {
 949                for (j = 0; j <= 1; j++) {
 950                        v->v_ratio_in_prefetch_supported_with_immediate_flip[i][j] = dcn_bw_yes;
 951                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 952                                if ((((v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10) && (v->v_ratio_pre_ywith_immediate_flip[i][j][k] > 4.0 || v->v_ratio_pre_cwith_immediate_flip[i][j][k] > 4.0)) || ((v->source_pixel_format[k] == dcn_bw_yuv420_sub_8 || v->source_pixel_format[k] == dcn_bw_yuv420_sub_10) && (v->v_ratio_pre_ywithout_immediate_flip[i][j][k] > 4.0 || v->v_ratio_pre_cwithout_immediate_flip[i][j][k] > 4.0)))) {
 953                                        v->v_ratio_in_prefetch_supported_with_immediate_flip[i][j] = dcn_bw_no;
 954                                }
 955                        }
 956                        v->v_ratio_in_prefetch_supported_without_immediate_flip[i][j] = dcn_bw_yes;
 957                        for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 958                                if ((v->v_ratio_pre_ywithout_immediate_flip[i][j][k] > 4.0 || v->v_ratio_pre_cwithout_immediate_flip[i][j][k] > 4.0)) {
 959                                        v->v_ratio_in_prefetch_supported_without_immediate_flip[i][j] = dcn_bw_no;
 960                                }
 961                        }
 962                }
 963        }
 964        /*mode support, voltage state and soc configuration*/
 965
 966        for (i = number_of_states_plus_one; i >= 0; i--) {
 967                for (j = 0; j <= 1; j++) {
 968                        if (v->scale_ratio_support == dcn_bw_yes && v->source_format_pixel_and_scan_support == dcn_bw_yes && v->viewport_size_support == dcn_bw_yes && v->bandwidth_support[i] == dcn_bw_yes && v->dio_support[i] == dcn_bw_yes && v->urgent_latency_support[i][j] == dcn_bw_yes && v->rob_support[i] == dcn_bw_yes && v->dispclk_dppclk_support[i][j] == dcn_bw_yes && v->total_available_pipes_support[i][j] == dcn_bw_yes && v->total_available_writeback_support == dcn_bw_yes && v->writeback_latency_support == dcn_bw_yes) {
 969                                if (v->prefetch_supported_with_immediate_flip[i][j] == dcn_bw_yes && v->v_ratio_in_prefetch_supported_with_immediate_flip[i][j] == dcn_bw_yes) {
 970                                        v->mode_support_with_immediate_flip[i][j] = dcn_bw_yes;
 971                                }
 972                                else {
 973                                        v->mode_support_with_immediate_flip[i][j] = dcn_bw_no;
 974                                }
 975                                if (v->prefetch_supported_without_immediate_flip[i][j] == dcn_bw_yes && v->v_ratio_in_prefetch_supported_without_immediate_flip[i][j] == dcn_bw_yes) {
 976                                        v->mode_support_without_immediate_flip[i][j] = dcn_bw_yes;
 977                                }
 978                                else {
 979                                        v->mode_support_without_immediate_flip[i][j] = dcn_bw_no;
 980                                }
 981                        }
 982                        else {
 983                                v->mode_support_with_immediate_flip[i][j] = dcn_bw_no;
 984                                v->mode_support_without_immediate_flip[i][j] = dcn_bw_no;
 985                        }
 986                }
 987        }
 988        for (i = number_of_states_plus_one; i >= 0; i--) {
 989                if ((i == number_of_states_plus_one || v->mode_support_with_immediate_flip[i][1] == dcn_bw_yes || v->mode_support_with_immediate_flip[i][0] == dcn_bw_yes) && i >= v->voltage_override_level) {
 990                        v->voltage_level_with_immediate_flip = i;
 991                }
 992        }
 993        for (i = number_of_states_plus_one; i >= 0; i--) {
 994                if ((i == number_of_states_plus_one || v->mode_support_without_immediate_flip[i][1] == dcn_bw_yes || v->mode_support_without_immediate_flip[i][0] == dcn_bw_yes) && i >= v->voltage_override_level) {
 995                        v->voltage_level_without_immediate_flip = i;
 996                }
 997        }
 998        if (v->voltage_level_with_immediate_flip == number_of_states_plus_one) {
 999                v->immediate_flip_supported = dcn_bw_no;
1000                v->voltage_level = v->voltage_level_without_immediate_flip;
1001        }
1002        else {
1003                v->immediate_flip_supported = dcn_bw_yes;
1004                v->voltage_level = v->voltage_level_with_immediate_flip;
1005        }
1006        v->dcfclk = v->dcfclk_per_state[v->voltage_level];
1007        v->fabric_and_dram_bandwidth = v->fabric_and_dram_bandwidth_per_state[v->voltage_level];
1008        for (j = 0; j <= 1; j++) {
1009                v->required_dispclk_per_ratio[j] = v->required_dispclk[v->voltage_level][j];
1010                for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1011                        v->dpp_per_plane_per_ratio[j][k] = v->no_of_dpp[v->voltage_level][j][k];
1012                }
1013                v->dispclk_dppclk_support_per_ratio[j] = v->dispclk_dppclk_support[v->voltage_level][j];
1014        }
1015        v->max_phyclk = v->phyclk_per_state[v->voltage_level];
1016}
1017void 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}
1176void 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}
1934