cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

dcn_calc_auto.c (114732B)


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