Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.2.
   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_bandwidth[k],
 809								v->extra_latency,
 810								v->htotal[k] / v->pixel_clock[k] / 4.0);
 811					} else {
 812						v->time_for_meta_pte_without_immediate_flip = v->htotal[k] / v->pixel_clock[k] / 4.0;
 813					}
 814
 815					if (v->pte_enable == dcn_bw_yes || v->dcc_enable[k] == dcn_bw_yes) {
 816						v->time_for_meta_and_dpte_row_without_immediate_flip = dcn_bw_max3((
 817								v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) / v->prefetch_bandwidth[k],
 818								v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_without_immediate_flip,
 819								v->extra_latency);
 820					} else {
 821						v->time_for_meta_and_dpte_row_without_immediate_flip = dcn_bw_max2(
 822								v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_without_immediate_flip,
 823								v->extra_latency - v->time_for_meta_pte_with_immediate_flip);
 824					}
 825
 826					v->lines_for_meta_pte_without_immediate_flip[k] =dcn_bw_floor2(4.0 * (v->time_for_meta_pte_without_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
 827					v->lines_for_meta_and_dpte_row_without_immediate_flip[k] =dcn_bw_floor2(4.0 * (v->time_for_meta_and_dpte_row_without_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
 828					v->maximum_vstartup = v->maximum_vstartup - 1;
 829
 830					if (v->lines_for_meta_pte_without_immediate_flip[k] < 8.0 && v->lines_for_meta_and_dpte_row_without_immediate_flip[k] < 16.0)
 831						break;
 832
 833				} while(1);
 834			}
 835			v->bw_available_for_immediate_flip = v->return_bw_per_state[i];
 836			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 837				v->bw_available_for_immediate_flip = v->bw_available_for_immediate_flip -dcn_bw_max2(v->read_bandwidth[k], v->prefetch_bw[k]);
 838			}
 839			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 840				v->total_immediate_flip_bytes[k] = 0.0;
 841				if ((v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
 842					v->total_immediate_flip_bytes[k] = v->total_immediate_flip_bytes[k] + v->meta_pte_bytes_per_frame[k] + v->meta_row_bytes[k] + v->dpte_bytes_per_row[k];
 843				}
 844			}
 845			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 846				if (v->pte_enable == dcn_bw_yes && v->dcc_enable[k] == dcn_bw_yes) {
 847					v->time_for_meta_pte_with_immediate_flip =dcn_bw_max5(v->meta_pte_bytes_per_frame[k] / v->prefetch_bw[k], v->meta_pte_bytes_per_frame[k] * v->total_immediate_flip_bytes[k] / (v->bw_available_for_immediate_flip * (v->meta_pte_bytes_per_frame[k] + v->meta_row_bytes[k] + v->dpte_bytes_per_row[k])), v->extra_latency, v->urgent_latency, v->htotal[k] / v->pixel_clock[k] / 4.0);
 848				}
 849				else {
 850					v->time_for_meta_pte_with_immediate_flip = v->htotal[k] / v->pixel_clock[k] / 4.0;
 851				}
 852				if (v->pte_enable == dcn_bw_yes || v->dcc_enable[k] == dcn_bw_yes) {
 853					v->time_for_meta_and_dpte_row_with_immediate_flip =dcn_bw_max5((v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) / v->prefetch_bw[k], (v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) * v->total_immediate_flip_bytes[k] / (v->bw_available_for_immediate_flip * (v->meta_pte_bytes_per_frame[k] + v->meta_row_bytes[k] + v->dpte_bytes_per_row[k])), v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_with_immediate_flip, v->extra_latency, 2.0 * v->urgent_latency);
 854				}
 855				else {
 856					v->time_for_meta_and_dpte_row_with_immediate_flip =dcn_bw_max2(v->htotal[k] / v->pixel_clock[k] - v->time_for_meta_pte_with_immediate_flip, v->extra_latency - v->time_for_meta_pte_with_immediate_flip);
 857				}
 858				v->lines_for_meta_pte_with_immediate_flip[k] =dcn_bw_floor2(4.0 * (v->time_for_meta_pte_with_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
 859				v->lines_for_meta_and_dpte_row_with_immediate_flip[k] =dcn_bw_floor2(4.0 * (v->time_for_meta_and_dpte_row_with_immediate_flip / (v->htotal[k] / v->pixel_clock[k]) + 0.125), 1.0) / 4;
 860				v->line_times_to_request_prefetch_pixel_data_with_immediate_flip = v->line_times_for_prefetch[k] - v->lines_for_meta_pte_with_immediate_flip[k] - v->lines_for_meta_and_dpte_row_with_immediate_flip[k];
 861				v->line_times_to_request_prefetch_pixel_data_without_immediate_flip = v->line_times_for_prefetch[k] - v->lines_for_meta_pte_without_immediate_flip[k] - v->lines_for_meta_and_dpte_row_without_immediate_flip[k];
 862				if (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip > 0.0) {
 863					v->v_ratio_pre_ywith_immediate_flip[i][j][k] = v->prefetch_lines_y[k] / v->line_times_to_request_prefetch_pixel_data_with_immediate_flip;
 864					if ((v->swath_height_yper_state[i][j][k] > 4.0)) {
 865						if (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0 > 0.0) {
 866							v->v_ratio_pre_ywith_immediate_flip[i][j][k] =dcn_bw_max2(v->v_ratio_pre_ywith_immediate_flip[i][j][k], (v->max_num_sw_y[k] * v->swath_height_yper_state[i][j][k]) / (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0));
 867						}
 868						else {
 869							v->v_ratio_pre_ywith_immediate_flip[i][j][k] = 999999.0;
 870						}
 871					}
 872					v->v_ratio_pre_cwith_immediate_flip[i][j][k] = v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_with_immediate_flip;
 873					if ((v->swath_height_cper_state[i][j][k] > 4.0)) {
 874						if (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0 > 0.0) {
 875							v->v_ratio_pre_cwith_immediate_flip[i][j][k] =dcn_bw_max2(v->v_ratio_pre_cwith_immediate_flip[i][j][k], (v->max_num_sw_c[k] * v->swath_height_cper_state[i][j][k]) / (v->line_times_to_request_prefetch_pixel_data_with_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0));
 876						}
 877						else {
 878							v->v_ratio_pre_cwith_immediate_flip[i][j][k] = 999999.0;
 879						}
 880					}
 881					v->required_prefetch_pixel_data_bw_with_immediate_flip[i][j][k] = v->no_of_dpp[i][j][k] * (v->prefetch_lines_y[k] / v->line_times_to_request_prefetch_pixel_data_with_immediate_flip *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) + v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_with_immediate_flip *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 2.0) * v->swath_width_yper_state[i][j][k] / (v->htotal[k] / v->pixel_clock[k]);
 882				}
 883				else {
 884					v->v_ratio_pre_ywith_immediate_flip[i][j][k] = 999999.0;
 885					v->v_ratio_pre_cwith_immediate_flip[i][j][k] = 999999.0;
 886					v->required_prefetch_pixel_data_bw_with_immediate_flip[i][j][k] = 999999.0;
 887				}
 888				if (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip > 0.0) {
 889					v->v_ratio_pre_ywithout_immediate_flip[i][j][k] = v->prefetch_lines_y[k] / v->line_times_to_request_prefetch_pixel_data_without_immediate_flip;
 890					if ((v->swath_height_yper_state[i][j][k] > 4.0)) {
 891						if (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0 > 0.0) {
 892							v->v_ratio_pre_ywithout_immediate_flip[i][j][k] =dcn_bw_max2(v->v_ratio_pre_ywithout_immediate_flip[i][j][k], (v->max_num_sw_y[k] * v->swath_height_yper_state[i][j][k]) / (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_y[k] - 3.0) / 2.0));
 893						}
 894						else {
 895							v->v_ratio_pre_ywithout_immediate_flip[i][j][k] = 999999.0;
 896						}
 897					}
 898					v->v_ratio_pre_cwithout_immediate_flip[i][j][k] = v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_without_immediate_flip;
 899					if ((v->swath_height_cper_state[i][j][k] > 4.0)) {
 900						if (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0 > 0.0) {
 901							v->v_ratio_pre_cwithout_immediate_flip[i][j][k] =dcn_bw_max2(v->v_ratio_pre_cwithout_immediate_flip[i][j][k], (v->max_num_sw_c[k] * v->swath_height_cper_state[i][j][k]) / (v->line_times_to_request_prefetch_pixel_data_without_immediate_flip - (v->prefill_c[k] - 3.0) / 2.0));
 902						}
 903						else {
 904							v->v_ratio_pre_cwithout_immediate_flip[i][j][k] = 999999.0;
 905						}
 906					}
 907					v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k] = v->no_of_dpp[i][j][k] * (v->prefetch_lines_y[k] / v->line_times_to_request_prefetch_pixel_data_without_immediate_flip *dcn_bw_ceil2(v->byte_per_pixel_in_dety[k], 1.0) + v->prefetch_lines_c[k] / v->line_times_to_request_prefetch_pixel_data_without_immediate_flip *dcn_bw_ceil2(v->byte_per_pixel_in_detc[k], 2.0) / 2.0) * v->swath_width_yper_state[i][j][k] / (v->htotal[k] / v->pixel_clock[k]);
 908				}
 909				else {
 910					v->v_ratio_pre_ywithout_immediate_flip[i][j][k] = 999999.0;
 911					v->v_ratio_pre_cwithout_immediate_flip[i][j][k] = 999999.0;
 912					v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k] = 999999.0;
 913				}
 914			}
 915			v->maximum_read_bandwidth_with_prefetch_with_immediate_flip = 0.0;
 916			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 917				if ((v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10)) {
 918					v->maximum_read_bandwidth_with_prefetch_with_immediate_flip = v->maximum_read_bandwidth_with_prefetch_with_immediate_flip +dcn_bw_max2(v->read_bandwidth[k], v->required_prefetch_pixel_data_bw_with_immediate_flip[i][j][k]) +dcn_bw_max2(v->meta_pte_bytes_per_frame[k] / (v->lines_for_meta_pte_with_immediate_flip[k] * v->htotal[k] / v->pixel_clock[k]), (v->meta_row_bytes[k] + v->dpte_bytes_per_row[k]) / (v->lines_for_meta_and_dpte_row_with_immediate_flip[k] * v->htotal[k] / v->pixel_clock[k]));
 919				}
 920				else {
 921					v->maximum_read_bandwidth_with_prefetch_with_immediate_flip = v->maximum_read_bandwidth_with_prefetch_with_immediate_flip +dcn_bw_max2(v->read_bandwidth[k], v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k]);
 922				}
 923			}
 924			v->maximum_read_bandwidth_with_prefetch_without_immediate_flip = 0.0;
 925			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 926				v->maximum_read_bandwidth_with_prefetch_without_immediate_flip = v->maximum_read_bandwidth_with_prefetch_without_immediate_flip +dcn_bw_max2(v->read_bandwidth[k], v->required_prefetch_pixel_data_bw_without_immediate_flip[i][j][k]);
 927			}
 928			v->prefetch_supported_with_immediate_flip[i][j] = dcn_bw_yes;
 929			if (v->maximum_read_bandwidth_with_prefetch_with_immediate_flip > v->return_bw_per_state[i]) {
 930				v->prefetch_supported_with_immediate_flip[i][j] = dcn_bw_no;
 931			}
 932			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 933				if (v->line_times_for_prefetch[k] < 2.0 || v->lines_for_meta_pte_with_immediate_flip[k] >= 8.0 || v->lines_for_meta_and_dpte_row_with_immediate_flip[k] >= 16.0) {
 934					v->prefetch_supported_with_immediate_flip[i][j] = dcn_bw_no;
 935				}
 936			}
 937			v->prefetch_supported_without_immediate_flip[i][j] = dcn_bw_yes;
 938			if (v->maximum_read_bandwidth_with_prefetch_without_immediate_flip > v->return_bw_per_state[i]) {
 939				v->prefetch_supported_without_immediate_flip[i][j] = dcn_bw_no;
 940			}
 941			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 942				if (v->line_times_for_prefetch[k] < 2.0 || v->lines_for_meta_pte_without_immediate_flip[k] >= 8.0 || v->lines_for_meta_and_dpte_row_without_immediate_flip[k] >= 16.0) {
 943					v->prefetch_supported_without_immediate_flip[i][j] = dcn_bw_no;
 944				}
 945			}
 946		}
 947	}
 948	for (i = 0; i <= number_of_states_plus_one; i++) {
 949		for (j = 0; j <= 1; j++) {
 950			v->v_ratio_in_prefetch_supported_with_immediate_flip[i][j] = dcn_bw_yes;
 951			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 952				if ((((v->source_pixel_format[k] != dcn_bw_yuv420_sub_8 && v->source_pixel_format[k] != dcn_bw_yuv420_sub_10) && (v->v_ratio_pre_ywith_immediate_flip[i][j][k] > 4.0 || v->v_ratio_pre_cwith_immediate_flip[i][j][k] > 4.0)) || ((v->source_pixel_format[k] == dcn_bw_yuv420_sub_8 || v->source_pixel_format[k] == dcn_bw_yuv420_sub_10) && (v->v_ratio_pre_ywithout_immediate_flip[i][j][k] > 4.0 || v->v_ratio_pre_cwithout_immediate_flip[i][j][k] > 4.0)))) {
 953					v->v_ratio_in_prefetch_supported_with_immediate_flip[i][j] = dcn_bw_no;
 954				}
 955			}
 956			v->v_ratio_in_prefetch_supported_without_immediate_flip[i][j] = dcn_bw_yes;
 957			for (k = 0; k <= v->number_of_active_planes - 1; k++) {
 958				if ((v->v_ratio_pre_ywithout_immediate_flip[i][j][k] > 4.0 || v->v_ratio_pre_cwithout_immediate_flip[i][j][k] > 4.0)) {
 959					v->v_ratio_in_prefetch_supported_without_immediate_flip[i][j] = dcn_bw_no;
 960				}
 961			}
 962		}
 963	}
 964	/*mode support, voltage state and soc configuration*/
 965
 966	for (i = number_of_states_plus_one; i >= 0; i--) {
 967		for (j = 0; j <= 1; j++) {
 968			if (v->scale_ratio_support == dcn_bw_yes && v->source_format_pixel_and_scan_support == dcn_bw_yes && v->viewport_size_support == dcn_bw_yes && v->bandwidth_support[i] == dcn_bw_yes && v->dio_support[i] == dcn_bw_yes && v->urgent_latency_support[i][j] == dcn_bw_yes && v->rob_support[i] == dcn_bw_yes && v->dispclk_dppclk_support[i][j] == dcn_bw_yes && v->total_available_pipes_support[i][j] == dcn_bw_yes && v->total_available_writeback_support == dcn_bw_yes && v->writeback_latency_support == dcn_bw_yes) {
 969				if (v->prefetch_supported_with_immediate_flip[i][j] == dcn_bw_yes && v->v_ratio_in_prefetch_supported_with_immediate_flip[i][j] == dcn_bw_yes) {
 970					v->mode_support_with_immediate_flip[i][j] = dcn_bw_yes;
 971				}
 972				else {
 973					v->mode_support_with_immediate_flip[i][j] = dcn_bw_no;
 974				}
 975				if (v->prefetch_supported_without_immediate_flip[i][j] == dcn_bw_yes && v->v_ratio_in_prefetch_supported_without_immediate_flip[i][j] == dcn_bw_yes) {
 976					v->mode_support_without_immediate_flip[i][j] = dcn_bw_yes;
 977				}
 978				else {
 979					v->mode_support_without_immediate_flip[i][j] = dcn_bw_no;
 980				}
 981			}
 982			else {
 983				v->mode_support_with_immediate_flip[i][j] = dcn_bw_no;
 984				v->mode_support_without_immediate_flip[i][j] = dcn_bw_no;
 985			}
 986		}
 987	}
 988	for (i = number_of_states_plus_one; i >= 0; i--) {
 989		if ((i == number_of_states_plus_one || v->mode_support_with_immediate_flip[i][1] == dcn_bw_yes || v->mode_support_with_immediate_flip[i][0] == dcn_bw_yes) && i >= v->voltage_override_level) {
 990			v->voltage_level_with_immediate_flip = i;
 991		}
 992	}
 993	for (i = number_of_states_plus_one; i >= 0; i--) {
 994		if ((i == number_of_states_plus_one || v->mode_support_without_immediate_flip[i][1] == dcn_bw_yes || v->mode_support_without_immediate_flip[i][0] == dcn_bw_yes) && i >= v->voltage_override_level) {
 995			v->voltage_level_without_immediate_flip = i;
 996		}
 997	}
 998	if (v->voltage_level_with_immediate_flip == number_of_states_plus_one) {
 999		v->immediate_flip_supported = dcn_bw_no;
1000		v->voltage_level = v->voltage_level_without_immediate_flip;
1001	}
1002	else {
1003		v->immediate_flip_supported = dcn_bw_yes;
1004		v->voltage_level = v->voltage_level_with_immediate_flip;
1005	}
1006	v->dcfclk = v->dcfclk_per_state[v->voltage_level];
1007	v->fabric_and_dram_bandwidth = v->fabric_and_dram_bandwidth_per_state[v->voltage_level];
1008	for (j = 0; j <= 1; j++) {
1009		v->required_dispclk_per_ratio[j] = v->required_dispclk[v->voltage_level][j];
1010		for (k = 0; k <= v->number_of_active_planes - 1; k++) {
1011			v->dpp_per_plane_per_ratio[j][k] = v->no_of_dpp[v->voltage_level][j][k];
1012		}
1013		v->dispclk_dppclk_support_per_ratio[j] = v->dispclk_dppclk_support[v->voltage_level][j];
1014	}
1015	v->max_phyclk = v->phyclk_per_state[v->voltage_level];
1016}
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}