Linux Audio

Check our new training course

Linux BSP upgrade and security maintenance

Need help to get security updates for your Linux BSP?
Loading...
Note: File does not exist in v5.9.
   1/*
   2 * Copyright 2015 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 "resource.h"
  27#include "dm_services.h"
  28#include "dce_calcs.h"
  29#include "dc.h"
  30#include "core_types.h"
  31#include "dal_asic_id.h"
  32#include "calcs_logger.h"
  33
  34/*
  35 * NOTE:
  36 *   This file is gcc-parseable HW gospel, coming straight from HW engineers.
  37 *
  38 * It doesn't adhere to Linux kernel style and sometimes will do things in odd
  39 * ways. Unless there is something clearly wrong with it the code should
  40 * remain as-is as it provides us with a guarantee from HW that it is correct.
  41 */
  42
  43/*******************************************************************************
  44 * Private Functions
  45 ******************************************************************************/
  46
  47static enum bw_calcs_version bw_calcs_version_from_asic_id(struct hw_asic_id asic_id)
  48{
  49	switch (asic_id.chip_family) {
  50
  51	case FAMILY_CZ:
  52		if (ASIC_REV_IS_STONEY(asic_id.hw_internal_rev))
  53			return BW_CALCS_VERSION_STONEY;
  54		return BW_CALCS_VERSION_CARRIZO;
  55
  56	case FAMILY_VI:
  57		if (ASIC_REV_IS_POLARIS12_V(asic_id.hw_internal_rev))
  58			return BW_CALCS_VERSION_POLARIS12;
  59		if (ASIC_REV_IS_POLARIS10_P(asic_id.hw_internal_rev))
  60			return BW_CALCS_VERSION_POLARIS10;
  61		if (ASIC_REV_IS_POLARIS11_M(asic_id.hw_internal_rev))
  62			return BW_CALCS_VERSION_POLARIS11;
  63		if (ASIC_REV_IS_VEGAM(asic_id.hw_internal_rev))
  64			return BW_CALCS_VERSION_VEGAM;
  65		return BW_CALCS_VERSION_INVALID;
  66
  67	case FAMILY_AI:
  68		return BW_CALCS_VERSION_VEGA10;
  69
  70	default:
  71		return BW_CALCS_VERSION_INVALID;
  72	}
  73}
  74
  75static void calculate_bandwidth(
  76	const struct bw_calcs_dceip *dceip,
  77	const struct bw_calcs_vbios *vbios,
  78	struct bw_calcs_data *data)
  79
  80{
  81	const int32_t pixels_per_chunk = 512;
  82	const int32_t high = 2;
  83	const int32_t mid = 1;
  84	const int32_t low = 0;
  85	const uint32_t s_low = 0;
  86	const uint32_t s_mid1 = 1;
  87	const uint32_t s_mid2 = 2;
  88	const uint32_t s_mid3 = 3;
  89	const uint32_t s_mid4 = 4;
  90	const uint32_t s_mid5 = 5;
  91	const uint32_t s_mid6 = 6;
  92	const uint32_t s_high = 7;
  93	const uint32_t dmif_chunk_buff_margin = 1;
  94
  95	uint32_t max_chunks_fbc_mode = 0;
  96	int32_t num_cursor_lines;
  97
  98	int32_t i, j, k;
  99	struct bw_fixed *yclk;
 100	struct bw_fixed *sclk;
 101	bool d0_underlay_enable;
 102	bool d1_underlay_enable;
 103	bool fbc_enabled;
 104	bool lpt_enabled;
 105	enum bw_defines sclk_message;
 106	enum bw_defines yclk_message;
 107	enum bw_defines *tiling_mode;
 108	enum bw_defines *surface_type;
 109	enum bw_defines voltage;
 110	enum bw_defines pipe_check;
 111	enum bw_defines hsr_check;
 112	enum bw_defines vsr_check;
 113	enum bw_defines lb_size_check;
 114	enum bw_defines fbc_check;
 115	enum bw_defines rotation_check;
 116	enum bw_defines mode_check;
 117	enum bw_defines nbp_state_change_enable_blank;
 118	/*initialize variables*/
 119	int32_t number_of_displays_enabled = 0;
 120	int32_t number_of_displays_enabled_with_margin = 0;
 121	int32_t number_of_aligned_displays_with_no_margin = 0;
 122
 123	yclk = kcalloc(3, sizeof(*yclk), GFP_KERNEL);
 124	if (!yclk)
 125		return;
 126
 127	sclk = kcalloc(8, sizeof(*sclk), GFP_KERNEL);
 128	if (!sclk)
 129		goto free_yclk;
 130
 131	tiling_mode = kcalloc(maximum_number_of_surfaces, sizeof(*tiling_mode), GFP_KERNEL);
 132	if (!tiling_mode)
 133		goto free_sclk;
 134
 135	surface_type = kcalloc(maximum_number_of_surfaces, sizeof(*surface_type), GFP_KERNEL);
 136	if (!surface_type)
 137		goto free_tiling_mode;
 138
 139	yclk[low] = vbios->low_yclk;
 140	yclk[mid] = vbios->mid_yclk;
 141	yclk[high] = vbios->high_yclk;
 142	sclk[s_low] = vbios->low_sclk;
 143	sclk[s_mid1] = vbios->mid1_sclk;
 144	sclk[s_mid2] = vbios->mid2_sclk;
 145	sclk[s_mid3] = vbios->mid3_sclk;
 146	sclk[s_mid4] = vbios->mid4_sclk;
 147	sclk[s_mid5] = vbios->mid5_sclk;
 148	sclk[s_mid6] = vbios->mid6_sclk;
 149	sclk[s_high] = vbios->high_sclk;
 150	/*''''''''''''''''''*/
 151	/* surface assignment:*/
 152	/* 0: d0 underlay or underlay luma*/
 153	/* 1: d0 underlay chroma*/
 154	/* 2: d1 underlay or underlay luma*/
 155	/* 3: d1 underlay chroma*/
 156	/* 4: d0 graphics*/
 157	/* 5: d1 graphics*/
 158	/* 6: d2 graphics*/
 159	/* 7: d3 graphics, same mode as d2*/
 160	/* 8: d4 graphics, same mode as d2*/
 161	/* 9: d5 graphics, same mode as d2*/
 162	/* ...*/
 163	/* maximum_number_of_surfaces-2: d1 display_write_back420 luma*/
 164	/* maximum_number_of_surfaces-1: d1 display_write_back420 chroma*/
 165	/* underlay luma and chroma surface parameters from spreadsheet*/
 166
 167
 168
 169
 170	if (data->d0_underlay_mode == bw_def_none)
 171		d0_underlay_enable = false;
 172	else
 173		d0_underlay_enable = true;
 174	if (data->d1_underlay_mode == bw_def_none)
 175		d1_underlay_enable = false;
 176	else
 177		d1_underlay_enable = true;
 178	data->number_of_underlay_surfaces = d0_underlay_enable + d1_underlay_enable;
 179	switch (data->underlay_surface_type) {
 180	case bw_def_420:
 181		surface_type[0] = bw_def_underlay420_luma;
 182		surface_type[2] = bw_def_underlay420_luma;
 183		data->bytes_per_pixel[0] = 1;
 184		data->bytes_per_pixel[2] = 1;
 185		surface_type[1] = bw_def_underlay420_chroma;
 186		surface_type[3] = bw_def_underlay420_chroma;
 187		data->bytes_per_pixel[1] = 2;
 188		data->bytes_per_pixel[3] = 2;
 189		data->lb_size_per_component[0] = dceip->underlay420_luma_lb_size_per_component;
 190		data->lb_size_per_component[1] = dceip->underlay420_chroma_lb_size_per_component;
 191		data->lb_size_per_component[2] = dceip->underlay420_luma_lb_size_per_component;
 192		data->lb_size_per_component[3] = dceip->underlay420_chroma_lb_size_per_component;
 193		break;
 194	case bw_def_422:
 195		surface_type[0] = bw_def_underlay422;
 196		surface_type[2] = bw_def_underlay422;
 197		data->bytes_per_pixel[0] = 2;
 198		data->bytes_per_pixel[2] = 2;
 199		data->lb_size_per_component[0] = dceip->underlay422_lb_size_per_component;
 200		data->lb_size_per_component[2] = dceip->underlay422_lb_size_per_component;
 201		break;
 202	default:
 203		surface_type[0] = bw_def_underlay444;
 204		surface_type[2] = bw_def_underlay444;
 205		data->bytes_per_pixel[0] = 4;
 206		data->bytes_per_pixel[2] = 4;
 207		data->lb_size_per_component[0] = dceip->lb_size_per_component444;
 208		data->lb_size_per_component[2] = dceip->lb_size_per_component444;
 209		break;
 210	}
 211	if (d0_underlay_enable) {
 212		switch (data->underlay_surface_type) {
 213		case bw_def_420:
 214			data->enable[0] = 1;
 215			data->enable[1] = 1;
 216			break;
 217		default:
 218			data->enable[0] = 1;
 219			data->enable[1] = 0;
 220			break;
 221		}
 222	}
 223	else {
 224		data->enable[0] = 0;
 225		data->enable[1] = 0;
 226	}
 227	if (d1_underlay_enable) {
 228		switch (data->underlay_surface_type) {
 229		case bw_def_420:
 230			data->enable[2] = 1;
 231			data->enable[3] = 1;
 232			break;
 233		default:
 234			data->enable[2] = 1;
 235			data->enable[3] = 0;
 236			break;
 237		}
 238	}
 239	else {
 240		data->enable[2] = 0;
 241		data->enable[3] = 0;
 242	}
 243	data->use_alpha[0] = 0;
 244	data->use_alpha[1] = 0;
 245	data->use_alpha[2] = 0;
 246	data->use_alpha[3] = 0;
 247	data->scatter_gather_enable_for_pipe[0] = vbios->scatter_gather_enable;
 248	data->scatter_gather_enable_for_pipe[1] = vbios->scatter_gather_enable;
 249	data->scatter_gather_enable_for_pipe[2] = vbios->scatter_gather_enable;
 250	data->scatter_gather_enable_for_pipe[3] = vbios->scatter_gather_enable;
 251	/*underlay0 same and graphics display pipe0*/
 252	data->interlace_mode[0] = data->interlace_mode[4];
 253	data->interlace_mode[1] = data->interlace_mode[4];
 254	/*underlay1 same and graphics display pipe1*/
 255	data->interlace_mode[2] = data->interlace_mode[5];
 256	data->interlace_mode[3] = data->interlace_mode[5];
 257	/*underlay0 same and graphics display pipe0*/
 258	data->h_total[0] = data->h_total[4];
 259	data->v_total[0] = data->v_total[4];
 260	data->h_total[1] = data->h_total[4];
 261	data->v_total[1] = data->v_total[4];
 262	/*underlay1 same and graphics display pipe1*/
 263	data->h_total[2] = data->h_total[5];
 264	data->v_total[2] = data->v_total[5];
 265	data->h_total[3] = data->h_total[5];
 266	data->v_total[3] = data->v_total[5];
 267	/*underlay0 same and graphics display pipe0*/
 268	data->pixel_rate[0] = data->pixel_rate[4];
 269	data->pixel_rate[1] = data->pixel_rate[4];
 270	/*underlay1 same and graphics display pipe1*/
 271	data->pixel_rate[2] = data->pixel_rate[5];
 272	data->pixel_rate[3] = data->pixel_rate[5];
 273	if ((data->underlay_tiling_mode == bw_def_array_linear_general || data->underlay_tiling_mode == bw_def_array_linear_aligned)) {
 274		tiling_mode[0] = bw_def_linear;
 275		tiling_mode[1] = bw_def_linear;
 276		tiling_mode[2] = bw_def_linear;
 277		tiling_mode[3] = bw_def_linear;
 278	}
 279	else {
 280		tiling_mode[0] = bw_def_landscape;
 281		tiling_mode[1] = bw_def_landscape;
 282		tiling_mode[2] = bw_def_landscape;
 283		tiling_mode[3] = bw_def_landscape;
 284	}
 285	data->lb_bpc[0] = data->underlay_lb_bpc;
 286	data->lb_bpc[1] = data->underlay_lb_bpc;
 287	data->lb_bpc[2] = data->underlay_lb_bpc;
 288	data->lb_bpc[3] = data->underlay_lb_bpc;
 289	data->compression_rate[0] = bw_int_to_fixed(1);
 290	data->compression_rate[1] = bw_int_to_fixed(1);
 291	data->compression_rate[2] = bw_int_to_fixed(1);
 292	data->compression_rate[3] = bw_int_to_fixed(1);
 293	data->access_one_channel_only[0] = 0;
 294	data->access_one_channel_only[1] = 0;
 295	data->access_one_channel_only[2] = 0;
 296	data->access_one_channel_only[3] = 0;
 297	data->cursor_width_pixels[0] = bw_int_to_fixed(0);
 298	data->cursor_width_pixels[1] = bw_int_to_fixed(0);
 299	data->cursor_width_pixels[2] = bw_int_to_fixed(0);
 300	data->cursor_width_pixels[3] = bw_int_to_fixed(0);
 301	/* graphics surface parameters from spreadsheet*/
 302	fbc_enabled = false;
 303	lpt_enabled = false;
 304	for (i = 4; i <= maximum_number_of_surfaces - 3; i++) {
 305		if (i < data->number_of_displays + 4) {
 306			if (i == 4 && data->d0_underlay_mode == bw_def_underlay_only) {
 307				data->enable[i] = 0;
 308				data->use_alpha[i] = 0;
 309			}
 310			else if (i == 4 && data->d0_underlay_mode == bw_def_blend) {
 311				data->enable[i] = 1;
 312				data->use_alpha[i] = 1;
 313			}
 314			else if (i == 4) {
 315				data->enable[i] = 1;
 316				data->use_alpha[i] = 0;
 317			}
 318			else if (i == 5 && data->d1_underlay_mode == bw_def_underlay_only) {
 319				data->enable[i] = 0;
 320				data->use_alpha[i] = 0;
 321			}
 322			else if (i == 5 && data->d1_underlay_mode == bw_def_blend) {
 323				data->enable[i] = 1;
 324				data->use_alpha[i] = 1;
 325			}
 326			else {
 327				data->enable[i] = 1;
 328				data->use_alpha[i] = 0;
 329			}
 330		}
 331		else {
 332			data->enable[i] = 0;
 333			data->use_alpha[i] = 0;
 334		}
 335		data->scatter_gather_enable_for_pipe[i] = vbios->scatter_gather_enable;
 336		surface_type[i] = bw_def_graphics;
 337		data->lb_size_per_component[i] = dceip->lb_size_per_component444;
 338		if (data->graphics_tiling_mode == bw_def_array_linear_general || data->graphics_tiling_mode == bw_def_array_linear_aligned) {
 339			tiling_mode[i] = bw_def_linear;
 340		}
 341		else {
 342			tiling_mode[i] = bw_def_tiled;
 343		}
 344		data->lb_bpc[i] = data->graphics_lb_bpc;
 345		if ((data->fbc_en[i] == 1 && (dceip->argb_compression_support || data->d0_underlay_mode != bw_def_blended))) {
 346			data->compression_rate[i] = bw_int_to_fixed(vbios->average_compression_rate);
 347			data->access_one_channel_only[i] = data->lpt_en[i];
 348		}
 349		else {
 350			data->compression_rate[i] = bw_int_to_fixed(1);
 351			data->access_one_channel_only[i] = 0;
 352		}
 353		if (data->fbc_en[i] == 1) {
 354			fbc_enabled = true;
 355			if (data->lpt_en[i] == 1) {
 356				lpt_enabled = true;
 357			}
 358		}
 359		data->cursor_width_pixels[i] = bw_int_to_fixed(vbios->cursor_width);
 360	}
 361	/* display_write_back420*/
 362	data->scatter_gather_enable_for_pipe[maximum_number_of_surfaces - 2] = 0;
 363	data->scatter_gather_enable_for_pipe[maximum_number_of_surfaces - 1] = 0;
 364	if (data->d1_display_write_back_dwb_enable == 1) {
 365		data->enable[maximum_number_of_surfaces - 2] = 1;
 366		data->enable[maximum_number_of_surfaces - 1] = 1;
 367	}
 368	else {
 369		data->enable[maximum_number_of_surfaces - 2] = 0;
 370		data->enable[maximum_number_of_surfaces - 1] = 0;
 371	}
 372	surface_type[maximum_number_of_surfaces - 2] = bw_def_display_write_back420_luma;
 373	surface_type[maximum_number_of_surfaces - 1] = bw_def_display_write_back420_chroma;
 374	data->lb_size_per_component[maximum_number_of_surfaces - 2] = dceip->underlay420_luma_lb_size_per_component;
 375	data->lb_size_per_component[maximum_number_of_surfaces - 1] = dceip->underlay420_chroma_lb_size_per_component;
 376	data->bytes_per_pixel[maximum_number_of_surfaces - 2] = 1;
 377	data->bytes_per_pixel[maximum_number_of_surfaces - 1] = 2;
 378	data->interlace_mode[maximum_number_of_surfaces - 2] = data->interlace_mode[5];
 379	data->interlace_mode[maximum_number_of_surfaces - 1] = data->interlace_mode[5];
 380	data->h_taps[maximum_number_of_surfaces - 2] = bw_int_to_fixed(1);
 381	data->h_taps[maximum_number_of_surfaces - 1] = bw_int_to_fixed(1);
 382	data->v_taps[maximum_number_of_surfaces - 2] = bw_int_to_fixed(1);
 383	data->v_taps[maximum_number_of_surfaces - 1] = bw_int_to_fixed(1);
 384	data->rotation_angle[maximum_number_of_surfaces - 2] = bw_int_to_fixed(0);
 385	data->rotation_angle[maximum_number_of_surfaces - 1] = bw_int_to_fixed(0);
 386	tiling_mode[maximum_number_of_surfaces - 2] = bw_def_linear;
 387	tiling_mode[maximum_number_of_surfaces - 1] = bw_def_linear;
 388	data->lb_bpc[maximum_number_of_surfaces - 2] = 8;
 389	data->lb_bpc[maximum_number_of_surfaces - 1] = 8;
 390	data->compression_rate[maximum_number_of_surfaces - 2] = bw_int_to_fixed(1);
 391	data->compression_rate[maximum_number_of_surfaces - 1] = bw_int_to_fixed(1);
 392	data->access_one_channel_only[maximum_number_of_surfaces - 2] = 0;
 393	data->access_one_channel_only[maximum_number_of_surfaces - 1] = 0;
 394	/*assume display pipe1 has dwb enabled*/
 395	data->h_total[maximum_number_of_surfaces - 2] = data->h_total[5];
 396	data->h_total[maximum_number_of_surfaces - 1] = data->h_total[5];
 397	data->v_total[maximum_number_of_surfaces - 2] = data->v_total[5];
 398	data->v_total[maximum_number_of_surfaces - 1] = data->v_total[5];
 399	data->pixel_rate[maximum_number_of_surfaces - 2] = data->pixel_rate[5];
 400	data->pixel_rate[maximum_number_of_surfaces - 1] = data->pixel_rate[5];
 401	data->src_width[maximum_number_of_surfaces - 2] = data->src_width[5];
 402	data->src_width[maximum_number_of_surfaces - 1] = data->src_width[5];
 403	data->src_height[maximum_number_of_surfaces - 2] = data->src_height[5];
 404	data->src_height[maximum_number_of_surfaces - 1] = data->src_height[5];
 405	data->pitch_in_pixels[maximum_number_of_surfaces - 2] = data->src_width[5];
 406	data->pitch_in_pixels[maximum_number_of_surfaces - 1] = data->src_width[5];
 407	data->h_scale_ratio[maximum_number_of_surfaces - 2] = bw_int_to_fixed(1);
 408	data->h_scale_ratio[maximum_number_of_surfaces - 1] = bw_int_to_fixed(1);
 409	data->v_scale_ratio[maximum_number_of_surfaces - 2] = bw_int_to_fixed(1);
 410	data->v_scale_ratio[maximum_number_of_surfaces - 1] = bw_int_to_fixed(1);
 411	data->stereo_mode[maximum_number_of_surfaces - 2] = bw_def_mono;
 412	data->stereo_mode[maximum_number_of_surfaces - 1] = bw_def_mono;
 413	data->cursor_width_pixels[maximum_number_of_surfaces - 2] = bw_int_to_fixed(0);
 414	data->cursor_width_pixels[maximum_number_of_surfaces - 1] = bw_int_to_fixed(0);
 415	data->use_alpha[maximum_number_of_surfaces - 2] = 0;
 416	data->use_alpha[maximum_number_of_surfaces - 1] = 0;
 417	/*mode check calculations:*/
 418	/* mode within dce ip capabilities*/
 419	/* fbc*/
 420	/* hsr*/
 421	/* vsr*/
 422	/* lb size*/
 423	/*effective scaling source and ratios:*/
 424	/*for graphics, non-stereo, non-interlace surfaces when the size of the source and destination are the same, only one tap is used*/
 425	/*420 chroma has half the width, height, horizontal and vertical scaling ratios than luma*/
 426	/*rotating a graphic or underlay surface swaps the width, height, horizontal and vertical scaling ratios*/
 427	/*in top-bottom stereo mode there is 2:1 vertical downscaling for each eye*/
 428	/*in side-by-side stereo mode there is 2:1 horizontal downscaling for each eye*/
 429	/*in interlace mode there is 2:1 vertical downscaling for each field*/
 430	/*in panning or bezel adjustment mode the source width has an extra 128 pixels*/
 431	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 432		if (data->enable[i]) {
 433			if (bw_equ(data->h_scale_ratio[i], bw_int_to_fixed(1)) && bw_equ(data->v_scale_ratio[i], bw_int_to_fixed(1)) && surface_type[i] == bw_def_graphics && data->stereo_mode[i] == bw_def_mono && data->interlace_mode[i] == 0) {
 434				data->h_taps[i] = bw_int_to_fixed(1);
 435				data->v_taps[i] = bw_int_to_fixed(1);
 436			}
 437			if (surface_type[i] == bw_def_display_write_back420_chroma || surface_type[i] == bw_def_underlay420_chroma) {
 438				data->pitch_in_pixels_after_surface_type[i] = bw_div(data->pitch_in_pixels[i], bw_int_to_fixed(2));
 439				data->src_width_after_surface_type = bw_div(data->src_width[i], bw_int_to_fixed(2));
 440				data->src_height_after_surface_type = bw_div(data->src_height[i], bw_int_to_fixed(2));
 441				data->hsr_after_surface_type = bw_div(data->h_scale_ratio[i], bw_int_to_fixed(2));
 442				data->vsr_after_surface_type = bw_div(data->v_scale_ratio[i], bw_int_to_fixed(2));
 443			}
 444			else {
 445				data->pitch_in_pixels_after_surface_type[i] = data->pitch_in_pixels[i];
 446				data->src_width_after_surface_type = data->src_width[i];
 447				data->src_height_after_surface_type = data->src_height[i];
 448				data->hsr_after_surface_type = data->h_scale_ratio[i];
 449				data->vsr_after_surface_type = data->v_scale_ratio[i];
 450			}
 451			if ((bw_equ(data->rotation_angle[i], bw_int_to_fixed(90)) || bw_equ(data->rotation_angle[i], bw_int_to_fixed(270))) && surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
 452				data->src_width_after_rotation = data->src_height_after_surface_type;
 453				data->src_height_after_rotation = data->src_width_after_surface_type;
 454				data->hsr_after_rotation = data->vsr_after_surface_type;
 455				data->vsr_after_rotation = data->hsr_after_surface_type;
 456			}
 457			else {
 458				data->src_width_after_rotation = data->src_width_after_surface_type;
 459				data->src_height_after_rotation = data->src_height_after_surface_type;
 460				data->hsr_after_rotation = data->hsr_after_surface_type;
 461				data->vsr_after_rotation = data->vsr_after_surface_type;
 462			}
 463			switch (data->stereo_mode[i]) {
 464			case bw_def_top_bottom:
 465				data->source_width_pixels[i] = data->src_width_after_rotation;
 466				data->source_height_pixels = bw_mul(bw_int_to_fixed(2), data->src_height_after_rotation);
 467				data->hsr_after_stereo = data->hsr_after_rotation;
 468				data->vsr_after_stereo = bw_mul(bw_int_to_fixed(1), data->vsr_after_rotation);
 469				break;
 470			case bw_def_side_by_side:
 471				data->source_width_pixels[i] = bw_mul(bw_int_to_fixed(2), data->src_width_after_rotation);
 472				data->source_height_pixels = data->src_height_after_rotation;
 473				data->hsr_after_stereo = bw_mul(bw_int_to_fixed(1), data->hsr_after_rotation);
 474				data->vsr_after_stereo = data->vsr_after_rotation;
 475				break;
 476			default:
 477				data->source_width_pixels[i] = data->src_width_after_rotation;
 478				data->source_height_pixels = data->src_height_after_rotation;
 479				data->hsr_after_stereo = data->hsr_after_rotation;
 480				data->vsr_after_stereo = data->vsr_after_rotation;
 481				break;
 482			}
 483			data->hsr[i] = data->hsr_after_stereo;
 484			if (data->interlace_mode[i]) {
 485				data->vsr[i] = bw_mul(data->vsr_after_stereo, bw_int_to_fixed(2));
 486			}
 487			else {
 488				data->vsr[i] = data->vsr_after_stereo;
 489			}
 490			if (data->panning_and_bezel_adjustment != bw_def_none) {
 491				data->source_width_rounded_up_to_chunks[i] = bw_add(bw_floor2(bw_sub(data->source_width_pixels[i], bw_int_to_fixed(1)), bw_int_to_fixed(128)), bw_int_to_fixed(256));
 492			}
 493			else {
 494				data->source_width_rounded_up_to_chunks[i] = bw_ceil2(data->source_width_pixels[i], bw_int_to_fixed(128));
 495			}
 496			data->source_height_rounded_up_to_chunks[i] = data->source_height_pixels;
 497		}
 498	}
 499	/*mode support checks:*/
 500	/*the number of graphics and underlay pipes is limited by the ip support*/
 501	/*maximum horizontal and vertical scale ratio is 4, and should not exceed the number of taps*/
 502	/*for downscaling with the pre-downscaler, the horizontal scale ratio must be more than the ceiling of one quarter of the number of taps*/
 503	/*the pre-downscaler reduces the line buffer source by the horizontal scale ratio*/
 504	/*the number of lines in the line buffer has to exceed the number of vertical taps*/
 505	/*the size of the line in the line buffer is the product of the source width and the bits per component, rounded up to a multiple of 48*/
 506	/*the size of the line in the line buffer in the case of 10 bit per component is the product of the source width rounded up to multiple of 8 and 30.023438 / 3, rounded up to a multiple of 48*/
 507	/*the size of the line in the line buffer in the case of 8 bit per component is the product of the source width rounded up to multiple of 8 and 30.023438 / 3, rounded up to a multiple of 48*/
 508	/*frame buffer compression is not supported with stereo mode, rotation, or non- 888 formats*/
 509	/*rotation is not supported with linear of stereo modes*/
 510	if (dceip->number_of_graphics_pipes >= data->number_of_displays && dceip->number_of_underlay_pipes >= data->number_of_underlay_surfaces && !(dceip->display_write_back_supported == 0 && data->d1_display_write_back_dwb_enable == 1)) {
 511		pipe_check = bw_def_ok;
 512	}
 513	else {
 514		pipe_check = bw_def_notok;
 515	}
 516	hsr_check = bw_def_ok;
 517	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 518		if (data->enable[i]) {
 519			if (bw_neq(data->hsr[i], bw_int_to_fixed(1))) {
 520				if (bw_mtn(data->hsr[i], bw_int_to_fixed(4))) {
 521					hsr_check = bw_def_hsr_mtn_4;
 522				}
 523				else {
 524					if (bw_mtn(data->hsr[i], data->h_taps[i])) {
 525						hsr_check = bw_def_hsr_mtn_h_taps;
 526					}
 527					else {
 528						if (dceip->pre_downscaler_enabled == 1 && bw_mtn(data->hsr[i], bw_int_to_fixed(1)) && bw_leq(data->hsr[i], bw_ceil2(bw_div(data->h_taps[i], bw_int_to_fixed(4)), bw_int_to_fixed(1)))) {
 529							hsr_check = bw_def_ceiling__h_taps_div_4___meq_hsr;
 530						}
 531					}
 532				}
 533			}
 534		}
 535	}
 536	vsr_check = bw_def_ok;
 537	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 538		if (data->enable[i]) {
 539			if (bw_neq(data->vsr[i], bw_int_to_fixed(1))) {
 540				if (bw_mtn(data->vsr[i], bw_int_to_fixed(4))) {
 541					vsr_check = bw_def_vsr_mtn_4;
 542				}
 543				else {
 544					if (bw_mtn(data->vsr[i], data->v_taps[i])) {
 545						vsr_check = bw_def_vsr_mtn_v_taps;
 546					}
 547				}
 548			}
 549		}
 550	}
 551	lb_size_check = bw_def_ok;
 552	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 553		if (data->enable[i]) {
 554			if ((dceip->pre_downscaler_enabled && bw_mtn(data->hsr[i], bw_int_to_fixed(1)))) {
 555				data->source_width_in_lb = bw_div(data->source_width_pixels[i], data->hsr[i]);
 556			}
 557			else {
 558				data->source_width_in_lb = data->source_width_pixels[i];
 559			}
 560			switch (data->lb_bpc[i]) {
 561			case 8:
 562				data->lb_line_pitch = bw_ceil2(bw_mul(bw_div(bw_frc_to_fixed(2401171875ul, 100000000), bw_int_to_fixed(3)), bw_ceil2(data->source_width_in_lb, bw_int_to_fixed(8))), bw_int_to_fixed(48));
 563				break;
 564			case 10:
 565				data->lb_line_pitch = bw_ceil2(bw_mul(bw_div(bw_frc_to_fixed(300234375, 10000000), bw_int_to_fixed(3)), bw_ceil2(data->source_width_in_lb, bw_int_to_fixed(8))), bw_int_to_fixed(48));
 566				break;
 567			default:
 568				data->lb_line_pitch = bw_ceil2(bw_mul(bw_int_to_fixed(data->lb_bpc[i]), data->source_width_in_lb), bw_int_to_fixed(48));
 569				break;
 570			}
 571			data->lb_partitions[i] = bw_floor2(bw_div(data->lb_size_per_component[i], data->lb_line_pitch), bw_int_to_fixed(1));
 572			/*clamp the partitions to the maxium number supported by the lb*/
 573			if ((surface_type[i] != bw_def_graphics || dceip->graphics_lb_nodownscaling_multi_line_prefetching == 1)) {
 574				data->lb_partitions_max[i] = bw_int_to_fixed(10);
 575			}
 576			else {
 577				data->lb_partitions_max[i] = bw_int_to_fixed(7);
 578			}
 579			data->lb_partitions[i] = bw_min2(data->lb_partitions_max[i], data->lb_partitions[i]);
 580			if (bw_mtn(bw_add(data->v_taps[i], bw_int_to_fixed(1)), data->lb_partitions[i])) {
 581				lb_size_check = bw_def_notok;
 582			}
 583		}
 584	}
 585	fbc_check = bw_def_ok;
 586	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 587		if (data->enable[i] && data->fbc_en[i] == 1 && (bw_equ(data->rotation_angle[i], bw_int_to_fixed(90)) || bw_equ(data->rotation_angle[i], bw_int_to_fixed(270)) || data->stereo_mode[i] != bw_def_mono || data->bytes_per_pixel[i] != 4)) {
 588			fbc_check = bw_def_invalid_rotation_or_bpp_or_stereo;
 589		}
 590	}
 591	rotation_check = bw_def_ok;
 592	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 593		if (data->enable[i]) {
 594			if ((bw_equ(data->rotation_angle[i], bw_int_to_fixed(90)) || bw_equ(data->rotation_angle[i], bw_int_to_fixed(270))) && (tiling_mode[i] == bw_def_linear || data->stereo_mode[i] != bw_def_mono)) {
 595				rotation_check = bw_def_invalid_linear_or_stereo_mode;
 596			}
 597		}
 598	}
 599	if (pipe_check == bw_def_ok && hsr_check == bw_def_ok && vsr_check == bw_def_ok && lb_size_check == bw_def_ok && fbc_check == bw_def_ok && rotation_check == bw_def_ok) {
 600		mode_check = bw_def_ok;
 601	}
 602	else {
 603		mode_check = bw_def_notok;
 604	}
 605	/*number of memory channels for write-back client*/
 606	data->number_of_dram_wrchannels = vbios->number_of_dram_channels;
 607	data->number_of_dram_channels = vbios->number_of_dram_channels;
 608	/*modify number of memory channels if lpt mode is enabled*/
 609	/* low power tiling mode register*/
 610	/* 0 = use channel 0*/
 611	/* 1 = use channel 0 and 1*/
 612	/* 2 = use channel 0,1,2,3*/
 613	if ((fbc_enabled == 1 && lpt_enabled == 1)) {
 614		if (vbios->memory_type == bw_def_hbm)
 615			data->dram_efficiency = bw_frc_to_fixed(5, 10);
 616		else
 617			data->dram_efficiency = bw_int_to_fixed(1);
 618
 619
 620		if (dceip->low_power_tiling_mode == 0) {
 621			data->number_of_dram_channels = 1;
 622		}
 623		else if (dceip->low_power_tiling_mode == 1) {
 624			data->number_of_dram_channels = 2;
 625		}
 626		else if (dceip->low_power_tiling_mode == 2) {
 627			data->number_of_dram_channels = 4;
 628		}
 629		else {
 630			data->number_of_dram_channels = 1;
 631		}
 632	}
 633	else {
 634		if (vbios->memory_type == bw_def_hbm)
 635			data->dram_efficiency = bw_frc_to_fixed(5, 10);
 636		else
 637			data->dram_efficiency = bw_frc_to_fixed(8, 10);
 638	}
 639	/*memory request size and latency hiding:*/
 640	/*request size is normally 64 byte, 2-line interleaved, with full latency hiding*/
 641	/*the display write-back requests are single line*/
 642	/*for tiled graphics surfaces, or undelay surfaces with width higher than the maximum size for full efficiency, request size is 32 byte in 8 and 16 bpp or if the rotation is orthogonal to the tiling grain. only half is useful of the bytes in the request size in 8 bpp or in 32 bpp if the rotation is orthogonal to the tiling grain.*/
 643	/*for undelay surfaces with width lower than the maximum size for full efficiency, requests are 4-line interleaved in 16bpp if the rotation is parallel to the tiling grain, and 8-line interleaved with 4-line latency hiding in 8bpp or if the rotation is orthogonal to the tiling grain.*/
 644	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 645		if (data->enable[i]) {
 646			if ((bw_equ(data->rotation_angle[i], bw_int_to_fixed(90)) || bw_equ(data->rotation_angle[i], bw_int_to_fixed(270)))) {
 647				if ((i < 4)) {
 648					/*underlay portrait tiling mode is not supported*/
 649					data->orthogonal_rotation[i] = 1;
 650				}
 651				else {
 652					/*graphics portrait tiling mode*/
 653					if (data->graphics_micro_tile_mode == bw_def_rotated_micro_tiling) {
 654						data->orthogonal_rotation[i] = 0;
 655					}
 656					else {
 657						data->orthogonal_rotation[i] = 1;
 658					}
 659				}
 660			}
 661			else {
 662				if ((i < 4)) {
 663					/*underlay landscape tiling mode is only supported*/
 664					if (data->underlay_micro_tile_mode == bw_def_display_micro_tiling) {
 665						data->orthogonal_rotation[i] = 0;
 666					}
 667					else {
 668						data->orthogonal_rotation[i] = 1;
 669					}
 670				}
 671				else {
 672					/*graphics landscape tiling mode*/
 673					if (data->graphics_micro_tile_mode == bw_def_display_micro_tiling) {
 674						data->orthogonal_rotation[i] = 0;
 675					}
 676					else {
 677						data->orthogonal_rotation[i] = 1;
 678					}
 679				}
 680			}
 681			if (bw_equ(data->rotation_angle[i], bw_int_to_fixed(90)) || bw_equ(data->rotation_angle[i], bw_int_to_fixed(270))) {
 682				data->underlay_maximum_source_efficient_for_tiling = dceip->underlay_maximum_height_efficient_for_tiling;
 683			}
 684			else {
 685				data->underlay_maximum_source_efficient_for_tiling = dceip->underlay_maximum_width_efficient_for_tiling;
 686			}
 687			if (surface_type[i] == bw_def_display_write_back420_luma || surface_type[i] == bw_def_display_write_back420_chroma) {
 688				data->bytes_per_request[i] = bw_int_to_fixed(64);
 689				data->useful_bytes_per_request[i] = bw_int_to_fixed(64);
 690				data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(1);
 691				data->latency_hiding_lines[i] = bw_int_to_fixed(1);
 692			}
 693			else if (tiling_mode[i] == bw_def_linear) {
 694				data->bytes_per_request[i] = bw_int_to_fixed(64);
 695				data->useful_bytes_per_request[i] = bw_int_to_fixed(64);
 696				data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
 697				data->latency_hiding_lines[i] = bw_int_to_fixed(2);
 698			}
 699			else {
 700				if (surface_type[i] == bw_def_graphics || (bw_mtn(data->source_width_rounded_up_to_chunks[i], bw_ceil2(data->underlay_maximum_source_efficient_for_tiling, bw_int_to_fixed(256))))) {
 701					switch (data->bytes_per_pixel[i]) {
 702					case 8:
 703						data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
 704						data->latency_hiding_lines[i] = bw_int_to_fixed(2);
 705						if (data->orthogonal_rotation[i]) {
 706							data->bytes_per_request[i] = bw_int_to_fixed(32);
 707							data->useful_bytes_per_request[i] = bw_int_to_fixed(32);
 708						}
 709						else {
 710							data->bytes_per_request[i] = bw_int_to_fixed(64);
 711							data->useful_bytes_per_request[i] = bw_int_to_fixed(64);
 712						}
 713						break;
 714					case 4:
 715						if (data->orthogonal_rotation[i]) {
 716							data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
 717							data->latency_hiding_lines[i] = bw_int_to_fixed(2);
 718							data->bytes_per_request[i] = bw_int_to_fixed(32);
 719							data->useful_bytes_per_request[i] = bw_int_to_fixed(16);
 720						}
 721						else {
 722							data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
 723							data->latency_hiding_lines[i] = bw_int_to_fixed(2);
 724							data->bytes_per_request[i] = bw_int_to_fixed(64);
 725							data->useful_bytes_per_request[i] = bw_int_to_fixed(64);
 726						}
 727						break;
 728					case 2:
 729						data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
 730						data->latency_hiding_lines[i] = bw_int_to_fixed(2);
 731						data->bytes_per_request[i] = bw_int_to_fixed(32);
 732						data->useful_bytes_per_request[i] = bw_int_to_fixed(32);
 733						break;
 734					default:
 735						data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
 736						data->latency_hiding_lines[i] = bw_int_to_fixed(2);
 737						data->bytes_per_request[i] = bw_int_to_fixed(32);
 738						data->useful_bytes_per_request[i] = bw_int_to_fixed(16);
 739						break;
 740					}
 741				}
 742				else {
 743					data->bytes_per_request[i] = bw_int_to_fixed(64);
 744					data->useful_bytes_per_request[i] = bw_int_to_fixed(64);
 745					if (data->orthogonal_rotation[i]) {
 746						data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(8);
 747						data->latency_hiding_lines[i] = bw_int_to_fixed(4);
 748					}
 749					else {
 750						switch (data->bytes_per_pixel[i]) {
 751						case 4:
 752							data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
 753							data->latency_hiding_lines[i] = bw_int_to_fixed(2);
 754							break;
 755						case 2:
 756							data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(4);
 757							data->latency_hiding_lines[i] = bw_int_to_fixed(4);
 758							break;
 759						default:
 760							data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(8);
 761							data->latency_hiding_lines[i] = bw_int_to_fixed(4);
 762							break;
 763						}
 764					}
 765				}
 766			}
 767		}
 768	}
 769	/*requested peak bandwidth:*/
 770	/*the peak request-per-second bandwidth is the product of the maximum source lines in per line out in the beginning*/
 771	/*and in the middle of the frame, the ratio of the source width to the line time, the ratio of line interleaving*/
 772	/*in memory to lines of latency hiding, and the ratio of bytes per pixel to useful bytes per request.*/
 773	/**/
 774	/*if the dmif data buffer size holds more than vta_ps worth of source lines, then only vsr is used.*/
 775	/*the peak bandwidth is the peak request-per-second bandwidth times the request size.*/
 776	/**/
 777	/*the line buffer lines in per line out in the beginning of the frame is the vertical filter initialization value*/
 778	/*rounded up to even and divided by the line times for initialization, which is normally three.*/
 779	/*the line buffer lines in per line out in the middle of the frame is at least one, or the vertical scale ratio,*/
 780	/*rounded up to line pairs if not doing line buffer prefetching.*/
 781	/**/
 782	/*the non-prefetching rounding up of the vertical scale ratio can also be done up to 1 (for a 0,2 pattern), 4/3 (for a 0,2,2 pattern),*/
 783	/*6/4 (for a 0,2,2,2 pattern), or 3 (for a 2,4 pattern).*/
 784	/**/
 785	/*the scaler vertical filter initialization value is calculated by the hardware as the floor of the average of the*/
 786	/*vertical scale ratio and the number of vertical taps increased by one.  add one more for possible odd line*/
 787	/*panning/bezel adjustment mode.*/
 788	/**/
 789	/*for the bottom interlace field an extra 50% of the vertical scale ratio is considered for this calculation.*/
 790	/*in top-bottom stereo mode software has to set the filter initialization value manually and explicitly limit it to 4.*/
 791	/*furthermore, there is only one line time for initialization.*/
 792	/**/
 793	/*line buffer prefetching is done when the number of lines in the line buffer exceeds the number of taps plus*/
 794	/*the ceiling of the vertical scale ratio.*/
 795	/**/
 796	/*multi-line buffer prefetching is only done in the graphics pipe when the scaler is disabled or when upscaling and the vsr <= 0.8.'*/
 797	/**/
 798	/*the horizontal blank and chunk granularity factor is indirectly used indicate the interval of time required to transfer the source pixels.*/
 799	/*the denominator of this term represents the total number of destination output pixels required for the input source pixels.*/
 800	/*it applies when the lines in per line out is not 2 or 4.  it does not apply when there is a line buffer between the scl and blnd.*/
 801	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 802		if (data->enable[i]) {
 803			data->v_filter_init[i] = bw_floor2(bw_div((bw_add(bw_add(bw_add(bw_int_to_fixed(1), data->v_taps[i]), data->vsr[i]), bw_mul(bw_mul(bw_int_to_fixed(data->interlace_mode[i]), bw_frc_to_fixed(5, 10)), data->vsr[i]))), bw_int_to_fixed(2)), bw_int_to_fixed(1));
 804			if (data->panning_and_bezel_adjustment == bw_def_any_lines) {
 805				data->v_filter_init[i] = bw_add(data->v_filter_init[i], bw_int_to_fixed(1));
 806			}
 807			if (data->stereo_mode[i] == bw_def_top_bottom) {
 808				data->v_filter_init[i] = bw_min2(data->v_filter_init[i], bw_int_to_fixed(4));
 809			}
 810			if (data->stereo_mode[i] == bw_def_top_bottom) {
 811				data->num_lines_at_frame_start = bw_int_to_fixed(1);
 812			}
 813			else {
 814				data->num_lines_at_frame_start = bw_int_to_fixed(3);
 815			}
 816			if ((bw_mtn(data->vsr[i], bw_int_to_fixed(1)) && surface_type[i] == bw_def_graphics) || data->panning_and_bezel_adjustment == bw_def_any_lines) {
 817				data->line_buffer_prefetch[i] = 0;
 818			}
 819			else if ((((dceip->underlay_downscale_prefetch_enabled == 1 && surface_type[i] != bw_def_graphics) || surface_type[i] == bw_def_graphics) && (bw_mtn(data->lb_partitions[i], bw_add(data->v_taps[i], bw_ceil2(data->vsr[i], bw_int_to_fixed(1))))))) {
 820				data->line_buffer_prefetch[i] = 1;
 821			}
 822			else {
 823				data->line_buffer_prefetch[i] = 0;
 824			}
 825			data->lb_lines_in_per_line_out_in_beginning_of_frame[i] = bw_div(bw_ceil2(data->v_filter_init[i], bw_int_to_fixed(dceip->lines_interleaved_into_lb)), data->num_lines_at_frame_start);
 826			if (data->line_buffer_prefetch[i] == 1) {
 827				data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_max2(bw_int_to_fixed(1), data->vsr[i]);
 828			}
 829			else if (bw_leq(data->vsr[i], bw_int_to_fixed(1))) {
 830				data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_int_to_fixed(1);
 831			} else if (bw_leq(data->vsr[i],
 832					bw_frc_to_fixed(4, 3))) {
 833				data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_div(bw_int_to_fixed(4), bw_int_to_fixed(3));
 834			} else if (bw_leq(data->vsr[i],
 835					bw_frc_to_fixed(6, 4))) {
 836				data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_div(bw_int_to_fixed(6), bw_int_to_fixed(4));
 837			}
 838			else if (bw_leq(data->vsr[i], bw_int_to_fixed(2))) {
 839				data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_int_to_fixed(2);
 840			}
 841			else if (bw_leq(data->vsr[i], bw_int_to_fixed(3))) {
 842				data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_int_to_fixed(3);
 843			}
 844			else {
 845				data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_int_to_fixed(4);
 846			}
 847			if (data->line_buffer_prefetch[i] == 1 || bw_equ(data->lb_lines_in_per_line_out_in_middle_of_frame[i], bw_int_to_fixed(2)) || bw_equ(data->lb_lines_in_per_line_out_in_middle_of_frame[i], bw_int_to_fixed(4))) {
 848				data->horizontal_blank_and_chunk_granularity_factor[i] = bw_int_to_fixed(1);
 849			}
 850			else {
 851				data->horizontal_blank_and_chunk_granularity_factor[i] = bw_div(data->h_total[i], (bw_div((bw_add(data->h_total[i], bw_div((bw_sub(data->source_width_pixels[i], bw_int_to_fixed(dceip->chunk_width))), data->hsr[i]))), bw_int_to_fixed(2))));
 852			}
 853			data->request_bandwidth[i] = bw_div(bw_mul(bw_div(bw_mul(bw_div(bw_mul(bw_max2(data->lb_lines_in_per_line_out_in_beginning_of_frame[i], data->lb_lines_in_per_line_out_in_middle_of_frame[i]), data->source_width_rounded_up_to_chunks[i]), (bw_div(data->h_total[i], data->pixel_rate[i]))), bw_int_to_fixed(data->bytes_per_pixel[i])), data->useful_bytes_per_request[i]), data->lines_interleaved_in_mem_access[i]), data->latency_hiding_lines[i]);
 854			data->display_bandwidth[i] = bw_mul(data->request_bandwidth[i], data->bytes_per_request[i]);
 855		}
 856	}
 857	/*outstanding chunk request limit*/
 858	/*if underlay buffer sharing is enabled, the data buffer size for underlay in 422 or 444 is the sum of the luma and chroma data buffer sizes.*/
 859	/*underlay buffer sharing mode is only permitted in orthogonal rotation modes.*/
 860	/**/
 861	/*if there is only one display enabled, the dmif data buffer size for the graphics surface is increased by concatenating the adjacent buffers.*/
 862	/**/
 863	/*the memory chunk size in bytes is 1024 for the writeback, and 256 times the memory line interleaving and the bytes per pixel for graphics*/
 864	/*and underlay.*/
 865	/**/
 866	/*the pipe chunk size uses 2 for line interleaving, except for the write back, in which case it is 1.*/
 867	/*graphics and underlay data buffer size is adjusted (limited) using the outstanding chunk request limit if there is more than one*/
 868	/*display enabled or if the dmif request buffer is not large enough for the total data buffer size.*/
 869	/*the outstanding chunk request limit is the ceiling of the adjusted data buffer size divided by the chunk size in bytes*/
 870	/*the adjusted data buffer size is the product of the display bandwidth and the minimum effective data buffer size in terms of time,*/
 871	/*rounded up to the chunk size in bytes, but should not exceed the original data buffer size*/
 872	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 873		if (data->enable[i]) {
 874			if ((dceip->dmif_pipe_en_fbc_chunk_tracker + 3 == i && fbc_enabled == 0 && tiling_mode[i] != bw_def_linear)) {
 875				data->max_chunks_non_fbc_mode[i] = 128 - dmif_chunk_buff_margin;
 876			}
 877			else {
 878				data->max_chunks_non_fbc_mode[i] = 16 - dmif_chunk_buff_margin;
 879			}
 880		}
 881		if (data->fbc_en[i] == 1) {
 882			max_chunks_fbc_mode = 128 - dmif_chunk_buff_margin;
 883		}
 884	}
 885	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 886		if (data->enable[i]) {
 887			switch (surface_type[i]) {
 888			case bw_def_display_write_back420_luma:
 889				data->data_buffer_size[i] = bw_int_to_fixed(dceip->display_write_back420_luma_mcifwr_buffer_size);
 890				break;
 891			case bw_def_display_write_back420_chroma:
 892				data->data_buffer_size[i] = bw_int_to_fixed(dceip->display_write_back420_chroma_mcifwr_buffer_size);
 893				break;
 894			case bw_def_underlay420_luma:
 895				data->data_buffer_size[i] = bw_int_to_fixed(dceip->underlay_luma_dmif_size);
 896				break;
 897			case bw_def_underlay420_chroma:
 898				data->data_buffer_size[i] = bw_div(bw_int_to_fixed(dceip->underlay_chroma_dmif_size), bw_int_to_fixed(2));
 899				break;
 900			case bw_def_underlay422:case bw_def_underlay444:
 901				if (data->orthogonal_rotation[i] == 0) {
 902					data->data_buffer_size[i] = bw_int_to_fixed(dceip->underlay_luma_dmif_size);
 903				}
 904				else {
 905					data->data_buffer_size[i] = bw_add(bw_int_to_fixed(dceip->underlay_luma_dmif_size), bw_int_to_fixed(dceip->underlay_chroma_dmif_size));
 906				}
 907				break;
 908			default:
 909				if (data->fbc_en[i] == 1) {
 910					/*data_buffer_size(i) = max_dmif_buffer_allocated * graphics_dmif_size*/
 911					if (data->number_of_displays == 1) {
 912						data->data_buffer_size[i] = bw_min2(bw_mul(bw_mul(bw_int_to_fixed(max_chunks_fbc_mode), bw_int_to_fixed(pixels_per_chunk)), bw_int_to_fixed(data->bytes_per_pixel[i])), bw_mul(bw_int_to_fixed(dceip->max_dmif_buffer_allocated), bw_int_to_fixed(dceip->graphics_dmif_size)));
 913					}
 914					else {
 915						data->data_buffer_size[i] = bw_min2(bw_mul(bw_mul(bw_int_to_fixed(max_chunks_fbc_mode), bw_int_to_fixed(pixels_per_chunk)), bw_int_to_fixed(data->bytes_per_pixel[i])), bw_int_to_fixed(dceip->graphics_dmif_size));
 916					}
 917				}
 918				else {
 919					/*the effective dmif buffer size in non-fbc mode is limited by the 16 entry chunk tracker*/
 920					if (data->number_of_displays == 1) {
 921						data->data_buffer_size[i] = bw_min2(bw_mul(bw_mul(bw_int_to_fixed(data->max_chunks_non_fbc_mode[i]), bw_int_to_fixed(pixels_per_chunk)), bw_int_to_fixed(data->bytes_per_pixel[i])), bw_mul(bw_int_to_fixed(dceip->max_dmif_buffer_allocated), bw_int_to_fixed(dceip->graphics_dmif_size)));
 922					}
 923					else {
 924						data->data_buffer_size[i] = bw_min2(bw_mul(bw_mul(bw_int_to_fixed(data->max_chunks_non_fbc_mode[i]), bw_int_to_fixed(pixels_per_chunk)), bw_int_to_fixed(data->bytes_per_pixel[i])), bw_int_to_fixed(dceip->graphics_dmif_size));
 925					}
 926				}
 927				break;
 928			}
 929			if (surface_type[i] == bw_def_display_write_back420_luma || surface_type[i] == bw_def_display_write_back420_chroma) {
 930				data->memory_chunk_size_in_bytes[i] = bw_int_to_fixed(1024);
 931				data->pipe_chunk_size_in_bytes[i] = bw_int_to_fixed(1024);
 932			}
 933			else {
 934				data->memory_chunk_size_in_bytes[i] = bw_mul(bw_mul(bw_int_to_fixed(dceip->chunk_width), data->lines_interleaved_in_mem_access[i]), bw_int_to_fixed(data->bytes_per_pixel[i]));
 935				data->pipe_chunk_size_in_bytes[i] = bw_mul(bw_mul(bw_int_to_fixed(dceip->chunk_width), bw_int_to_fixed(dceip->lines_interleaved_into_lb)), bw_int_to_fixed(data->bytes_per_pixel[i]));
 936			}
 937		}
 938	}
 939	data->min_dmif_size_in_time = bw_int_to_fixed(9999);
 940	data->min_mcifwr_size_in_time = bw_int_to_fixed(9999);
 941	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 942		if (data->enable[i]) {
 943			if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
 944				if (bw_ltn(bw_div(bw_div(bw_mul(data->data_buffer_size[i], data->bytes_per_request[i]), data->useful_bytes_per_request[i]), data->display_bandwidth[i]), data->min_dmif_size_in_time)) {
 945					data->min_dmif_size_in_time = bw_div(bw_div(bw_mul(data->data_buffer_size[i], data->bytes_per_request[i]), data->useful_bytes_per_request[i]), data->display_bandwidth[i]);
 946				}
 947			}
 948			else {
 949				if (bw_ltn(bw_div(bw_div(bw_mul(data->data_buffer_size[i], data->bytes_per_request[i]), data->useful_bytes_per_request[i]), data->display_bandwidth[i]), data->min_mcifwr_size_in_time)) {
 950					data->min_mcifwr_size_in_time = bw_div(bw_div(bw_mul(data->data_buffer_size[i], data->bytes_per_request[i]), data->useful_bytes_per_request[i]), data->display_bandwidth[i]);
 951				}
 952			}
 953		}
 954	}
 955	data->total_requests_for_dmif_size = bw_int_to_fixed(0);
 956	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 957		if (data->enable[i] && surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
 958			data->total_requests_for_dmif_size = bw_add(data->total_requests_for_dmif_size, bw_div(data->data_buffer_size[i], data->useful_bytes_per_request[i]));
 959		}
 960	}
 961	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 962		if (data->enable[i]) {
 963			if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma && dceip->limit_excessive_outstanding_dmif_requests && (data->number_of_displays > 1 || bw_mtn(data->total_requests_for_dmif_size, dceip->dmif_request_buffer_size))) {
 964				data->adjusted_data_buffer_size[i] = bw_min2(data->data_buffer_size[i], bw_ceil2(bw_mul(data->min_dmif_size_in_time, data->display_bandwidth[i]), data->memory_chunk_size_in_bytes[i]));
 965			}
 966			else {
 967				data->adjusted_data_buffer_size[i] = data->data_buffer_size[i];
 968			}
 969		}
 970	}
 971	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
 972		if (data->enable[i]) {
 973			if (data->number_of_displays == 1 && data->number_of_underlay_surfaces == 0) {
 974				/*set maximum chunk limit if only one graphic pipe is enabled*/
 975				data->outstanding_chunk_request_limit[i] = bw_int_to_fixed(127);
 976			}
 977			else {
 978				data->outstanding_chunk_request_limit[i] = bw_ceil2(bw_div(data->adjusted_data_buffer_size[i], data->pipe_chunk_size_in_bytes[i]), bw_int_to_fixed(1));
 979				/*clamp maximum chunk limit in the graphic display pipe*/
 980				if (i >= 4) {
 981					data->outstanding_chunk_request_limit[i] = bw_max2(bw_int_to_fixed(127), data->outstanding_chunk_request_limit[i]);
 982				}
 983			}
 984		}
 985	}
 986	/*outstanding pte request limit*/
 987	/*in tiling mode with no rotation the sg pte requests are 8 useful pt_es, the sg row height is the page height and the sg page width x height is 64x64 for 8bpp, 64x32 for 16 bpp, 32x32 for 32 bpp*/
 988	/*in tiling mode with rotation the sg pte requests are only one useful pte, and the sg row height is also the page height, but the sg page width and height are swapped*/
 989	/*in linear mode the pte requests are 8 useful pt_es, the sg page width is 4096 divided by the bytes per pixel, the sg page height is 1, but there is just one row whose height is the lines of pte prefetching*/
 990	/*the outstanding pte request limit is obtained by multiplying the outstanding chunk request limit by the peak pte request to eviction limiting ratio, rounding up to integer, multiplying by the pte requests per chunk, and rounding up to integer again*/
 991	/*if not using peak pte request to eviction limiting, the outstanding pte request limit is the pte requests in the vblank*/
 992	/*the pte requests in the vblank is the product of the number of pte request rows times the number of pte requests in a row*/
 993	/*the number of pte requests in a row is the quotient of the source width divided by 256, multiplied by the pte requests per chunk, rounded up to even, multiplied by the scatter-gather row height and divided by the scatter-gather page height*/
 994	/*the pte requests per chunk is 256 divided by the scatter-gather page width and the useful pt_es per pte request*/
 995	if (data->number_of_displays > 1 || (bw_neq(data->rotation_angle[4], bw_int_to_fixed(0)) && bw_neq(data->rotation_angle[4], bw_int_to_fixed(180)))) {
 996		data->peak_pte_request_to_eviction_ratio_limiting = dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display;
 997	}
 998	else {
 999		data->peak_pte_request_to_eviction_ratio_limiting = dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation;
1000	}
1001	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1002		if (data->enable[i] && data->scatter_gather_enable_for_pipe[i] == 1) {
1003			if (tiling_mode[i] == bw_def_linear) {
1004				data->useful_pte_per_pte_request = bw_int_to_fixed(8);
1005				data->scatter_gather_page_width[i] = bw_div(bw_int_to_fixed(4096), bw_int_to_fixed(data->bytes_per_pixel[i]));
1006				data->scatter_gather_page_height[i] = bw_int_to_fixed(1);
1007				data->scatter_gather_pte_request_rows = bw_int_to_fixed(1);
1008				data->scatter_gather_row_height = bw_int_to_fixed(dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode);
1009			}
1010			else if (bw_equ(data->rotation_angle[i], bw_int_to_fixed(0)) || bw_equ(data->rotation_angle[i], bw_int_to_fixed(180))) {
1011				data->useful_pte_per_pte_request = bw_int_to_fixed(8);
1012				switch (data->bytes_per_pixel[i]) {
1013				case 4:
1014					data->scatter_gather_page_width[i] = bw_int_to_fixed(32);
1015					data->scatter_gather_page_height[i] = bw_int_to_fixed(32);
1016					break;
1017				case 2:
1018					data->scatter_gather_page_width[i] = bw_int_to_fixed(64);
1019					data->scatter_gather_page_height[i] = bw_int_to_fixed(32);
1020					break;
1021				default:
1022					data->scatter_gather_page_width[i] = bw_int_to_fixed(64);
1023					data->scatter_gather_page_height[i] = bw_int_to_fixed(64);
1024					break;
1025				}
1026				data->scatter_gather_pte_request_rows = bw_int_to_fixed(dceip->scatter_gather_pte_request_rows_in_tiling_mode);
1027				data->scatter_gather_row_height = data->scatter_gather_page_height[i];
1028			}
1029			else {
1030				data->useful_pte_per_pte_request = bw_int_to_fixed(1);
1031				switch (data->bytes_per_pixel[i]) {
1032				case 4:
1033					data->scatter_gather_page_width[i] = bw_int_to_fixed(32);
1034					data->scatter_gather_page_height[i] = bw_int_to_fixed(32);
1035					break;
1036				case 2:
1037					data->scatter_gather_page_width[i] = bw_int_to_fixed(32);
1038					data->scatter_gather_page_height[i] = bw_int_to_fixed(64);
1039					break;
1040				default:
1041					data->scatter_gather_page_width[i] = bw_int_to_fixed(64);
1042					data->scatter_gather_page_height[i] = bw_int_to_fixed(64);
1043					break;
1044				}
1045				data->scatter_gather_pte_request_rows = bw_int_to_fixed(dceip->scatter_gather_pte_request_rows_in_tiling_mode);
1046				data->scatter_gather_row_height = data->scatter_gather_page_height[i];
1047			}
1048			data->pte_request_per_chunk[i] = bw_div(bw_div(bw_int_to_fixed(dceip->chunk_width), data->scatter_gather_page_width[i]), data->useful_pte_per_pte_request);
1049			data->scatter_gather_pte_requests_in_row[i] = bw_div(bw_mul(bw_ceil2(bw_mul(bw_div(data->source_width_rounded_up_to_chunks[i], bw_int_to_fixed(dceip->chunk_width)), data->pte_request_per_chunk[i]), bw_int_to_fixed(1)), data->scatter_gather_row_height), data->scatter_gather_page_height[i]);
1050			data->scatter_gather_pte_requests_in_vblank = bw_mul(data->scatter_gather_pte_request_rows, data->scatter_gather_pte_requests_in_row[i]);
1051			if (bw_equ(data->peak_pte_request_to_eviction_ratio_limiting, bw_int_to_fixed(0))) {
1052				data->scatter_gather_pte_request_limit[i] = data->scatter_gather_pte_requests_in_vblank;
1053			}
1054			else {
1055				data->scatter_gather_pte_request_limit[i] = bw_max2(dceip->minimum_outstanding_pte_request_limit, bw_min2(data->scatter_gather_pte_requests_in_vblank, bw_ceil2(bw_mul(bw_mul(bw_div(bw_ceil2(data->adjusted_data_buffer_size[i], data->memory_chunk_size_in_bytes[i]), data->memory_chunk_size_in_bytes[i]), data->pte_request_per_chunk[i]), data->peak_pte_request_to_eviction_ratio_limiting), bw_int_to_fixed(1))));
1056			}
1057		}
1058	}
1059	/*pitch padding recommended for efficiency in linear mode*/
1060	/*in linear mode graphics or underlay with scatter gather, a pitch that is a multiple of the channel interleave (256 bytes) times the channel-bank rotation is not efficient*/
1061	/*if that is the case it is recommended to pad the pitch by at least 256 pixels*/
1062	data->inefficient_linear_pitch_in_bytes = bw_mul(bw_mul(bw_int_to_fixed(256), bw_int_to_fixed(vbios->number_of_dram_banks)), bw_int_to_fixed(data->number_of_dram_channels));
1063
1064	/*pixel transfer time*/
1065	/*the dmif and mcifwr yclk(pclk) required is the one that allows the transfer of all pipe's data buffer size in memory in the time for data transfer*/
1066	/*for dmif, pte and cursor requests have to be included.*/
1067	/*the dram data requirement is doubled when the data request size in bytes is less than the dram channel width times the burst size (8)*/
1068	/*the dram data requirement is also multiplied by the number of channels in the case of low power tiling*/
1069	/*the page close-open time is determined by trc and the number of page close-opens*/
1070	/*in tiled mode graphics or underlay with scatter-gather enabled the bytes per page close-open is the product of the memory line interleave times the maximum of the scatter-gather page width and the product of the tile width (8 pixels) times the number of channels times the number of banks.*/
1071	/*in linear mode graphics or underlay with scatter-gather enabled and inefficient pitch, the bytes per page close-open is the line request alternation slice, because different lines are in completely different 4k address bases.*/
1072	/*otherwise, the bytes page close-open is the chunk size because that is the arbitration slice.*/
1073	/*pte requests are grouped by pte requests per chunk if that is more than 1. each group costs a page close-open time for dmif reads*/
1074	/*cursor requests outstanding are limited to a group of two source lines. each group costs a page close-open time for dmif reads*/
1075	/*the display reads and writes time for data transfer is the minimum data or cursor buffer size in time minus the mc urgent latency*/
1076	/*the mc urgent latency is experienced more than one time if the number of dmif requests in the data buffer exceeds the request buffer size plus the request slots reserved for dmif in the dram channel arbiter queues*/
1077	/*the dispclk required is the maximum for all surfaces of the maximum of the source pixels for first output pixel times the throughput factor, divided by the pixels per dispclk, and divided by the minimum latency hiding minus the dram speed/p-state change latency minus the burst time, and the source pixels for last output pixel, times the throughput factor, divided by the pixels per dispclk, and divided by the minimum latency hiding minus the dram speed/p-state change latency minus the burst time, plus the active time.*/
1078	/*the data burst time is the maximum of the total page close-open time, total dmif/mcifwr buffer size in memory divided by the dram bandwidth, and the total dmif/mcifwr buffer size in memory divided by the 32 byte sclk data bus bandwidth, each multiplied by its efficiency.*/
1079	/*the source line transfer time is the maximum for all surfaces of the maximum of the burst time plus the urgent latency times the floor of the data required divided by the buffer size for the fist pixel, and the burst time plus the urgent latency times the floor of the data required divided by the buffer size for the last pixel plus the active time.*/
1080	/*the source pixels for the first output pixel is 512 if the scaler vertical filter initialization value is greater than 2, and it is 4 times the source width if it is greater than 4.*/
1081	/*the source pixels for the last output pixel is the source width times the scaler vertical filter initialization value rounded up to even*/
1082	/*the source data for these pixels is the number of pixels times the bytes per pixel times the bytes per request divided by the useful bytes per request.*/
1083	data->cursor_total_data = bw_int_to_fixed(0);
1084	data->cursor_total_request_groups = bw_int_to_fixed(0);
1085	data->scatter_gather_total_pte_requests = bw_int_to_fixed(0);
1086	data->scatter_gather_total_pte_request_groups = bw_int_to_fixed(0);
1087	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1088		if (data->enable[i]) {
1089			data->cursor_total_data = bw_add(data->cursor_total_data, bw_mul(bw_mul(bw_int_to_fixed(2), data->cursor_width_pixels[i]), bw_int_to_fixed(4)));
1090			if (dceip->large_cursor == 1) {
1091				data->cursor_total_request_groups = bw_add(data->cursor_total_request_groups, bw_int_to_fixed((dceip->cursor_max_outstanding_group_num + 1)));
1092			}
1093			else {
1094				data->cursor_total_request_groups = bw_add(data->cursor_total_request_groups, bw_ceil2(bw_div(data->cursor_width_pixels[i], dceip->cursor_chunk_width), bw_int_to_fixed(1)));
1095			}
1096			if (data->scatter_gather_enable_for_pipe[i]) {
1097				data->scatter_gather_total_pte_requests = bw_add(data->scatter_gather_total_pte_requests, data->scatter_gather_pte_request_limit[i]);
1098				data->scatter_gather_total_pte_request_groups = bw_add(data->scatter_gather_total_pte_request_groups, bw_ceil2(bw_div(data->scatter_gather_pte_request_limit[i], bw_ceil2(data->pte_request_per_chunk[i], bw_int_to_fixed(1))), bw_int_to_fixed(1)));
1099			}
1100		}
1101	}
1102	data->tile_width_in_pixels = bw_int_to_fixed(8);
1103	data->dmif_total_number_of_data_request_page_close_open = bw_int_to_fixed(0);
1104	data->mcifwr_total_number_of_data_request_page_close_open = bw_int_to_fixed(0);
1105	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1106		if (data->enable[i]) {
1107			if (data->scatter_gather_enable_for_pipe[i] == 1 && tiling_mode[i] != bw_def_linear) {
1108				data->bytes_per_page_close_open = bw_mul(data->lines_interleaved_in_mem_access[i], bw_max2(bw_mul(bw_mul(bw_mul(bw_int_to_fixed(data->bytes_per_pixel[i]), data->tile_width_in_pixels), bw_int_to_fixed(vbios->number_of_dram_banks)), bw_int_to_fixed(data->number_of_dram_channels)), bw_mul(bw_int_to_fixed(data->bytes_per_pixel[i]), data->scatter_gather_page_width[i])));
1109			}
1110			else if (data->scatter_gather_enable_for_pipe[i] == 1 && tiling_mode[i] == bw_def_linear && bw_equ(bw_mod((bw_mul(data->pitch_in_pixels_after_surface_type[i], bw_int_to_fixed(data->bytes_per_pixel[i]))), data->inefficient_linear_pitch_in_bytes), bw_int_to_fixed(0))) {
1111				data->bytes_per_page_close_open = dceip->linear_mode_line_request_alternation_slice;
1112			}
1113			else {
1114				data->bytes_per_page_close_open = data->memory_chunk_size_in_bytes[i];
1115			}
1116			if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
1117				data->dmif_total_number_of_data_request_page_close_open = bw_add(data->dmif_total_number_of_data_request_page_close_open, bw_div(bw_ceil2(data->adjusted_data_buffer_size[i], data->memory_chunk_size_in_bytes[i]), data->bytes_per_page_close_open));
1118			}
1119			else {
1120				data->mcifwr_total_number_of_data_request_page_close_open = bw_add(data->mcifwr_total_number_of_data_request_page_close_open, bw_div(bw_ceil2(data->adjusted_data_buffer_size[i], data->memory_chunk_size_in_bytes[i]), data->bytes_per_page_close_open));
1121			}
1122		}
1123	}
1124	data->dmif_total_page_close_open_time = bw_div(bw_mul((bw_add(bw_add(data->dmif_total_number_of_data_request_page_close_open, data->scatter_gather_total_pte_request_groups), data->cursor_total_request_groups)), vbios->trc), bw_int_to_fixed(1000));
1125	data->mcifwr_total_page_close_open_time = bw_div(bw_mul(data->mcifwr_total_number_of_data_request_page_close_open, vbios->trc), bw_int_to_fixed(1000));
1126	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1127		if (data->enable[i]) {
1128			data->adjusted_data_buffer_size_in_memory[i] = bw_div(bw_mul(data->adjusted_data_buffer_size[i], data->bytes_per_request[i]), data->useful_bytes_per_request[i]);
1129		}
1130	}
1131	data->total_requests_for_adjusted_dmif_size = bw_int_to_fixed(0);
1132	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1133		if (data->enable[i]) {
1134			if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
1135				data->total_requests_for_adjusted_dmif_size = bw_add(data->total_requests_for_adjusted_dmif_size, bw_div(data->adjusted_data_buffer_size[i], data->useful_bytes_per_request[i]));
1136			}
1137		}
1138	}
1139	data->total_dmifmc_urgent_trips = bw_ceil2(bw_div(data->total_requests_for_adjusted_dmif_size, (bw_add(dceip->dmif_request_buffer_size, bw_int_to_fixed(vbios->number_of_request_slots_gmc_reserves_for_dmif_per_channel * data->number_of_dram_channels)))), bw_int_to_fixed(1));
1140	data->total_dmifmc_urgent_latency = bw_mul(vbios->dmifmc_urgent_latency, data->total_dmifmc_urgent_trips);
1141	data->total_display_reads_required_data = bw_int_to_fixed(0);
1142	data->total_display_reads_required_dram_access_data = bw_int_to_fixed(0);
1143	data->total_display_writes_required_data = bw_int_to_fixed(0);
1144	data->total_display_writes_required_dram_access_data = bw_int_to_fixed(0);
1145	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1146		if (data->enable[i]) {
1147			if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
1148				data->display_reads_required_data = data->adjusted_data_buffer_size_in_memory[i];
1149				/*for hbm memories, each channel is split into 2 pseudo-channels that are each 64 bits in width.  each*/
1150				/*pseudo-channel may be read independently of one another.*/
1151				/*the read burst length (bl) for hbm memories is 4, so each read command will access 32 bytes of data.*/
1152				/*the 64 or 32 byte sized data is stored in one pseudo-channel.*/
1153				/*it will take 4 memclk cycles or 8 yclk cycles to fetch 64 bytes of data from the hbm memory (2 read commands).*/
1154				/*it will take 2 memclk cycles or 4 yclk cycles to fetch 32 bytes of data from the hbm memory (1 read command).*/
1155				/*for gddr5/ddr4 memories, there is additional overhead if the size of the request is smaller than 64 bytes.*/
1156				/*the read burst length (bl) for gddr5/ddr4 memories is 8, regardless of the size of the data request.*/
1157				/*therefore it will require 8 cycles to fetch 64 or 32 bytes of data from the memory.*/
1158				/*the memory efficiency will be 50% for the 32 byte sized data.*/
1159				if (vbios->memory_type == bw_def_hbm) {
1160					data->display_reads_required_dram_access_data = data->adjusted_data_buffer_size_in_memory[i];
1161				}
1162				else {
1163					data->display_reads_required_dram_access_data = bw_mul(data->adjusted_data_buffer_size_in_memory[i], bw_ceil2(bw_div(bw_int_to_fixed((8 * vbios->dram_channel_width_in_bits / 8)), data->bytes_per_request[i]), bw_int_to_fixed(1)));
1164				}
1165				data->total_display_reads_required_data = bw_add(data->total_display_reads_required_data, data->display_reads_required_data);
1166				data->total_display_reads_required_dram_access_data = bw_add(data->total_display_reads_required_dram_access_data, data->display_reads_required_dram_access_data);
1167			}
1168			else {
1169				data->total_display_writes_required_data = bw_add(data->total_display_writes_required_data, data->adjusted_data_buffer_size_in_memory[i]);
1170				data->total_display_writes_required_dram_access_data = bw_add(data->total_display_writes_required_dram_access_data, bw_mul(data->adjusted_data_buffer_size_in_memory[i], bw_ceil2(bw_div(bw_int_to_fixed(vbios->dram_channel_width_in_bits), data->bytes_per_request[i]), bw_int_to_fixed(1))));
1171			}
1172		}
1173	}
1174	data->total_display_reads_required_data = bw_add(bw_add(data->total_display_reads_required_data, data->cursor_total_data), bw_mul(data->scatter_gather_total_pte_requests, bw_int_to_fixed(64)));
1175	data->total_display_reads_required_dram_access_data = bw_add(bw_add(data->total_display_reads_required_dram_access_data, data->cursor_total_data), bw_mul(data->scatter_gather_total_pte_requests, bw_int_to_fixed(64)));
1176	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1177		if (data->enable[i]) {
1178			if (bw_mtn(data->v_filter_init[i], bw_int_to_fixed(4))) {
1179				data->src_pixels_for_first_output_pixel[i] = bw_mul(bw_int_to_fixed(4), data->source_width_rounded_up_to_chunks[i]);
1180			}
1181			else {
1182				if (bw_mtn(data->v_filter_init[i], bw_int_to_fixed(2))) {
1183					data->src_pixels_for_first_output_pixel[i] = bw_int_to_fixed(512);
1184				}
1185				else {
1186					data->src_pixels_for_first_output_pixel[i] = bw_int_to_fixed(0);
1187				}
1188			}
1189			data->src_data_for_first_output_pixel[i] = bw_div(bw_mul(bw_mul(data->src_pixels_for_first_output_pixel[i], bw_int_to_fixed(data->bytes_per_pixel[i])), data->bytes_per_request[i]), data->useful_bytes_per_request[i]);
1190			data->src_pixels_for_last_output_pixel[i] = bw_mul(data->source_width_rounded_up_to_chunks[i], bw_max2(bw_ceil2(data->v_filter_init[i], bw_int_to_fixed(dceip->lines_interleaved_into_lb)), bw_mul(bw_ceil2(data->vsr[i], bw_int_to_fixed(dceip->lines_interleaved_into_lb)), data->horizontal_blank_and_chunk_granularity_factor[i])));
1191			data->src_data_for_last_output_pixel[i] = bw_div(bw_mul(bw_mul(bw_mul(data->source_width_rounded_up_to_chunks[i], bw_max2(bw_ceil2(data->v_filter_init[i], bw_int_to_fixed(dceip->lines_interleaved_into_lb)), data->lines_interleaved_in_mem_access[i])), bw_int_to_fixed(data->bytes_per_pixel[i])), data->bytes_per_request[i]), data->useful_bytes_per_request[i]);
1192			data->active_time[i] = bw_div(bw_div(data->source_width_rounded_up_to_chunks[i], data->hsr[i]), data->pixel_rate[i]);
1193		}
1194	}
1195	for (i = 0; i <= 2; i++) {
1196		for (j = 0; j <= 7; j++) {
1197			data->dmif_burst_time[i][j] = bw_max3(data->dmif_total_page_close_open_time, bw_div(data->total_display_reads_required_dram_access_data, (bw_mul(bw_div(bw_mul(bw_mul(data->dram_efficiency, yclk[i]), bw_int_to_fixed(vbios->dram_channel_width_in_bits)), bw_int_to_fixed(8)), bw_int_to_fixed(data->number_of_dram_channels)))), bw_div(data->total_display_reads_required_data, (bw_mul(bw_mul(sclk[j], vbios->data_return_bus_width), bw_frc_to_fixed(dceip->percent_of_ideal_port_bw_received_after_urgent_latency, 100)))));
1198			if (data->d1_display_write_back_dwb_enable == 1) {
1199				data->mcifwr_burst_time[i][j] = bw_max3(data->mcifwr_total_page_close_open_time, bw_div(data->total_display_writes_required_dram_access_data, (bw_mul(bw_div(bw_mul(bw_mul(data->dram_efficiency, yclk[i]), bw_int_to_fixed(vbios->dram_channel_width_in_bits)), bw_int_to_fixed(8)), bw_int_to_fixed(data->number_of_dram_wrchannels)))), bw_div(data->total_display_writes_required_data, (bw_mul(sclk[j], vbios->data_return_bus_width))));
1200			}
1201		}
1202	}
1203	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1204		for (j = 0; j <= 2; j++) {
1205			for (k = 0; k <= 7; k++) {
1206				if (data->enable[i]) {
1207					if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
1208						/*time to transfer data from the dmif buffer to the lb.  since the mc to dmif transfer time overlaps*/
1209						/*with the dmif to lb transfer time, only time to transfer the last chunk  is considered.*/
1210						data->dmif_buffer_transfer_time[i] = bw_mul(data->source_width_rounded_up_to_chunks[i], (bw_div(dceip->lb_write_pixels_per_dispclk, (bw_div(vbios->low_voltage_max_dispclk, dceip->display_pipe_throughput_factor)))));
1211						data->line_source_transfer_time[i][j][k] = bw_max2(bw_mul((bw_add(data->total_dmifmc_urgent_latency, data->dmif_burst_time[j][k])), bw_floor2(bw_div(data->src_data_for_first_output_pixel[i], data->adjusted_data_buffer_size_in_memory[i]), bw_int_to_fixed(1))), bw_sub(bw_add(bw_mul((bw_add(data->total_dmifmc_urgent_latency, data->dmif_burst_time[j][k])), bw_floor2(bw_div(data->src_data_for_last_output_pixel[i], data->adjusted_data_buffer_size_in_memory[i]), bw_int_to_fixed(1))), data->dmif_buffer_transfer_time[i]), data->active_time[i]));
1212						/*during an mclk switch the requests from the dce ip are stored in the gmc/arb.  these requests should be serviced immediately*/
1213						/*after the mclk switch sequence and not incur an urgent latency penalty.  it is assumed that the gmc/arb can hold up to 256 requests*/
1214						/*per memory channel.  if the dce ip is urgent after the mclk switch sequence, all pending requests and subsequent requests should be*/
1215						/*immediately serviced without a gap in the urgent requests.*/
1216						/*the latency incurred would be the time to issue the requests and return the data for the first or last output pixel.*/
1217						if (surface_type[i] == bw_def_graphics) {
1218							switch (data->lb_bpc[i]) {
1219							case 6:
1220								data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency6_bit_per_component;
1221								break;
1222							case 8:
1223								data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency8_bit_per_component;
1224								break;
1225							case 10:
1226								data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency10_bit_per_component;
1227								break;
1228							default:
1229								data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency12_bit_per_component;
1230								break;
1231							}
1232							if (data->use_alpha[i] == 1) {
1233								data->v_scaler_efficiency = bw_min2(data->v_scaler_efficiency, dceip->alpha_vscaler_efficiency);
1234							}
1235						}
1236						else {
1237							switch (data->lb_bpc[i]) {
1238							case 6:
1239								data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency6_bit_per_component;
1240								break;
1241							case 8:
1242								data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency8_bit_per_component;
1243								break;
1244							case 10:
1245								data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency10_bit_per_component;
1246								break;
1247							default:
1248								data->v_scaler_efficiency = bw_int_to_fixed(3);
1249								break;
1250							}
1251						}
1252						if (dceip->pre_downscaler_enabled && bw_mtn(data->hsr[i], bw_int_to_fixed(1))) {
1253							data->scaler_limits_factor = bw_max2(bw_div(data->v_taps[i], data->v_scaler_efficiency), bw_div(data->source_width_rounded_up_to_chunks[i], data->h_total[i]));
1254						}
1255						else {
1256							data->scaler_limits_factor = bw_max3(bw_int_to_fixed(1), bw_ceil2(bw_div(data->h_taps[i], bw_int_to_fixed(4)), bw_int_to_fixed(1)), bw_mul(data->hsr[i], bw_max2(bw_div(data->v_taps[i], data->v_scaler_efficiency), bw_int_to_fixed(1))));
1257						}
1258						data->dram_speed_change_line_source_transfer_time[i][j][k] = bw_mul(bw_int_to_fixed(2), bw_max2((bw_add((bw_div(data->src_data_for_first_output_pixel[i], bw_min2(bw_mul(data->bytes_per_request[i], sclk[k]), bw_div(bw_mul(bw_mul(data->bytes_per_request[i], data->pixel_rate[i]), data->scaler_limits_factor), bw_int_to_fixed(2))))), (bw_mul(data->dmif_burst_time[j][k], bw_floor2(bw_div(data->src_data_for_first_output_pixel[i], data->adjusted_data_buffer_size_in_memory[i]), bw_int_to_fixed(1)))))), (bw_add((bw_div(data->src_data_for_last_output_pixel[i], bw_min2(bw_mul(data->bytes_per_request[i], sclk[k]), bw_div(bw_mul(bw_mul(data->bytes_per_request[i], data->pixel_rate[i]), data->scaler_limits_factor), bw_int_to_fixed(2))))), (bw_sub(bw_mul(data->dmif_burst_time[j][k], bw_floor2(bw_div(data->src_data_for_last_output_pixel[i], data->adjusted_data_buffer_size_in_memory[i]), bw_int_to_fixed(1))), data->active_time[i]))))));
1259					}
1260					else {
1261						data->line_source_transfer_time[i][j][k] = bw_max2(bw_mul((bw_add(vbios->mcifwrmc_urgent_latency, data->mcifwr_burst_time[j][k])), bw_floor2(bw_div(data->src_data_for_first_output_pixel[i], data->adjusted_data_buffer_size_in_memory[i]), bw_int_to_fixed(1))), bw_sub(bw_mul((bw_add(vbios->mcifwrmc_urgent_latency, data->mcifwr_burst_time[j][k])), bw_floor2(bw_div(data->src_data_for_last_output_pixel[i], data->adjusted_data_buffer_size_in_memory[i]), bw_int_to_fixed(1))), data->active_time[i]));
1262						/*during an mclk switch the requests from the dce ip are stored in the gmc/arb.  these requests should be serviced immediately*/
1263						/*after the mclk switch sequence and not incur an urgent latency penalty.  it is assumed that the gmc/arb can hold up to 256 requests*/
1264						/*per memory channel.  if the dce ip is urgent after the mclk switch sequence, all pending requests and subsequent requests should be*/
1265						/*immediately serviced without a gap in the urgent requests.*/
1266						/*the latency incurred would be the time to issue the requests and return the data for the first or last output pixel.*/
1267						data->dram_speed_change_line_source_transfer_time[i][j][k] = bw_max2((bw_add((bw_div(data->src_data_for_first_output_pixel[i], bw_min2(bw_mul(data->bytes_per_request[i], sclk[k]), bw_div(bw_mul(data->bytes_per_request[i], vbios->low_voltage_max_dispclk), bw_int_to_fixed(2))))), (bw_mul(data->mcifwr_burst_time[j][k], bw_floor2(bw_div(data->src_data_for_first_output_pixel[i], data->adjusted_data_buffer_size_in_memory[i]), bw_int_to_fixed(1)))))), (bw_add((bw_div(data->src_data_for_last_output_pixel[i], bw_min2(bw_mul(data->bytes_per_request[i], sclk[k]), bw_div(bw_mul(data->bytes_per_request[i], vbios->low_voltage_max_dispclk), bw_int_to_fixed(2))))), (bw_sub(bw_mul(data->mcifwr_burst_time[j][k], bw_floor2(bw_div(data->src_data_for_last_output_pixel[i], data->adjusted_data_buffer_size_in_memory[i]), bw_int_to_fixed(1))), data->active_time[i])))));
1268					}
1269				}
1270			}
1271		}
1272	}
1273	/*cpu c-state and p-state change enable*/
1274	/*for cpu p-state change to be possible for a yclk(pclk) and sclk level the dispclk required has to be enough for the blackout duration*/
1275	/*for cpu c-state change to be possible for a yclk(pclk) and sclk level the dispclk required has to be enough for the blackout duration and recovery*/
1276	/*condition for the blackout duration:*/
1277	/* minimum latency hiding > blackout duration + dmif burst time + line source transfer time*/
1278	/*condition for the blackout recovery:*/
1279	/* recovery time >  dmif burst time + 2 * urgent latency*/
1280	/* recovery time > (display bw * blackout duration  + (2 * urgent latency + dmif burst time)*dispclk - dmif size )*/
1281	/*                  / (dispclk - display bw)*/
1282	/*the minimum latency hiding is the minimum for all pipes of one screen line time, plus one more line time if doing lb prefetch, plus the dmif data buffer size equivalent in time, minus the urgent latency.*/
1283	/*the minimum latency hiding is  further limited by the cursor.  the cursor latency hiding is the number of lines of the cursor buffer, minus one if the downscaling is less than two, or minus three if it is more*/
1284
1285	/*initialize variables*/
1286	number_of_displays_enabled = 0;
1287	number_of_displays_enabled_with_margin = 0;
1288	for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
1289		if (data->enable[k]) {
1290			number_of_displays_enabled = number_of_displays_enabled + 1;
1291		}
1292		data->display_pstate_change_enable[k] = 0;
1293	}
1294	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1295		if (data->enable[i]) {
1296			if ((bw_equ(dceip->stutter_and_dram_clock_state_change_gated_before_cursor, bw_int_to_fixed(0)) && bw_mtn(data->cursor_width_pixels[i], bw_int_to_fixed(0)))) {
1297				if (bw_ltn(data->vsr[i], bw_int_to_fixed(2))) {
1298					data->cursor_latency_hiding[i] = bw_div(bw_div(bw_mul((bw_sub(dceip->cursor_dcp_buffer_lines, bw_int_to_fixed(1))), data->h_total[i]), data->vsr[i]), data->pixel_rate[i]);
1299				}
1300				else {
1301					data->cursor_latency_hiding[i] = bw_div(bw_div(bw_mul((bw_sub(dceip->cursor_dcp_buffer_lines, bw_int_to_fixed(3))), data->h_total[i]), data->vsr[i]), data->pixel_rate[i]);
1302				}
1303			}
1304			else {
1305				data->cursor_latency_hiding[i] = bw_int_to_fixed(9999);
1306			}
1307		}
1308	}
1309	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1310		if (data->enable[i]) {
1311			if (dceip->graphics_lb_nodownscaling_multi_line_prefetching == 1 && (bw_equ(data->vsr[i], bw_int_to_fixed(1)) || (bw_leq(data->vsr[i], bw_frc_to_fixed(8, 10)) && bw_leq(data->v_taps[i], bw_int_to_fixed(2)) && data->lb_bpc[i] == 8)) && surface_type[i] == bw_def_graphics) {
1312				if (number_of_displays_enabled > 2)
1313					data->minimum_latency_hiding[i] = bw_sub(bw_div(bw_mul((bw_div((bw_add(bw_sub(data->lb_partitions[i], bw_int_to_fixed(2)), bw_div(bw_div(data->data_buffer_size[i], bw_int_to_fixed(data->bytes_per_pixel[i])), data->source_width_pixels[i]))), data->vsr[i])), data->h_total[i]), data->pixel_rate[i]), data->total_dmifmc_urgent_latency);
1314				else
1315					data->minimum_latency_hiding[i] = bw_sub(bw_div(bw_mul((bw_div((bw_add(bw_sub(data->lb_partitions[i], bw_int_to_fixed(1)), bw_div(bw_div(data->data_buffer_size[i], bw_int_to_fixed(data->bytes_per_pixel[i])), data->source_width_pixels[i]))), data->vsr[i])), data->h_total[i]), data->pixel_rate[i]), data->total_dmifmc_urgent_latency);
1316			}
1317			else {
1318				data->minimum_latency_hiding[i] = bw_sub(bw_div(bw_mul((bw_div((bw_add(bw_int_to_fixed(1 + data->line_buffer_prefetch[i]), bw_div(bw_div(data->data_buffer_size[i], bw_int_to_fixed(data->bytes_per_pixel[i])), data->source_width_pixels[i]))), data->vsr[i])), data->h_total[i]), data->pixel_rate[i]), data->total_dmifmc_urgent_latency);
1319			}
1320			data->minimum_latency_hiding_with_cursor[i] = bw_min2(data->minimum_latency_hiding[i], data->cursor_latency_hiding[i]);
1321		}
1322	}
1323	for (i = 0; i <= 2; i++) {
1324		for (j = 0; j <= 7; j++) {
1325			data->blackout_duration_margin[i][j] = bw_int_to_fixed(9999);
1326			data->dispclk_required_for_blackout_duration[i][j] = bw_int_to_fixed(0);
1327			data->dispclk_required_for_blackout_recovery[i][j] = bw_int_to_fixed(0);
1328			for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
1329				if (data->enable[k] && bw_mtn(vbios->blackout_duration, bw_int_to_fixed(0))) {
1330					if (surface_type[k] != bw_def_display_write_back420_luma && surface_type[k] != bw_def_display_write_back420_chroma) {
1331						data->blackout_duration_margin[i][j] = bw_min2(data->blackout_duration_margin[i][j], bw_sub(bw_sub(bw_sub(data->minimum_latency_hiding_with_cursor[k], vbios->blackout_duration), data->dmif_burst_time[i][j]), data->line_source_transfer_time[k][i][j]));
1332						data->dispclk_required_for_blackout_duration[i][j] = bw_max3(data->dispclk_required_for_blackout_duration[i][j], bw_div(bw_div(bw_mul(data->src_pixels_for_first_output_pixel[k], dceip->display_pipe_throughput_factor), dceip->lb_write_pixels_per_dispclk), (bw_sub(bw_sub(data->minimum_latency_hiding_with_cursor[k], vbios->blackout_duration), data->dmif_burst_time[i][j]))), bw_div(bw_div(bw_mul(data->src_pixels_for_last_output_pixel[k], dceip->display_pipe_throughput_factor), dceip->lb_write_pixels_per_dispclk), (bw_add(bw_sub(bw_sub(data->minimum_latency_hiding_with_cursor[k], vbios->blackout_duration), data->dmif_burst_time[i][j]), data->active_time[k]))));
1333						if (bw_leq(vbios->maximum_blackout_recovery_time, bw_add(bw_mul(bw_int_to_fixed(2), data->total_dmifmc_urgent_latency), data->dmif_burst_time[i][j]))) {
1334							data->dispclk_required_for_blackout_recovery[i][j] = bw_int_to_fixed(9999);
1335						}
1336						else if (bw_ltn(data->adjusted_data_buffer_size[k], bw_mul(bw_div(bw_mul(data->display_bandwidth[k], data->useful_bytes_per_request[k]), data->bytes_per_request[k]), (bw_add(vbios->blackout_duration, bw_add(bw_mul(bw_int_to_fixed(2), data->total_dmifmc_urgent_latency), data->dmif_burst_time[i][j])))))) {
1337							data->dispclk_required_for_blackout_recovery[i][j] = bw_max2(data->dispclk_required_for_blackout_recovery[i][j], bw_div(bw_mul(bw_div(bw_div((bw_sub(bw_mul(bw_div(bw_mul(data->display_bandwidth[k], data->useful_bytes_per_request[k]), data->bytes_per_request[k]), (bw_add(vbios->blackout_duration, vbios->maximum_blackout_recovery_time))), data->adjusted_data_buffer_size[k])), bw_int_to_fixed(data->bytes_per_pixel[k])), (bw_sub(vbios->maximum_blackout_recovery_time, bw_sub(bw_mul(bw_int_to_fixed(2), data->total_dmifmc_urgent_latency), data->dmif_burst_time[i][j])))), data->latency_hiding_lines[k]), data->lines_interleaved_in_mem_access[k]));
1338						}
1339					}
1340					else {
1341						data->blackout_duration_margin[i][j] = bw_min2(data->blackout_duration_margin[i][j], bw_sub(bw_sub(bw_sub(bw_sub(data->minimum_latency_hiding_with_cursor[k], vbios->blackout_duration), data->dmif_burst_time[i][j]), data->mcifwr_burst_time[i][j]), data->line_source_transfer_time[k][i][j]));
1342						data->dispclk_required_for_blackout_duration[i][j] = bw_max3(data->dispclk_required_for_blackout_duration[i][j], bw_div(bw_div(bw_mul(data->src_pixels_for_first_output_pixel[k], dceip->display_pipe_throughput_factor), dceip->lb_write_pixels_per_dispclk), (bw_sub(bw_sub(bw_sub(data->minimum_latency_hiding_with_cursor[k], vbios->blackout_duration), data->dmif_burst_time[i][j]), data->mcifwr_burst_time[i][j]))), bw_div(bw_div(bw_mul(data->src_pixels_for_last_output_pixel[k], dceip->display_pipe_throughput_factor), dceip->lb_write_pixels_per_dispclk), (bw_add(bw_sub(bw_sub(bw_sub(data->minimum_latency_hiding_with_cursor[k], vbios->blackout_duration), data->dmif_burst_time[i][j]), data->mcifwr_burst_time[i][j]), data->active_time[k]))));
1343						if (bw_ltn(vbios->maximum_blackout_recovery_time, bw_add(bw_add(bw_mul(bw_int_to_fixed(2), vbios->mcifwrmc_urgent_latency), data->dmif_burst_time[i][j]), data->mcifwr_burst_time[i][j]))) {
1344							data->dispclk_required_for_blackout_recovery[i][j] = bw_int_to_fixed(9999);
1345						}
1346						else if (bw_ltn(data->adjusted_data_buffer_size[k], bw_mul(bw_div(bw_mul(data->display_bandwidth[k], data->useful_bytes_per_request[k]), data->bytes_per_request[k]), (bw_add(vbios->blackout_duration, bw_add(bw_mul(bw_int_to_fixed(2), data->total_dmifmc_urgent_latency), data->dmif_burst_time[i][j])))))) {
1347							data->dispclk_required_for_blackout_recovery[i][j] = bw_max2(data->dispclk_required_for_blackout_recovery[i][j], bw_div(bw_mul(bw_div(bw_div((bw_sub(bw_mul(bw_div(bw_mul(data->display_bandwidth[k], data->useful_bytes_per_request[k]), data->bytes_per_request[k]), (bw_add(vbios->blackout_duration, vbios->maximum_blackout_recovery_time))), data->adjusted_data_buffer_size[k])), bw_int_to_fixed(data->bytes_per_pixel[k])), (bw_sub(vbios->maximum_blackout_recovery_time, (bw_add(bw_mul(bw_int_to_fixed(2), data->total_dmifmc_urgent_latency), data->dmif_burst_time[i][j]))))), data->latency_hiding_lines[k]), data->lines_interleaved_in_mem_access[k]));
1348						}
1349					}
1350				}
1351			}
1352		}
1353	}
1354	if (bw_mtn(data->blackout_duration_margin[high][s_high], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[high][s_high], vbios->high_voltage_max_dispclk)) {
1355		data->cpup_state_change_enable = bw_def_yes;
1356		if (bw_ltn(data->dispclk_required_for_blackout_recovery[high][s_high], vbios->high_voltage_max_dispclk)) {
1357			data->cpuc_state_change_enable = bw_def_yes;
1358		}
1359		else {
1360			data->cpuc_state_change_enable = bw_def_no;
1361		}
1362	}
1363	else {
1364		data->cpup_state_change_enable = bw_def_no;
1365		data->cpuc_state_change_enable = bw_def_no;
1366	}
1367	/*nb p-state change enable*/
1368	/*for dram speed/p-state change to be possible for a yclk(pclk) and sclk level there has to be positive margin and the dispclk required has to be*/
1369	/*below the maximum.*/
1370	/*the dram speed/p-state change margin is the minimum for all surfaces of the maximum latency hiding minus the dram speed/p-state change latency,*/
1371	/*minus the dmif burst time, minus the source line transfer time*/
1372	/*the maximum latency hiding is the minimum latency hiding plus one source line used for de-tiling in the line buffer, plus half the urgent latency*/
1373	/*if stutter and dram clock state change are gated before cursor then the cursor latency hiding does not limit stutter or dram clock state change*/
1374	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1375		if (data->enable[i]) {
1376			/*maximum_latency_hiding(i) = minimum_latency_hiding(i) + 1 / vsr(i) **/
1377			/*      h_total(i) / pixel_rate(i) + 0.5 * total_dmifmc_urgent_latency*/
1378			data->maximum_latency_hiding[i] = bw_add(data->minimum_latency_hiding[i],
1379				bw_mul(bw_frc_to_fixed(5, 10), data->total_dmifmc_urgent_latency));
1380			data->maximum_latency_hiding_with_cursor[i] = bw_min2(data->maximum_latency_hiding[i], data->cursor_latency_hiding[i]);
1381		}
1382	}
1383	for (i = 0; i <= 2; i++) {
1384		for (j = 0; j <= 7; j++) {
1385			data->min_dram_speed_change_margin[i][j] = bw_int_to_fixed(9999);
1386			data->dram_speed_change_margin = bw_int_to_fixed(9999);
1387			data->dispclk_required_for_dram_speed_change[i][j] = bw_int_to_fixed(0);
1388			data->num_displays_with_margin[i][j] = 0;
1389			for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
1390				if (data->enable[k]) {
1391					if (surface_type[k] != bw_def_display_write_back420_luma && surface_type[k] != bw_def_display_write_back420_chroma) {
1392						data->dram_speed_change_margin = bw_sub(bw_sub(bw_sub(data->maximum_latency_hiding_with_cursor[k], vbios->nbp_state_change_latency), data->dmif_burst_time[i][j]), data->dram_speed_change_line_source_transfer_time[k][i][j]);
1393						if ((bw_mtn(data->dram_speed_change_margin, bw_int_to_fixed(0)) && bw_ltn(data->dram_speed_change_margin, bw_int_to_fixed(9999)))) {
1394							/*determine the minimum dram clock change margin for each set of clock frequencies*/
1395							data->min_dram_speed_change_margin[i][j] = bw_min2(data->min_dram_speed_change_margin[i][j], data->dram_speed_change_margin);
1396							/*compute the maximum clock frequuency required for the dram clock change at each set of clock frequencies*/
1397							data->dispclk_required_for_dram_speed_change_pipe[i][j] = bw_max2(bw_div(bw_div(bw_mul(data->src_pixels_for_first_output_pixel[k], dceip->display_pipe_throughput_factor), dceip->lb_write_pixels_per_dispclk), (bw_sub(bw_sub(bw_sub(data->maximum_latency_hiding_with_cursor[k], vbios->nbp_state_change_latency), data->dmif_burst_time[i][j]), data->dram_speed_change_line_source_transfer_time[k][i][j]))), bw_div(bw_div(bw_mul(data->src_pixels_for_last_output_pixel[k], dceip->display_pipe_throughput_factor), dceip->lb_write_pixels_per_dispclk), (bw_add(bw_sub(bw_sub(bw_sub(data->maximum_latency_hiding_with_cursor[k], vbios->nbp_state_change_latency), data->dmif_burst_time[i][j]), data->dram_speed_change_line_source_transfer_time[k][i][j]), data->active_time[k]))));
1398							if ((bw_ltn(data->dispclk_required_for_dram_speed_change_pipe[i][j], vbios->high_voltage_max_dispclk))) {
1399								data->display_pstate_change_enable[k] = 1;
1400								data->num_displays_with_margin[i][j] = data->num_displays_with_margin[i][j] + 1;
1401								data->dispclk_required_for_dram_speed_change[i][j] = bw_max2(data->dispclk_required_for_dram_speed_change[i][j], data->dispclk_required_for_dram_speed_change_pipe[i][j]);
1402							}
1403						}
1404					}
1405					else {
1406						data->dram_speed_change_margin = bw_sub(bw_sub(bw_sub(bw_sub(data->maximum_latency_hiding_with_cursor[k], vbios->nbp_state_change_latency), data->dmif_burst_time[i][j]), data->mcifwr_burst_time[i][j]), data->dram_speed_change_line_source_transfer_time[k][i][j]);
1407						if ((bw_mtn(data->dram_speed_change_margin, bw_int_to_fixed(0)) && bw_ltn(data->dram_speed_change_margin, bw_int_to_fixed(9999)))) {
1408							/*determine the minimum dram clock change margin for each display pipe*/
1409							data->min_dram_speed_change_margin[i][j] = bw_min2(data->min_dram_speed_change_margin[i][j], data->dram_speed_change_margin);
1410							/*compute the maximum clock frequuency required for the dram clock change at each set of clock frequencies*/
1411							data->dispclk_required_for_dram_speed_change_pipe[i][j] = bw_max2(bw_div(bw_div(bw_mul(data->src_pixels_for_first_output_pixel[k], dceip->display_pipe_throughput_factor), dceip->lb_write_pixels_per_dispclk), (bw_sub(bw_sub(bw_sub(bw_sub(data->maximum_latency_hiding_with_cursor[k], vbios->nbp_state_change_latency), data->dmif_burst_time[i][j]), data->dram_speed_change_line_source_transfer_time[k][i][j]), data->mcifwr_burst_time[i][j]))), bw_div(bw_div(bw_mul(data->src_pixels_for_last_output_pixel[k], dceip->display_pipe_throughput_factor), dceip->lb_write_pixels_per_dispclk), (bw_add(bw_sub(bw_sub(bw_sub(bw_sub(data->maximum_latency_hiding_with_cursor[k], vbios->nbp_state_change_latency), data->dmif_burst_time[i][j]), data->dram_speed_change_line_source_transfer_time[k][i][j]), data->mcifwr_burst_time[i][j]), data->active_time[k]))));
1412							if ((bw_ltn(data->dispclk_required_for_dram_speed_change_pipe[i][j], vbios->high_voltage_max_dispclk))) {
1413								data->display_pstate_change_enable[k] = 1;
1414								data->num_displays_with_margin[i][j] = data->num_displays_with_margin[i][j] + 1;
1415								data->dispclk_required_for_dram_speed_change[i][j] = bw_max2(data->dispclk_required_for_dram_speed_change[i][j], data->dispclk_required_for_dram_speed_change_pipe[i][j]);
1416							}
1417						}
1418					}
1419				}
1420			}
1421		}
1422	}
1423	/*determine the number of displays with margin to switch in the v_active region*/
1424	for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
1425		if (data->enable[k] == 1 && data->display_pstate_change_enable[k] == 1) {
1426			number_of_displays_enabled_with_margin = number_of_displays_enabled_with_margin + 1;
1427		}
1428	}
1429	/*determine the number of displays that don't have any dram clock change margin, but*/
1430	/*have the same resolution.  these displays can switch in a common vblank region if*/
1431	/*their frames are aligned.*/
1432	data->min_vblank_dram_speed_change_margin = bw_int_to_fixed(9999);
1433	for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
1434		if (data->enable[k]) {
1435			if (surface_type[k] != bw_def_display_write_back420_luma && surface_type[k] != bw_def_display_write_back420_chroma) {
1436				data->v_blank_dram_speed_change_margin[k] = bw_sub(bw_sub(bw_sub(bw_div(bw_mul((bw_sub(data->v_total[k], bw_sub(bw_div(data->src_height[k], data->v_scale_ratio[k]), bw_int_to_fixed(4)))), data->h_total[k]), data->pixel_rate[k]), vbios->nbp_state_change_latency), data->dmif_burst_time[low][s_low]), data->dram_speed_change_line_source_transfer_time[k][low][s_low]);
1437				data->min_vblank_dram_speed_change_margin = bw_min2(data->min_vblank_dram_speed_change_margin, data->v_blank_dram_speed_change_margin[k]);
1438			}
1439			else {
1440				data->v_blank_dram_speed_change_margin[k] = bw_sub(bw_sub(bw_sub(bw_sub(bw_div(bw_mul((bw_sub(data->v_total[k], bw_sub(bw_div(data->src_height[k], data->v_scale_ratio[k]), bw_int_to_fixed(4)))), data->h_total[k]), data->pixel_rate[k]), vbios->nbp_state_change_latency), data->dmif_burst_time[low][s_low]), data->mcifwr_burst_time[low][s_low]), data->dram_speed_change_line_source_transfer_time[k][low][s_low]);
1441				data->min_vblank_dram_speed_change_margin = bw_min2(data->min_vblank_dram_speed_change_margin, data->v_blank_dram_speed_change_margin[k]);
1442			}
1443		}
1444	}
1445	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1446		data->displays_with_same_mode[i] = bw_int_to_fixed(0);
1447		if (data->enable[i] == 1 && data->display_pstate_change_enable[i] == 0 && bw_mtn(data->v_blank_dram_speed_change_margin[i], bw_int_to_fixed(0))) {
1448			for (j = 0; j <= maximum_number_of_surfaces - 1; j++) {
1449				if ((i == j || data->display_synchronization_enabled) && (data->enable[j] == 1 && bw_equ(data->source_width_rounded_up_to_chunks[i], data->source_width_rounded_up_to_chunks[j]) && bw_equ(data->source_height_rounded_up_to_chunks[i], data->source_height_rounded_up_to_chunks[j]) && bw_equ(data->vsr[i], data->vsr[j]) && bw_equ(data->hsr[i], data->hsr[j]) && bw_equ(data->pixel_rate[i], data->pixel_rate[j]))) {
1450					data->displays_with_same_mode[i] = bw_add(data->displays_with_same_mode[i], bw_int_to_fixed(1));
1451				}
1452			}
1453		}
1454	}
1455	/*compute the maximum number of aligned displays with no margin*/
1456	number_of_aligned_displays_with_no_margin = 0;
1457	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1458		number_of_aligned_displays_with_no_margin = bw_fixed_to_int(bw_max2(bw_int_to_fixed(number_of_aligned_displays_with_no_margin), data->displays_with_same_mode[i]));
1459	}
1460	/*dram clock change is possible, if all displays have positive margin except for one display or a group of*/
1461	/*aligned displays with the same timing.*/
1462	/*the display(s) with the negative margin can be switched in the v_blank region while the other*/
1463	/*displays are in v_blank or v_active.*/
1464	if (number_of_displays_enabled_with_margin > 0 && (number_of_displays_enabled_with_margin + number_of_aligned_displays_with_no_margin) == number_of_displays_enabled && bw_mtn(data->min_dram_speed_change_margin[high][s_high], bw_int_to_fixed(0)) && bw_ltn(data->min_dram_speed_change_margin[high][s_high], bw_int_to_fixed(9999)) && bw_ltn(data->dispclk_required_for_dram_speed_change[high][s_high], vbios->high_voltage_max_dispclk)) {
1465		data->nbp_state_change_enable = bw_def_yes;
1466	}
1467	else {
1468		data->nbp_state_change_enable = bw_def_no;
1469	}
1470	/*dram clock change is possible only in vblank if all displays are aligned and have no margin*/
1471	if (number_of_aligned_displays_with_no_margin == number_of_displays_enabled) {
1472		nbp_state_change_enable_blank = bw_def_yes;
1473	}
1474	else {
1475		nbp_state_change_enable_blank = bw_def_no;
1476	}
1477
1478	/*average bandwidth*/
1479	/*the average bandwidth with no compression is the vertical active time is the source width times the bytes per pixel divided by the line time, multiplied by the vertical scale ratio and the ratio of bytes per request divided by the useful bytes per request.*/
1480	/*the average bandwidth with compression is the same, divided by the compression ratio*/
1481	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1482		if (data->enable[i]) {
1483			data->average_bandwidth_no_compression[i] = bw_div(bw_mul(bw_mul(bw_div(bw_mul(data->source_width_rounded_up_to_chunks[i], bw_int_to_fixed(data->bytes_per_pixel[i])), (bw_div(data->h_total[i], data->pixel_rate[i]))), data->vsr[i]), data->bytes_per_request[i]), data->useful_bytes_per_request[i]);
1484			data->average_bandwidth[i] = bw_div(data->average_bandwidth_no_compression[i], data->compression_rate[i]);
1485		}
1486	}
1487	data->total_average_bandwidth_no_compression = bw_int_to_fixed(0);
1488	data->total_average_bandwidth = bw_int_to_fixed(0);
1489	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1490		if (data->enable[i]) {
1491			data->total_average_bandwidth_no_compression = bw_add(data->total_average_bandwidth_no_compression, data->average_bandwidth_no_compression[i]);
1492			data->total_average_bandwidth = bw_add(data->total_average_bandwidth, data->average_bandwidth[i]);
1493		}
1494	}
1495
1496	/*required yclk(pclk)*/
1497	/*yclk requirement only makes sense if the dmif and mcifwr data total page close-open time is less than the time for data transfer and the total pte requests fit in the scatter-gather saw queque size*/
1498	/*if that is the case, the yclk requirement is the maximum of the ones required by dmif and mcifwr, and the high/low yclk(pclk) is chosen accordingly*/
1499	/*high yclk(pclk) has to be selected when dram speed/p-state change is not possible.*/
1500	data->min_cursor_memory_interface_buffer_size_in_time = bw_int_to_fixed(9999);
1501	/* number of cursor lines stored in the cursor data return buffer*/
1502	num_cursor_lines = 0;
1503	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1504		if (data->enable[i]) {
1505			if (bw_mtn(data->cursor_width_pixels[i], bw_int_to_fixed(0))) {
1506				/*compute number of cursor lines stored in data return buffer*/
1507				if (bw_leq(data->cursor_width_pixels[i], bw_int_to_fixed(64)) && dceip->large_cursor == 1) {
1508					num_cursor_lines = 4;
1509				}
1510				else {
1511					num_cursor_lines = 2;
1512				}
1513				data->min_cursor_memory_interface_buffer_size_in_time = bw_min2(data->min_cursor_memory_interface_buffer_size_in_time, bw_div(bw_mul(bw_div(bw_int_to_fixed(num_cursor_lines), data->vsr[i]), data->h_total[i]), data->pixel_rate[i]));
1514			}
1515		}
1516	}
1517	/*compute minimum time to read one chunk from the dmif buffer*/
1518	if (number_of_displays_enabled > 2) {
1519		data->chunk_request_delay = 0;
1520	}
1521	else {
1522		data->chunk_request_delay = bw_fixed_to_int(bw_div(bw_int_to_fixed(512), vbios->high_voltage_max_dispclk));
1523	}
1524	data->min_read_buffer_size_in_time = bw_min2(data->min_cursor_memory_interface_buffer_size_in_time, data->min_dmif_size_in_time);
1525	data->display_reads_time_for_data_transfer = bw_sub(bw_sub(data->min_read_buffer_size_in_time, data->total_dmifmc_urgent_latency), bw_int_to_fixed(data->chunk_request_delay));
1526	data->display_writes_time_for_data_transfer = bw_sub(data->min_mcifwr_size_in_time, vbios->mcifwrmc_urgent_latency);
1527	data->dmif_required_dram_bandwidth = bw_div(data->total_display_reads_required_dram_access_data, data->display_reads_time_for_data_transfer);
1528	data->mcifwr_required_dram_bandwidth = bw_div(data->total_display_writes_required_dram_access_data, data->display_writes_time_for_data_transfer);
1529	data->required_dmifmc_urgent_latency_for_page_close_open = bw_div((bw_sub(data->min_read_buffer_size_in_time, data->dmif_total_page_close_open_time)), data->total_dmifmc_urgent_trips);
1530	data->required_mcifmcwr_urgent_latency = bw_sub(data->min_mcifwr_size_in_time, data->mcifwr_total_page_close_open_time);
1531	if (bw_mtn(data->scatter_gather_total_pte_requests, dceip->maximum_total_outstanding_pte_requests_allowed_by_saw)) {
1532		data->required_dram_bandwidth_gbyte_per_second = bw_int_to_fixed(9999);
1533		yclk_message = bw_def_exceeded_allowed_outstanding_pte_req_queue_size;
1534		data->y_clk_level = high;
1535		data->dram_bandwidth = bw_mul(bw_div(bw_mul(bw_mul(data->dram_efficiency, yclk[high]), bw_int_to_fixed(vbios->dram_channel_width_in_bits)), bw_int_to_fixed(8)), bw_int_to_fixed(data->number_of_dram_channels));
1536	}
1537	else if (bw_mtn(vbios->dmifmc_urgent_latency, data->required_dmifmc_urgent_latency_for_page_close_open) || bw_mtn(vbios->mcifwrmc_urgent_latency, data->required_mcifmcwr_urgent_latency)) {
1538		data->required_dram_bandwidth_gbyte_per_second = bw_int_to_fixed(9999);
1539		yclk_message = bw_def_exceeded_allowed_page_close_open;
1540		data->y_clk_level = high;
1541		data->dram_bandwidth = bw_mul(bw_div(bw_mul(bw_mul(data->dram_efficiency, yclk[high]), bw_int_to_fixed(vbios->dram_channel_width_in_bits)), bw_int_to_fixed(8)), bw_int_to_fixed(data->number_of_dram_channels));
1542	}
1543	else {
1544		data->required_dram_bandwidth_gbyte_per_second = bw_div(bw_max2(data->dmif_required_dram_bandwidth, data->mcifwr_required_dram_bandwidth), bw_int_to_fixed(1000));
1545		if (bw_ltn(data->total_average_bandwidth_no_compression, bw_mul(bw_mul(bw_mul(bw_frc_to_fixed(dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation, 100),yclk[low]),bw_div(bw_int_to_fixed(vbios->dram_channel_width_in_bits),bw_int_to_fixed(8))),bw_int_to_fixed(vbios->number_of_dram_channels)))
1546				&& bw_ltn(bw_mul(data->required_dram_bandwidth_gbyte_per_second, bw_int_to_fixed(1000)), bw_mul(bw_div(bw_mul(bw_mul(data->dram_efficiency, yclk[low]), bw_int_to_fixed(vbios->dram_channel_width_in_bits)), bw_int_to_fixed(8)), bw_int_to_fixed(data->number_of_dram_channels))) && (data->cpup_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[low][s_high], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[low][s_high], vbios->high_voltage_max_dispclk))) && (data->cpuc_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[low][s_high], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[low][s_high], vbios->high_voltage_max_dispclk) && bw_ltn(data->dispclk_required_for_blackout_recovery[low][s_high], vbios->high_voltage_max_dispclk))) && (!data->increase_voltage_to_support_mclk_switch || data->nbp_state_change_enable == bw_def_no || (bw_mtn(data->min_dram_speed_change_margin[low][s_high], bw_int_to_fixed(0)) && bw_ltn(data->min_dram_speed_change_margin[low][s_high], bw_int_to_fixed(9999)) && bw_leq(data->dispclk_required_for_dram_speed_change[low][s_high], vbios->high_voltage_max_dispclk) && data->num_displays_with_margin[low][s_high] == number_of_displays_enabled_with_margin))) {
1547			yclk_message = bw_fixed_to_int(vbios->low_yclk);
1548			data->y_clk_level = low;
1549			data->dram_bandwidth = bw_mul(bw_div(bw_mul(bw_mul(data->dram_efficiency, yclk[low]), bw_int_to_fixed(vbios->dram_channel_width_in_bits)), bw_int_to_fixed(8)), bw_int_to_fixed(data->number_of_dram_channels));
1550		}
1551		else if (bw_ltn(data->total_average_bandwidth_no_compression, bw_mul(bw_mul(bw_mul(bw_frc_to_fixed(dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation, 100),yclk[mid]),bw_div(bw_int_to_fixed(vbios->dram_channel_width_in_bits),bw_int_to_fixed(8))),bw_int_to_fixed(vbios->number_of_dram_channels)))
1552				&& bw_ltn(bw_mul(data->required_dram_bandwidth_gbyte_per_second, bw_int_to_fixed(1000)), bw_mul(bw_div(bw_mul(bw_mul(data->dram_efficiency, yclk[mid]), bw_int_to_fixed(vbios->dram_channel_width_in_bits)), bw_int_to_fixed(8)), bw_int_to_fixed(data->number_of_dram_channels))) && (data->cpup_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[mid][s_high], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[mid][s_high], vbios->high_voltage_max_dispclk))) && (data->cpuc_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[mid][s_high], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[mid][s_high], vbios->high_voltage_max_dispclk) && bw_ltn(data->dispclk_required_for_blackout_recovery[mid][s_high], vbios->high_voltage_max_dispclk))) && (!data->increase_voltage_to_support_mclk_switch || data->nbp_state_change_enable == bw_def_no || (bw_mtn(data->min_dram_speed_change_margin[mid][s_high], bw_int_to_fixed(0)) && bw_ltn(data->min_dram_speed_change_margin[mid][s_high], bw_int_to_fixed(9999)) && bw_leq(data->dispclk_required_for_dram_speed_change[mid][s_high], vbios->high_voltage_max_dispclk) && data->num_displays_with_margin[mid][s_high] == number_of_displays_enabled_with_margin))) {
1553			yclk_message = bw_fixed_to_int(vbios->mid_yclk);
1554			data->y_clk_level = mid;
1555			data->dram_bandwidth = bw_mul(bw_div(bw_mul(bw_mul(data->dram_efficiency, yclk[mid]), bw_int_to_fixed(vbios->dram_channel_width_in_bits)), bw_int_to_fixed(8)), bw_int_to_fixed(data->number_of_dram_channels));
1556		}
1557		else if (bw_ltn(data->total_average_bandwidth_no_compression, bw_mul(bw_mul(bw_mul(bw_frc_to_fixed(dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation, 100),yclk[high]),bw_div(bw_int_to_fixed(vbios->dram_channel_width_in_bits),bw_int_to_fixed(8))),bw_int_to_fixed(vbios->number_of_dram_channels)))
1558				&& bw_ltn(bw_mul(data->required_dram_bandwidth_gbyte_per_second, bw_int_to_fixed(1000)), bw_mul(bw_div(bw_mul(bw_mul(data->dram_efficiency, yclk[high]), bw_int_to_fixed(vbios->dram_channel_width_in_bits)), bw_int_to_fixed(8)), bw_int_to_fixed(data->number_of_dram_channels)))) {
1559			yclk_message = bw_fixed_to_int(vbios->high_yclk);
1560			data->y_clk_level = high;
1561			data->dram_bandwidth = bw_mul(bw_div(bw_mul(bw_mul(data->dram_efficiency, yclk[high]), bw_int_to_fixed(vbios->dram_channel_width_in_bits)), bw_int_to_fixed(8)), bw_int_to_fixed(data->number_of_dram_channels));
1562		}
1563		else {
1564			yclk_message = bw_def_exceeded_allowed_maximum_bw;
1565			data->y_clk_level = high;
1566			data->dram_bandwidth = bw_mul(bw_div(bw_mul(bw_mul(data->dram_efficiency, yclk[high]), bw_int_to_fixed(vbios->dram_channel_width_in_bits)), bw_int_to_fixed(8)), bw_int_to_fixed(data->number_of_dram_channels));
1567		}
1568	}
1569	/*required sclk*/
1570	/*sclk requirement only makes sense if the total pte requests fit in the scatter-gather saw queque size*/
1571	/*if that is the case, the sclk requirement is the maximum of the ones required by dmif and mcifwr, and the high/mid/low sclk is chosen accordingly, unless that choice results in foresaking dram speed/nb p-state change.*/
1572	/*the dmif and mcifwr sclk required is the one that allows the transfer of all pipe's data buffer size through the sclk bus in the time for data transfer*/
1573	/*for dmif, pte and cursor requests have to be included.*/
1574	data->dmif_required_sclk = bw_div(bw_div(data->total_display_reads_required_data, data->display_reads_time_for_data_transfer), (bw_mul(vbios->data_return_bus_width, bw_frc_to_fixed(dceip->percent_of_ideal_port_bw_received_after_urgent_latency, 100))));
1575	data->mcifwr_required_sclk = bw_div(bw_div(data->total_display_writes_required_data, data->display_writes_time_for_data_transfer), vbios->data_return_bus_width);
1576	if (bw_mtn(data->scatter_gather_total_pte_requests, dceip->maximum_total_outstanding_pte_requests_allowed_by_saw)) {
1577		data->required_sclk = bw_int_to_fixed(9999);
1578		sclk_message = bw_def_exceeded_allowed_outstanding_pte_req_queue_size;
1579		data->sclk_level = s_high;
1580	}
1581	else if (bw_mtn(vbios->dmifmc_urgent_latency, data->required_dmifmc_urgent_latency_for_page_close_open) || bw_mtn(vbios->mcifwrmc_urgent_latency, data->required_mcifmcwr_urgent_latency)) {
1582		data->required_sclk = bw_int_to_fixed(9999);
1583		sclk_message = bw_def_exceeded_allowed_page_close_open;
1584		data->sclk_level = s_high;
1585	}
1586	else {
1587		data->required_sclk = bw_max2(data->dmif_required_sclk, data->mcifwr_required_sclk);
1588		if (bw_ltn(data->total_average_bandwidth_no_compression, bw_mul(bw_mul(bw_frc_to_fixed(dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation, 100),sclk[low]),vbios->data_return_bus_width))
1589				&& bw_ltn(data->required_sclk, sclk[s_low]) && (data->cpup_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_low], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_low], vbios->high_voltage_max_dispclk))) && (data->cpuc_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_low], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_low], vbios->high_voltage_max_dispclk) && bw_ltn(data->dispclk_required_for_blackout_recovery[data->y_clk_level][s_low], vbios->high_voltage_max_dispclk))) && (!data->increase_voltage_to_support_mclk_switch || data->nbp_state_change_enable == bw_def_no || (bw_mtn(data->min_dram_speed_change_margin[data->y_clk_level][s_low], bw_int_to_fixed(0)) && bw_ltn(data->min_dram_speed_change_margin[data->y_clk_level][s_low], bw_int_to_fixed(9999)) && bw_leq(data->dispclk_required_for_dram_speed_change[data->y_clk_level][s_low], vbios->low_voltage_max_dispclk) && data->num_displays_with_margin[data->y_clk_level][s_low] == number_of_displays_enabled_with_margin))) {
1590			sclk_message = bw_def_low;
1591			data->sclk_level = s_low;
1592			data->required_sclk = vbios->low_sclk;
1593		}
1594		else if (bw_ltn(data->total_average_bandwidth_no_compression, bw_mul(bw_mul(bw_frc_to_fixed(dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation, 100),sclk[mid]),vbios->data_return_bus_width))
1595				&& bw_ltn(data->required_sclk, sclk[s_mid1]) && (data->cpup_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_mid1], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_mid1], vbios->high_voltage_max_dispclk))) && (data->cpuc_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_mid1], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_mid1], vbios->high_voltage_max_dispclk) && bw_ltn(data->dispclk_required_for_blackout_recovery[data->y_clk_level][s_mid1], vbios->high_voltage_max_dispclk))) && (!data->increase_voltage_to_support_mclk_switch || data->nbp_state_change_enable == bw_def_no || (bw_mtn(data->min_dram_speed_change_margin[data->y_clk_level][s_mid1], bw_int_to_fixed(0)) && bw_ltn(data->min_dram_speed_change_margin[data->y_clk_level][s_mid1], bw_int_to_fixed(9999)) && bw_leq(data->dispclk_required_for_dram_speed_change[data->y_clk_level][s_mid1], vbios->mid_voltage_max_dispclk) && data->num_displays_with_margin[data->y_clk_level][s_mid1] == number_of_displays_enabled_with_margin))) {
1596			sclk_message = bw_def_mid;
1597			data->sclk_level = s_mid1;
1598			data->required_sclk = vbios->mid1_sclk;
1599		}
1600		else if (bw_ltn(data->total_average_bandwidth_no_compression, bw_mul(bw_mul(bw_frc_to_fixed(dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation, 100),sclk[s_mid2]),vbios->data_return_bus_width))
1601				&& bw_ltn(data->required_sclk, sclk[s_mid2]) && (data->cpup_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_mid2], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_mid2], vbios->high_voltage_max_dispclk))) && (data->cpuc_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_mid2], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_mid2], vbios->high_voltage_max_dispclk) && bw_ltn(data->dispclk_required_for_blackout_recovery[data->y_clk_level][s_mid2], vbios->high_voltage_max_dispclk))) && (!data->increase_voltage_to_support_mclk_switch || data->nbp_state_change_enable == bw_def_no || (bw_mtn(data->min_dram_speed_change_margin[data->y_clk_level][s_mid2], bw_int_to_fixed(0)) && bw_ltn(data->min_dram_speed_change_margin[data->y_clk_level][s_mid2], bw_int_to_fixed(9999)) && bw_leq(data->dispclk_required_for_dram_speed_change[data->y_clk_level][s_mid2], vbios->mid_voltage_max_dispclk) && data->num_displays_with_margin[data->y_clk_level][s_mid2] == number_of_displays_enabled_with_margin))) {
1602			sclk_message = bw_def_mid;
1603			data->sclk_level = s_mid2;
1604			data->required_sclk = vbios->mid2_sclk;
1605		}
1606		else if (bw_ltn(data->total_average_bandwidth_no_compression, bw_mul(bw_mul(bw_frc_to_fixed(dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation, 100),sclk[s_mid3]),vbios->data_return_bus_width))
1607				&& bw_ltn(data->required_sclk, sclk[s_mid3]) && (data->cpup_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_mid3], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_mid3], vbios->high_voltage_max_dispclk))) && (data->cpuc_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_mid3], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_mid3], vbios->high_voltage_max_dispclk) && bw_ltn(data->dispclk_required_for_blackout_recovery[data->y_clk_level][s_mid3], vbios->high_voltage_max_dispclk))) && (!data->increase_voltage_to_support_mclk_switch || data->nbp_state_change_enable == bw_def_no || (bw_mtn(data->min_dram_speed_change_margin[data->y_clk_level][s_mid3], bw_int_to_fixed(0)) && bw_ltn(data->min_dram_speed_change_margin[data->y_clk_level][s_mid3], bw_int_to_fixed(9999)) && bw_leq(data->dispclk_required_for_dram_speed_change[data->y_clk_level][s_mid3], vbios->mid_voltage_max_dispclk) && data->num_displays_with_margin[data->y_clk_level][s_mid3] == number_of_displays_enabled_with_margin))) {
1608			sclk_message = bw_def_mid;
1609			data->sclk_level = s_mid3;
1610			data->required_sclk = vbios->mid3_sclk;
1611		}
1612		else if (bw_ltn(data->total_average_bandwidth_no_compression, bw_mul(bw_mul(bw_frc_to_fixed(dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation, 100),sclk[s_mid4]),vbios->data_return_bus_width))
1613				&& bw_ltn(data->required_sclk, sclk[s_mid4]) && (data->cpup_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_mid4], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_mid4], vbios->high_voltage_max_dispclk))) && (data->cpuc_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_mid4], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_mid4], vbios->high_voltage_max_dispclk) && bw_ltn(data->dispclk_required_for_blackout_recovery[data->y_clk_level][s_mid4], vbios->high_voltage_max_dispclk))) && (!data->increase_voltage_to_support_mclk_switch || data->nbp_state_change_enable == bw_def_no || (bw_mtn(data->min_dram_speed_change_margin[data->y_clk_level][s_mid4], bw_int_to_fixed(0)) && bw_ltn(data->min_dram_speed_change_margin[data->y_clk_level][s_mid4], bw_int_to_fixed(9999)) && bw_leq(data->dispclk_required_for_dram_speed_change[data->y_clk_level][s_mid4], vbios->mid_voltage_max_dispclk) && data->num_displays_with_margin[data->y_clk_level][s_mid4] == number_of_displays_enabled_with_margin))) {
1614			sclk_message = bw_def_mid;
1615			data->sclk_level = s_mid4;
1616			data->required_sclk = vbios->mid4_sclk;
1617		}
1618		else if (bw_ltn(data->total_average_bandwidth_no_compression, bw_mul(bw_mul(bw_frc_to_fixed(dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation, 100),sclk[s_mid5]),vbios->data_return_bus_width))
1619				&& bw_ltn(data->required_sclk, sclk[s_mid5]) && (data->cpup_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_mid5], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_mid5], vbios->high_voltage_max_dispclk))) && (data->cpuc_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_mid5], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_mid5], vbios->high_voltage_max_dispclk) && bw_ltn(data->dispclk_required_for_blackout_recovery[data->y_clk_level][s_mid5], vbios->high_voltage_max_dispclk))) && (!data->increase_voltage_to_support_mclk_switch || data->nbp_state_change_enable == bw_def_no || (bw_mtn(data->min_dram_speed_change_margin[data->y_clk_level][s_mid5], bw_int_to_fixed(0)) && bw_ltn(data->min_dram_speed_change_margin[data->y_clk_level][s_mid5], bw_int_to_fixed(9999)) && bw_leq(data->dispclk_required_for_dram_speed_change[data->y_clk_level][s_mid5], vbios->mid_voltage_max_dispclk) && data->num_displays_with_margin[data->y_clk_level][s_mid5] == number_of_displays_enabled_with_margin))) {
1620			sclk_message = bw_def_mid;
1621			data->sclk_level = s_mid5;
1622			data->required_sclk = vbios->mid5_sclk;
1623		}
1624		else if (bw_ltn(data->total_average_bandwidth_no_compression, bw_mul(bw_mul(bw_frc_to_fixed(dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation, 100),sclk[s_mid6]),vbios->data_return_bus_width))
1625				&& bw_ltn(data->required_sclk, sclk[s_mid6]) && (data->cpup_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_mid6], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_mid6], vbios->high_voltage_max_dispclk))) && (data->cpuc_state_change_enable == bw_def_no || (bw_mtn(data->blackout_duration_margin[data->y_clk_level][s_mid6], bw_int_to_fixed(0)) && bw_ltn(data->dispclk_required_for_blackout_duration[data->y_clk_level][s_mid6], vbios->high_voltage_max_dispclk) && bw_ltn(data->dispclk_required_for_blackout_recovery[data->y_clk_level][s_mid6], vbios->high_voltage_max_dispclk))) && (!data->increase_voltage_to_support_mclk_switch || data->nbp_state_change_enable == bw_def_no || (bw_mtn(data->min_dram_speed_change_margin[data->y_clk_level][s_mid6], bw_int_to_fixed(0)) && bw_ltn(data->min_dram_speed_change_margin[data->y_clk_level][s_mid6], bw_int_to_fixed(9999)) && bw_leq(data->dispclk_required_for_dram_speed_change[data->y_clk_level][s_mid6], vbios->high_voltage_max_dispclk) && data->num_displays_with_margin[data->y_clk_level][s_mid6] == number_of_displays_enabled_with_margin))) {
1626			sclk_message = bw_def_mid;
1627			data->sclk_level = s_mid6;
1628			data->required_sclk = vbios->mid6_sclk;
1629		}
1630		else if (bw_ltn(data->total_average_bandwidth_no_compression, bw_mul(bw_mul(bw_frc_to_fixed(dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation, 100),sclk[s_high]),vbios->data_return_bus_width))
1631				&& bw_ltn(data->required_sclk, sclk[s_high])) {
1632			sclk_message = bw_def_high;
1633			data->sclk_level = s_high;
1634			data->required_sclk = vbios->high_sclk;
1635		}
1636		else if (bw_meq(data->total_average_bandwidth_no_compression, bw_mul(bw_mul(bw_frc_to_fixed(dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation, 100),sclk[s_high]),vbios->data_return_bus_width))
1637				&& bw_ltn(data->required_sclk, sclk[s_high])) {
1638			sclk_message = bw_def_high;
1639			data->sclk_level = s_high;
1640			data->required_sclk = vbios->high_sclk;
1641		}
1642		else {
1643			sclk_message = bw_def_exceeded_allowed_maximum_sclk;
1644			data->sclk_level = s_high;
1645			/*required_sclk = high_sclk*/
1646		}
1647	}
1648	/*dispclk*/
1649	/*if dispclk is set to the maximum, ramping is not required.  dispclk required without ramping is less than the dispclk required with ramping.*/
1650	/*if dispclk required without ramping is more than the maximum dispclk, that is the dispclk required, and the mode is not supported*/
1651	/*if that does not happen, but dispclk required with ramping is more than the maximum dispclk, dispclk required is just the maximum dispclk*/
1652	/*if that does not happen either, dispclk required is the dispclk required with ramping.*/
1653	/*dispclk required without ramping is the maximum of the one required for display pipe pixel throughput, for scaler throughput, for total read request thrrougput and for dram/np p-state change if enabled.*/
1654	/*the display pipe pixel throughput is the maximum of lines in per line out in the beginning of the frame and lines in per line out in the middle of the frame multiplied by the horizontal blank and chunk granularity factor, altogether multiplied by the ratio of the source width to the line time, divided by the line buffer pixels per dispclk throughput, and multiplied by the display pipe throughput factor.*/
1655	/*the horizontal blank and chunk granularity factor is the ratio of the line time divided by the line time minus half the horizontal blank and chunk time.  it applies when the lines in per line out is not 2 or 4.*/
1656	/*the dispclk required for scaler throughput is the product of the pixel rate and the scaling limits factor.*/
1657	/*the dispclk required for total read request throughput is the product of the peak request-per-second bandwidth and the dispclk cycles per request, divided by the request efficiency.*/
1658	/*for the dispclk required with ramping, instead of multiplying just the pipe throughput by the display pipe throughput factor, we multiply the scaler and pipe throughput by the ramping factor.*/
1659	/*the scaling limits factor is the product of the horizontal scale ratio, and the ratio of the vertical taps divided by the scaler efficiency clamped to at least 1.*/
1660	/*the scaling limits factor itself it also clamped to at least 1*/
1661	/*if doing downscaling with the pre-downscaler enabled, the horizontal scale ratio should not be considered above (use "1")*/
1662	data->downspread_factor = bw_add(bw_int_to_fixed(1), bw_div(vbios->down_spread_percentage, bw_int_to_fixed(100)));
1663	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1664		if (data->enable[i]) {
1665			if (surface_type[i] == bw_def_graphics) {
1666				switch (data->lb_bpc[i]) {
1667				case 6:
1668					data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency6_bit_per_component;
1669					break;
1670				case 8:
1671					data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency8_bit_per_component;
1672					break;
1673				case 10:
1674					data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency10_bit_per_component;
1675					break;
1676				default:
1677					data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency12_bit_per_component;
1678					break;
1679				}
1680				if (data->use_alpha[i] == 1) {
1681					data->v_scaler_efficiency = bw_min2(data->v_scaler_efficiency, dceip->alpha_vscaler_efficiency);
1682				}
1683			}
1684			else {
1685				switch (data->lb_bpc[i]) {
1686				case 6:
1687					data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency6_bit_per_component;
1688					break;
1689				case 8:
1690					data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency8_bit_per_component;
1691					break;
1692				case 10:
1693					data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency10_bit_per_component;
1694					break;
1695				default:
1696					data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency12_bit_per_component;
1697					break;
1698				}
1699			}
1700			if (dceip->pre_downscaler_enabled && bw_mtn(data->hsr[i], bw_int_to_fixed(1))) {
1701				data->scaler_limits_factor = bw_max2(bw_div(data->v_taps[i], data->v_scaler_efficiency), bw_div(data->source_width_rounded_up_to_chunks[i], data->h_total[i]));
1702			}
1703			else {
1704				data->scaler_limits_factor = bw_max3(bw_int_to_fixed(1), bw_ceil2(bw_div(data->h_taps[i], bw_int_to_fixed(4)), bw_int_to_fixed(1)), bw_mul(data->hsr[i], bw_max2(bw_div(data->v_taps[i], data->v_scaler_efficiency), bw_int_to_fixed(1))));
1705			}
1706			data->display_pipe_pixel_throughput = bw_div(bw_div(bw_mul(bw_max2(data->lb_lines_in_per_line_out_in_beginning_of_frame[i], bw_mul(data->lb_lines_in_per_line_out_in_middle_of_frame[i], data->horizontal_blank_and_chunk_granularity_factor[i])), data->source_width_rounded_up_to_chunks[i]), (bw_div(data->h_total[i], data->pixel_rate[i]))), dceip->lb_write_pixels_per_dispclk);
1707			data->dispclk_required_without_ramping[i] = bw_mul(data->downspread_factor, bw_max2(bw_mul(data->pixel_rate[i], data->scaler_limits_factor), bw_mul(dceip->display_pipe_throughput_factor, data->display_pipe_pixel_throughput)));
1708			data->dispclk_required_with_ramping[i] = bw_mul(dceip->dispclk_ramping_factor, bw_max2(bw_mul(data->pixel_rate[i], data->scaler_limits_factor), data->display_pipe_pixel_throughput));
1709		}
1710	}
1711	data->total_dispclk_required_with_ramping = bw_int_to_fixed(0);
1712	data->total_dispclk_required_without_ramping = bw_int_to_fixed(0);
1713	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1714		if (data->enable[i]) {
1715			if (bw_ltn(data->total_dispclk_required_with_ramping, data->dispclk_required_with_ramping[i])) {
1716				data->total_dispclk_required_with_ramping = data->dispclk_required_with_ramping[i];
1717			}
1718			if (bw_ltn(data->total_dispclk_required_without_ramping, data->dispclk_required_without_ramping[i])) {
1719				data->total_dispclk_required_without_ramping = data->dispclk_required_without_ramping[i];
1720			}
1721		}
1722	}
1723	data->total_read_request_bandwidth = bw_int_to_fixed(0);
1724	data->total_write_request_bandwidth = bw_int_to_fixed(0);
1725	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1726		if (data->enable[i]) {
1727			if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
1728				data->total_read_request_bandwidth = bw_add(data->total_read_request_bandwidth, data->request_bandwidth[i]);
1729			}
1730			else {
1731				data->total_write_request_bandwidth = bw_add(data->total_write_request_bandwidth, data->request_bandwidth[i]);
1732			}
1733		}
1734	}
1735	data->dispclk_required_for_total_read_request_bandwidth = bw_div(bw_mul(data->total_read_request_bandwidth, dceip->dispclk_per_request), dceip->request_efficiency);
1736	data->total_dispclk_required_with_ramping_with_request_bandwidth = bw_max2(data->total_dispclk_required_with_ramping, data->dispclk_required_for_total_read_request_bandwidth);
1737	data->total_dispclk_required_without_ramping_with_request_bandwidth = bw_max2(data->total_dispclk_required_without_ramping, data->dispclk_required_for_total_read_request_bandwidth);
1738	if (data->cpuc_state_change_enable == bw_def_yes) {
1739		data->total_dispclk_required_with_ramping_with_request_bandwidth = bw_max3(data->total_dispclk_required_with_ramping_with_request_bandwidth, data->dispclk_required_for_blackout_duration[data->y_clk_level][data->sclk_level], data->dispclk_required_for_blackout_recovery[data->y_clk_level][data->sclk_level]);
1740		data->total_dispclk_required_without_ramping_with_request_bandwidth = bw_max3(data->total_dispclk_required_without_ramping_with_request_bandwidth, data->dispclk_required_for_blackout_duration[data->y_clk_level][data->sclk_level], data->dispclk_required_for_blackout_recovery[data->y_clk_level][data->sclk_level]);
1741	}
1742	if (data->cpup_state_change_enable == bw_def_yes) {
1743		data->total_dispclk_required_with_ramping_with_request_bandwidth = bw_max2(data->total_dispclk_required_with_ramping_with_request_bandwidth, data->dispclk_required_for_blackout_duration[data->y_clk_level][data->sclk_level]);
1744		data->total_dispclk_required_without_ramping_with_request_bandwidth = bw_max2(data->total_dispclk_required_without_ramping_with_request_bandwidth, data->dispclk_required_for_blackout_duration[data->y_clk_level][data->sclk_level]);
1745	}
1746	if (data->nbp_state_change_enable == bw_def_yes && data->increase_voltage_to_support_mclk_switch) {
1747		data->total_dispclk_required_with_ramping_with_request_bandwidth = bw_max2(data->total_dispclk_required_with_ramping_with_request_bandwidth, data->dispclk_required_for_dram_speed_change[data->y_clk_level][data->sclk_level]);
1748		data->total_dispclk_required_without_ramping_with_request_bandwidth = bw_max2(data->total_dispclk_required_without_ramping_with_request_bandwidth, data->dispclk_required_for_dram_speed_change[data->y_clk_level][data->sclk_level]);
1749	}
1750	if (bw_ltn(data->total_dispclk_required_with_ramping_with_request_bandwidth, vbios->high_voltage_max_dispclk)) {
1751		data->dispclk = data->total_dispclk_required_with_ramping_with_request_bandwidth;
1752	}
1753	else if (bw_ltn(data->total_dispclk_required_without_ramping_with_request_bandwidth, vbios->high_voltage_max_dispclk)) {
1754		data->dispclk = vbios->high_voltage_max_dispclk;
1755	}
1756	else {
1757		data->dispclk = data->total_dispclk_required_without_ramping_with_request_bandwidth;
1758	}
1759	/* required core voltage*/
1760	/* the core voltage required is low if sclk, yclk(pclk)and dispclk are within the low limits*/
1761	/* otherwise, the core voltage required is medium if yclk (pclk) is within the low limit and sclk and dispclk are within the medium limit*/
1762	/* otherwise, the core voltage required is high if the three clocks are within the high limits*/
1763	/* otherwise, or if the mode is not supported, core voltage requirement is not applicable*/
1764	if (pipe_check == bw_def_notok) {
1765		voltage = bw_def_na;
1766	}
1767	else if (mode_check == bw_def_notok) {
1768		voltage = bw_def_notok;
1769	}
1770	else if (bw_equ(bw_int_to_fixed(yclk_message), vbios->low_yclk) && sclk_message == bw_def_low && bw_ltn(data->dispclk, vbios->low_voltage_max_dispclk)) {
1771		voltage = bw_def_0_72;
1772	}
1773	else if ((bw_equ(bw_int_to_fixed(yclk_message), vbios->low_yclk) || bw_equ(bw_int_to_fixed(yclk_message), vbios->mid_yclk)) && (sclk_message == bw_def_low || sclk_message == bw_def_mid) && bw_ltn(data->dispclk, vbios->mid_voltage_max_dispclk)) {
1774		voltage = bw_def_0_8;
1775	}
1776	else if ((bw_equ(bw_int_to_fixed(yclk_message), vbios->low_yclk) || bw_equ(bw_int_to_fixed(yclk_message), vbios->mid_yclk) || bw_equ(bw_int_to_fixed(yclk_message), vbios->high_yclk)) && (sclk_message == bw_def_low || sclk_message == bw_def_mid || sclk_message == bw_def_high) && bw_leq(data->dispclk, vbios->high_voltage_max_dispclk)) {
1777		if ((data->nbp_state_change_enable == bw_def_no && nbp_state_change_enable_blank == bw_def_no)) {
1778			voltage = bw_def_high_no_nbp_state_change;
1779		}
1780		else {
1781			voltage = bw_def_0_9;
1782		}
1783	}
1784	else {
1785		voltage = bw_def_notok;
1786	}
1787	if (voltage == bw_def_0_72) {
1788		data->max_phyclk = vbios->low_voltage_max_phyclk;
1789	}
1790	else if (voltage == bw_def_0_8) {
1791		data->max_phyclk = vbios->mid_voltage_max_phyclk;
1792	}
1793	else {
1794		data->max_phyclk = vbios->high_voltage_max_phyclk;
1795	}
1796	/*required blackout recovery time*/
1797	data->blackout_recovery_time = bw_int_to_fixed(0);
1798	for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
1799		if (data->enable[k] && bw_mtn(vbios->blackout_duration, bw_int_to_fixed(0)) && data->cpup_state_change_enable == bw_def_yes) {
1800			if (surface_type[k] != bw_def_display_write_back420_luma && surface_type[k] != bw_def_display_write_back420_chroma) {
1801				data->blackout_recovery_time = bw_max2(data->blackout_recovery_time, bw_add(bw_mul(bw_int_to_fixed(2), data->total_dmifmc_urgent_latency), data->dmif_burst_time[data->y_clk_level][data->sclk_level]));
1802				if (bw_ltn(data->adjusted_data_buffer_size[k], bw_mul(bw_div(bw_mul(data->display_bandwidth[k], data->useful_bytes_per_request[k]), data->bytes_per_request[k]), (bw_add(vbios->blackout_duration, bw_add(bw_mul(bw_int_to_fixed(2), data->total_dmifmc_urgent_latency), data->dmif_burst_time[data->y_clk_level][data->sclk_level])))))) {
1803					data->blackout_recovery_time = bw_max2(data->blackout_recovery_time, bw_div((bw_add(bw_mul(bw_div(bw_mul(data->display_bandwidth[k], data->useful_bytes_per_request[k]), data->bytes_per_request[k]), vbios->blackout_duration), bw_sub(bw_div(bw_mul(bw_mul(bw_mul((bw_add(bw_mul(bw_int_to_fixed(2), data->total_dmifmc_urgent_latency), data->dmif_burst_time[data->y_clk_level][data->sclk_level])), data->dispclk), bw_int_to_fixed(data->bytes_per_pixel[k])), data->lines_interleaved_in_mem_access[k]), data->latency_hiding_lines[k]), data->adjusted_data_buffer_size[k]))), (bw_sub(bw_div(bw_mul(bw_mul(data->dispclk, bw_int_to_fixed(data->bytes_per_pixel[k])), data->lines_interleaved_in_mem_access[k]), data->latency_hiding_lines[k]), bw_div(bw_mul(data->display_bandwidth[k], data->useful_bytes_per_request[k]), data->bytes_per_request[k])))));
1804				}
1805			}
1806			else {
1807				data->blackout_recovery_time = bw_max2(data->blackout_recovery_time, bw_add(bw_mul(bw_int_to_fixed(2), vbios->mcifwrmc_urgent_latency), data->mcifwr_burst_time[data->y_clk_level][data->sclk_level]));
1808				if (bw_ltn(data->adjusted_data_buffer_size[k], bw_mul(bw_div(bw_mul(data->display_bandwidth[k], data->useful_bytes_per_request[k]), data->bytes_per_request[k]), (bw_add(vbios->blackout_duration, bw_add(bw_mul(bw_int_to_fixed(2), vbios->mcifwrmc_urgent_latency), data->mcifwr_burst_time[data->y_clk_level][data->sclk_level])))))) {
1809					data->blackout_recovery_time = bw_max2(data->blackout_recovery_time, bw_div((bw_add(bw_mul(bw_div(bw_mul(data->display_bandwidth[k], data->useful_bytes_per_request[k]), data->bytes_per_request[k]), vbios->blackout_duration), bw_sub(bw_div(bw_mul(bw_mul(bw_mul((bw_add(bw_add(bw_mul(bw_int_to_fixed(2), vbios->mcifwrmc_urgent_latency), data->dmif_burst_time[data->y_clk_level][data->sclk_level]), data->mcifwr_burst_time[data->y_clk_level][data->sclk_level])), data->dispclk), bw_int_to_fixed(data->bytes_per_pixel[k])), data->lines_interleaved_in_mem_access[k]), data->latency_hiding_lines[k]), data->adjusted_data_buffer_size[k]))), (bw_sub(bw_div(bw_mul(bw_mul(data->dispclk, bw_int_to_fixed(data->bytes_per_pixel[k])), data->lines_interleaved_in_mem_access[k]), data->latency_hiding_lines[k]), bw_div(bw_mul(data->display_bandwidth[k], data->useful_bytes_per_request[k]), data->bytes_per_request[k])))));
1810				}
1811			}
1812		}
1813	}
1814	/*sclk deep sleep*/
1815	/*during self-refresh, sclk can be reduced to dispclk divided by the minimum pixels in the data fifo entry, with 15% margin, but shoudl not be set to less than the request bandwidth.*/
1816	/*the data fifo entry is 16 pixels for the writeback, 64 bytes/bytes_per_pixel for the graphics, 16 pixels for the parallel rotation underlay,*/
1817	/*and 16 bytes/bytes_per_pixel for the orthogonal rotation underlay.*/
1818	/*in parallel mode (underlay pipe), the data read from the dmifv buffer is variable and based on the pixel depth (8bbp - 16 bytes, 16 bpp - 32 bytes, 32 bpp - 64 bytes)*/
1819	/*in orthogonal mode (underlay pipe), the data read from the dmifv buffer is fixed at 16 bytes.*/
1820	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1821		if (data->enable[i]) {
1822			if (surface_type[i] == bw_def_display_write_back420_luma || surface_type[i] == bw_def_display_write_back420_chroma) {
1823				data->pixels_per_data_fifo_entry[i] = bw_int_to_fixed(16);
1824			}
1825			else if (surface_type[i] == bw_def_graphics) {
1826				data->pixels_per_data_fifo_entry[i] = bw_div(bw_int_to_fixed(64), bw_int_to_fixed(data->bytes_per_pixel[i]));
1827			}
1828			else if (data->orthogonal_rotation[i] == 0) {
1829				data->pixels_per_data_fifo_entry[i] = bw_int_to_fixed(16);
1830			}
1831			else {
1832				data->pixels_per_data_fifo_entry[i] = bw_div(bw_int_to_fixed(16), bw_int_to_fixed(data->bytes_per_pixel[i]));
1833			}
1834		}
1835	}
1836	data->min_pixels_per_data_fifo_entry = bw_int_to_fixed(9999);
1837	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1838		if (data->enable[i]) {
1839			if (bw_mtn(data->min_pixels_per_data_fifo_entry, data->pixels_per_data_fifo_entry[i])) {
1840				data->min_pixels_per_data_fifo_entry = data->pixels_per_data_fifo_entry[i];
1841			}
1842		}
1843	}
1844	data->sclk_deep_sleep = bw_max2(bw_div(bw_mul(data->dispclk, bw_frc_to_fixed(115, 100)), data->min_pixels_per_data_fifo_entry), data->total_read_request_bandwidth);
1845	/*urgent, stutter and nb-p_state watermark*/
1846	/*the urgent watermark is the maximum of the urgent trip time plus the pixel transfer time, the urgent trip times to get data for the first pixel, and the urgent trip times to get data for the last pixel.*/
1847	/*the stutter exit watermark is the self refresh exit time plus the maximum of the data burst time plus the pixel transfer time, the data burst times to get data for the first pixel, and the data burst times to get data for the last pixel.  it does not apply to the writeback.*/
1848	/*the nb p-state change watermark is the dram speed/p-state change time plus the maximum of the data burst time plus the pixel transfer time, the data burst times to get data for the first pixel, and the data burst times to get data for the last pixel.*/
1849	/*the pixel transfer time is the maximum of the time to transfer the source pixels required for the first output pixel, and the time to transfer the pixels for the last output pixel minus the active line time.*/
1850	/*blackout_duration is added to the urgent watermark*/
1851	data->chunk_request_time = bw_int_to_fixed(0);
1852	data->cursor_request_time = bw_int_to_fixed(0);
1853	/*compute total time to request one chunk from each active display pipe*/
1854	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1855		if (data->enable[i]) {
1856			data->chunk_request_time = bw_add(data->chunk_request_time, (bw_div((bw_div(bw_int_to_fixed(pixels_per_chunk * data->bytes_per_pixel[i]), data->useful_bytes_per_request[i])), bw_min2(sclk[data->sclk_level], bw_div(data->dispclk, bw_int_to_fixed(2))))));
1857		}
1858	}
1859	/*compute total time to request cursor data*/
1860	data->cursor_request_time = (bw_div(data->cursor_total_data, (bw_mul(bw_int_to_fixed(32), sclk[data->sclk_level]))));
1861	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1862		if (data->enable[i]) {
1863			data->line_source_pixels_transfer_time = bw_max2(bw_div(bw_div(data->src_pixels_for_first_output_pixel[i], dceip->lb_write_pixels_per_dispclk), (bw_div(data->dispclk, dceip->display_pipe_throughput_factor))), bw_sub(bw_div(bw_div(data->src_pixels_for_last_output_pixel[i], dceip->lb_write_pixels_per_dispclk), (bw_div(data->dispclk, dceip->display_pipe_throughput_factor))), data->active_time[i]));
1864			if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
1865				data->urgent_watermark[i] = bw_add(bw_add(bw_add(bw_add(bw_add(data->total_dmifmc_urgent_latency, data->dmif_burst_time[data->y_clk_level][data->sclk_level]), bw_max2(data->line_source_pixels_transfer_time, data->line_source_transfer_time[i][data->y_clk_level][data->sclk_level])), vbios->blackout_duration), data->chunk_request_time), data->cursor_request_time);
1866				data->stutter_exit_watermark[i] = bw_add(bw_sub(vbios->stutter_self_refresh_exit_latency, data->total_dmifmc_urgent_latency), data->urgent_watermark[i]);
1867				data->stutter_entry_watermark[i] = bw_add(bw_sub(bw_add(vbios->stutter_self_refresh_exit_latency, vbios->stutter_self_refresh_entry_latency), data->total_dmifmc_urgent_latency), data->urgent_watermark[i]);
1868				/*unconditionally remove black out time from the nb p_state watermark*/
1869				if (data->display_pstate_change_enable[i] == 1) {
1870					data->nbp_state_change_watermark[i] = bw_add(bw_add(vbios->nbp_state_change_latency, data->dmif_burst_time[data->y_clk_level][data->sclk_level]), bw_max2(data->line_source_pixels_transfer_time, data->dram_speed_change_line_source_transfer_time[i][data->y_clk_level][data->sclk_level]));
1871				}
1872				else {
1873					/*maximize the watermark to force the switch in the vb_lank region of the frame*/
1874					data->nbp_state_change_watermark[i] = bw_int_to_fixed(131000);
1875				}
1876			}
1877			else {
1878				data->urgent_watermark[i] = bw_add(bw_add(bw_add(bw_add(bw_add(vbios->mcifwrmc_urgent_latency, data->mcifwr_burst_time[data->y_clk_level][data->sclk_level]), bw_max2(data->line_source_pixels_transfer_time, data->line_source_transfer_time[i][data->y_clk_level][data->sclk_level])), vbios->blackout_duration), data->chunk_request_time), data->cursor_request_time);
1879				data->stutter_exit_watermark[i] = bw_int_to_fixed(0);
1880				data->stutter_entry_watermark[i] = bw_int_to_fixed(0);
1881				if (data->display_pstate_change_enable[i] == 1) {
1882					data->nbp_state_change_watermark[i] = bw_add(bw_add(vbios->nbp_state_change_latency, data->mcifwr_burst_time[data->y_clk_level][data->sclk_level]), bw_max2(data->line_source_pixels_transfer_time, data->dram_speed_change_line_source_transfer_time[i][data->y_clk_level][data->sclk_level]));
1883				}
1884				else {
1885					/*maximize the watermark to force the switch in the vb_lank region of the frame*/
1886					data->nbp_state_change_watermark[i] = bw_int_to_fixed(131000);
1887				}
1888			}
1889		}
1890	}
1891	/*stutter mode enable*/
1892	/*in the multi-display case the stutter exit or entry watermark cannot exceed the minimum latency hiding capabilities of the*/
1893	/*display pipe.*/
1894	data->stutter_mode_enable = data->cpuc_state_change_enable;
1895	if (data->number_of_displays > 1) {
1896		for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1897			if (data->enable[i]) {
1898				if ((bw_mtn(data->stutter_exit_watermark[i], data->minimum_latency_hiding[i]) || bw_mtn(data->stutter_entry_watermark[i], data->minimum_latency_hiding[i]))) {
1899					data->stutter_mode_enable = bw_def_no;
1900				}
1901			}
1902		}
1903	}
1904	/*performance metrics*/
1905	/* display read access efficiency (%)*/
1906	/* display write back access efficiency (%)*/
1907	/* stutter efficiency (%)*/
1908	/* extra underlay pitch recommended for efficiency (pixels)*/
1909	/* immediate flip time (us)*/
1910	/* latency for other clients due to urgent display read (us)*/
1911	/* latency for other clients due to urgent display write (us)*/
1912	/* average bandwidth consumed by display (no compression) (gb/s)*/
1913	/* required dram  bandwidth (gb/s)*/
1914	/* required sclk (m_hz)*/
1915	/* required rd urgent latency (us)*/
1916	/* nb p-state change margin (us)*/
1917	/*dmif and mcifwr dram access efficiency*/
1918	/*is the ratio between the ideal dram access time (which is the data buffer size in memory divided by the dram bandwidth), and the actual time which is the total page close-open time.  but it cannot exceed the dram efficiency provided by the memory subsystem*/
1919	data->dmifdram_access_efficiency = bw_min2(bw_div(bw_div(data->total_display_reads_required_dram_access_data, data->dram_bandwidth), data->dmif_total_page_close_open_time), bw_int_to_fixed(1));
1920	if (bw_mtn(data->total_display_writes_required_dram_access_data, bw_int_to_fixed(0))) {
1921		data->mcifwrdram_access_efficiency = bw_min2(bw_div(bw_div(data->total_display_writes_required_dram_access_data, data->dram_bandwidth), data->mcifwr_total_page_close_open_time), bw_int_to_fixed(1));
1922	}
1923	else {
1924		data->mcifwrdram_access_efficiency = bw_int_to_fixed(0);
1925	}
1926	/*stutter efficiency*/
1927	/*the stutter efficiency is the frame-average time in self-refresh divided by the frame-average stutter cycle duration.  only applies if the display write-back is not enabled.*/
1928	/*the frame-average stutter cycle used is the minimum for all pipes of the frame-average data buffer size in time, times the compression rate*/
1929	/*the frame-average time in self-refresh is the stutter cycle minus the self refresh exit latency and the burst time*/
1930	/*the stutter cycle is the dmif buffer size reduced by the excess of the stutter exit watermark over the lb size in time.*/
1931	/*the burst time is the data needed during the stutter cycle divided by the available bandwidth*/
1932	/*compute the time read all the data from the dmif buffer to the lb (dram refresh period)*/
1933	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1934		if (data->enable[i]) {
1935			data->stutter_refresh_duration[i] = bw_sub(bw_mul(bw_div(bw_div(bw_mul(bw_div(bw_div(data->adjusted_data_buffer_size[i], bw_int_to_fixed(data->bytes_per_pixel[i])), data->source_width_rounded_up_to_chunks[i]), data->h_total[i]), data->vsr[i]), data->pixel_rate[i]), data->compression_rate[i]), bw_max2(bw_int_to_fixed(0), bw_sub(data->stutter_exit_watermark[i], bw_div(bw_mul((bw_sub(data->lb_partitions[i], bw_int_to_fixed(1))), data->h_total[i]), data->pixel_rate[i]))));
1936			data->stutter_dmif_buffer_size[i] = bw_div(bw_mul(bw_mul(bw_div(bw_mul(bw_mul(data->stutter_refresh_duration[i], bw_int_to_fixed(data->bytes_per_pixel[i])), data->source_width_rounded_up_to_chunks[i]), data->h_total[i]), data->vsr[i]), data->pixel_rate[i]), data->compression_rate[i]);
1937		}
1938	}
1939	data->min_stutter_refresh_duration = bw_int_to_fixed(9999);
1940	data->total_stutter_dmif_buffer_size = 0;
1941	data->total_bytes_requested = 0;
1942	data->min_stutter_dmif_buffer_size = 9999;
1943	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1944		if (data->enable[i]) {
1945			if (bw_mtn(data->min_stutter_refresh_duration, data->stutter_refresh_duration[i])) {
1946				data->min_stutter_refresh_duration = data->stutter_refresh_duration[i];
1947				data->total_bytes_requested = bw_fixed_to_int(bw_add(bw_int_to_fixed(data->total_bytes_requested), (bw_mul(bw_mul(data->source_height_rounded_up_to_chunks[i], data->source_width_rounded_up_to_chunks[i]), bw_int_to_fixed(data->bytes_per_pixel[i])))));
1948				data->min_stutter_dmif_buffer_size = bw_fixed_to_int(data->stutter_dmif_buffer_size[i]);
1949			}
1950			data->total_stutter_dmif_buffer_size = bw_fixed_to_int(bw_add(data->stutter_dmif_buffer_size[i], bw_int_to_fixed(data->total_stutter_dmif_buffer_size)));
1951		}
1952	}
1953	data->stutter_burst_time = bw_div(bw_int_to_fixed(data->total_stutter_dmif_buffer_size), bw_mul(sclk[data->sclk_level], vbios->data_return_bus_width));
1954	data->num_stutter_bursts = data->total_bytes_requested / data->min_stutter_dmif_buffer_size;
1955	data->total_stutter_cycle_duration = bw_add(bw_add(data->min_stutter_refresh_duration, vbios->stutter_self_refresh_exit_latency), data->stutter_burst_time);
1956	data->time_in_self_refresh = data->min_stutter_refresh_duration;
1957	if (data->d1_display_write_back_dwb_enable == 1) {
1958		data->stutter_efficiency = bw_int_to_fixed(0);
1959	}
1960	else if (bw_ltn(data->time_in_self_refresh, bw_int_to_fixed(0))) {
1961		data->stutter_efficiency = bw_int_to_fixed(0);
1962	}
1963	else {
1964		/*compute stutter efficiency assuming 60 hz refresh rate*/
1965		data->stutter_efficiency = bw_max2(bw_int_to_fixed(0), bw_mul((bw_sub(bw_int_to_fixed(1), (bw_div(bw_mul((bw_add(vbios->stutter_self_refresh_exit_latency, data->stutter_burst_time)), bw_int_to_fixed(data->num_stutter_bursts)), bw_frc_to_fixed(166666667, 10000))))), bw_int_to_fixed(100)));
1966	}
1967	/*immediate flip time*/
1968	/*if scatter gather is enabled, the immediate flip takes a number of urgent memory trips equivalent to the pte requests in a row divided by the pte request limit.*/
1969	/*otherwise, it may take just one urgenr memory trip*/
1970	data->worst_number_of_trips_to_memory = bw_int_to_fixed(1);
1971	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1972		if (data->enable[i] && data->scatter_gather_enable_for_pipe[i] == 1) {
1973			data->number_of_trips_to_memory_for_getting_apte_row[i] = bw_ceil2(bw_div(data->scatter_gather_pte_requests_in_row[i], data->scatter_gather_pte_request_limit[i]), bw_int_to_fixed(1));
1974			if (bw_ltn(data->worst_number_of_trips_to_memory, data->number_of_trips_to_memory_for_getting_apte_row[i])) {
1975				data->worst_number_of_trips_to_memory = data->number_of_trips_to_memory_for_getting_apte_row[i];
1976			}
1977		}
1978	}
1979	data->immediate_flip_time = bw_mul(data->worst_number_of_trips_to_memory, data->total_dmifmc_urgent_latency);
1980	/*worst latency for other clients*/
1981	/*it is the urgent latency plus the urgent burst time*/
1982	data->latency_for_non_dmif_clients = bw_add(data->total_dmifmc_urgent_latency, data->dmif_burst_time[data->y_clk_level][data->sclk_level]);
1983	if (data->d1_display_write_back_dwb_enable == 1) {
1984		data->latency_for_non_mcifwr_clients = bw_add(vbios->mcifwrmc_urgent_latency, dceip->mcifwr_all_surfaces_burst_time);
1985	}
1986	else {
1987		data->latency_for_non_mcifwr_clients = bw_int_to_fixed(0);
1988	}
1989	/*dmif mc urgent latency supported in high sclk and yclk*/
1990	data->dmifmc_urgent_latency_supported_in_high_sclk_and_yclk = bw_div((bw_sub(data->min_read_buffer_size_in_time, data->dmif_burst_time[high][s_high])), data->total_dmifmc_urgent_trips);
1991	/*dram speed/p-state change margin*/
1992	/*in the multi-display case the nb p-state change watermark cannot exceed the average lb size plus the dmif size or the cursor dcp buffer size*/
1993	data->v_blank_nbp_state_dram_speed_change_latency_supported = bw_int_to_fixed(99999);
1994	data->nbp_state_dram_speed_change_latency_supported = bw_int_to_fixed(99999);
1995	for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1996		if (data->enable[i]) {
1997			data->nbp_state_dram_speed_change_latency_supported = bw_min2(data->nbp_state_dram_speed_change_latency_supported, bw_add(bw_sub(data->maximum_latency_hiding_with_cursor[i], data->nbp_state_change_watermark[i]), vbios->nbp_state_change_latency));
1998			data->v_blank_nbp_state_dram_speed_change_latency_supported = bw_min2(data->v_blank_nbp_state_dram_speed_change_latency_supported, bw_add(bw_sub(bw_div(bw_mul((bw_sub(data->v_total[i], bw_sub(bw_div(data->src_height[i], data->v_scale_ratio[i]), bw_int_to_fixed(4)))), data->h_total[i]), data->pixel_rate[i]), data->nbp_state_change_watermark[i]), vbios->nbp_state_change_latency));
1999		}
2000	}
2001	/*sclk required vs urgent latency*/
2002	for (i = 1; i <= 5; i++) {
2003		data->display_reads_time_for_data_transfer_and_urgent_latency = bw_sub(data->min_read_buffer_size_in_time, bw_mul(data->total_dmifmc_urgent_trips, bw_int_to_fixed(i)));
2004		if (pipe_check == bw_def_ok && (bw_mtn(data->display_reads_time_for_data_transfer_and_urgent_latency, data->dmif_total_page_close_open_time))) {
2005			data->dmif_required_sclk_for_urgent_latency[i] = bw_div(bw_div(data->total_display_reads_required_data, data->display_reads_time_for_data_transfer_and_urgent_latency), (bw_mul(vbios->data_return_bus_width, bw_frc_to_fixed(dceip->percent_of_ideal_port_bw_received_after_urgent_latency, 100))));
2006		}
2007		else {
2008			data->dmif_required_sclk_for_urgent_latency[i] = bw_int_to_fixed(bw_def_na);
2009		}
2010	}
2011	/*output link bit per pixel supported*/
2012	for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
2013		data->output_bpphdmi[k] = bw_def_na;
2014		data->output_bppdp4_lane_hbr[k] = bw_def_na;
2015		data->output_bppdp4_lane_hbr2[k] = bw_def_na;
2016		data->output_bppdp4_lane_hbr3[k] = bw_def_na;
2017		if (data->enable[k]) {
2018			data->output_bpphdmi[k] = bw_fixed_to_int(bw_mul(bw_div(bw_min2(bw_int_to_fixed(600), data->max_phyclk), data->pixel_rate[k]), bw_int_to_fixed(24)));
2019			if (bw_meq(data->max_phyclk, bw_int_to_fixed(270))) {
2020				data->output_bppdp4_lane_hbr[k] = bw_fixed_to_int(bw_mul(bw_div(bw_mul(bw_int_to_fixed(270), bw_int_to_fixed(4)), data->pixel_rate[k]), bw_int_to_fixed(8)));
2021			}
2022			if (bw_meq(data->max_phyclk, bw_int_to_fixed(540))) {
2023				data->output_bppdp4_lane_hbr2[k] = bw_fixed_to_int(bw_mul(bw_div(bw_mul(bw_int_to_fixed(540), bw_int_to_fixed(4)), data->pixel_rate[k]), bw_int_to_fixed(8)));
2024			}
2025			if (bw_meq(data->max_phyclk, bw_int_to_fixed(810))) {
2026				data->output_bppdp4_lane_hbr3[k] = bw_fixed_to_int(bw_mul(bw_div(bw_mul(bw_int_to_fixed(810), bw_int_to_fixed(4)), data->pixel_rate[k]), bw_int_to_fixed(8)));
2027			}
2028		}
2029	}
2030
2031	kfree(surface_type);
2032free_tiling_mode:
2033	kfree(tiling_mode);
2034free_sclk:
2035	kfree(sclk);
2036free_yclk:
2037	kfree(yclk);
2038}
2039
2040/*******************************************************************************
2041 * Public functions
2042 ******************************************************************************/
2043void bw_calcs_init(struct bw_calcs_dceip *bw_dceip,
2044	struct bw_calcs_vbios *bw_vbios,
2045	struct hw_asic_id asic_id)
2046{
2047	struct bw_calcs_dceip *dceip;
2048	struct bw_calcs_vbios *vbios;
2049
2050	enum bw_calcs_version version = bw_calcs_version_from_asic_id(asic_id);
2051
2052	dceip = kzalloc(sizeof(*dceip), GFP_KERNEL);
2053	if (!dceip)
2054		return;
2055
2056	vbios = kzalloc(sizeof(*vbios), GFP_KERNEL);
2057	if (!vbios) {
2058		kfree(dceip);
2059		return;
2060	}
2061
2062	dceip->version = version;
2063
2064	switch (version) {
2065	case BW_CALCS_VERSION_CARRIZO:
2066		vbios->memory_type = bw_def_gddr5;
2067		vbios->dram_channel_width_in_bits = 64;
2068		vbios->number_of_dram_channels = asic_id.vram_width / vbios->dram_channel_width_in_bits;
2069		vbios->number_of_dram_banks = 8;
2070		vbios->high_yclk = bw_int_to_fixed(1600);
2071		vbios->mid_yclk = bw_int_to_fixed(1600);
2072		vbios->low_yclk = bw_frc_to_fixed(66666, 100);
2073		vbios->low_sclk = bw_int_to_fixed(200);
2074		vbios->mid1_sclk = bw_int_to_fixed(300);
2075		vbios->mid2_sclk = bw_int_to_fixed(300);
2076		vbios->mid3_sclk = bw_int_to_fixed(300);
2077		vbios->mid4_sclk = bw_int_to_fixed(300);
2078		vbios->mid5_sclk = bw_int_to_fixed(300);
2079		vbios->mid6_sclk = bw_int_to_fixed(300);
2080		vbios->high_sclk = bw_frc_to_fixed(62609, 100);
2081		vbios->low_voltage_max_dispclk = bw_int_to_fixed(352);
2082		vbios->mid_voltage_max_dispclk = bw_int_to_fixed(467);
2083		vbios->high_voltage_max_dispclk = bw_int_to_fixed(643);
2084		vbios->low_voltage_max_phyclk = bw_int_to_fixed(540);
2085		vbios->mid_voltage_max_phyclk = bw_int_to_fixed(810);
2086		vbios->high_voltage_max_phyclk = bw_int_to_fixed(810);
2087		vbios->data_return_bus_width = bw_int_to_fixed(32);
2088		vbios->trc = bw_int_to_fixed(50);
2089		vbios->dmifmc_urgent_latency = bw_int_to_fixed(4);
2090		vbios->stutter_self_refresh_exit_latency = bw_frc_to_fixed(153, 10);
2091		vbios->stutter_self_refresh_entry_latency = bw_int_to_fixed(0);
2092		vbios->nbp_state_change_latency = bw_frc_to_fixed(19649, 1000);
2093		vbios->mcifwrmc_urgent_latency = bw_int_to_fixed(10);
2094		vbios->scatter_gather_enable = true;
2095		vbios->down_spread_percentage = bw_frc_to_fixed(5, 10);
2096		vbios->cursor_width = 32;
2097		vbios->average_compression_rate = 4;
2098		vbios->number_of_request_slots_gmc_reserves_for_dmif_per_channel = 256;
2099		vbios->blackout_duration = bw_int_to_fixed(0); /* us */
2100		vbios->maximum_blackout_recovery_time = bw_int_to_fixed(0);
2101
2102		dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation = 100;
2103		dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation = 100;
2104		dceip->percent_of_ideal_port_bw_received_after_urgent_latency = 100;
2105		dceip->large_cursor = false;
2106		dceip->dmif_request_buffer_size = bw_int_to_fixed(768);
2107		dceip->dmif_pipe_en_fbc_chunk_tracker = false;
2108		dceip->cursor_max_outstanding_group_num = 1;
2109		dceip->lines_interleaved_into_lb = 2;
2110		dceip->chunk_width = 256;
2111		dceip->number_of_graphics_pipes = 3;
2112		dceip->number_of_underlay_pipes = 1;
2113		dceip->low_power_tiling_mode = 0;
2114		dceip->display_write_back_supported = false;
2115		dceip->argb_compression_support = false;
2116		dceip->underlay_vscaler_efficiency6_bit_per_component =
2117			bw_frc_to_fixed(35556, 10000);
2118		dceip->underlay_vscaler_efficiency8_bit_per_component =
2119			bw_frc_to_fixed(34286, 10000);
2120		dceip->underlay_vscaler_efficiency10_bit_per_component =
2121			bw_frc_to_fixed(32, 10);
2122		dceip->underlay_vscaler_efficiency12_bit_per_component =
2123			bw_int_to_fixed(3);
2124		dceip->graphics_vscaler_efficiency6_bit_per_component =
2125			bw_frc_to_fixed(35, 10);
2126		dceip->graphics_vscaler_efficiency8_bit_per_component =
2127			bw_frc_to_fixed(34286, 10000);
2128		dceip->graphics_vscaler_efficiency10_bit_per_component =
2129			bw_frc_to_fixed(32, 10);
2130		dceip->graphics_vscaler_efficiency12_bit_per_component =
2131			bw_int_to_fixed(3);
2132		dceip->alpha_vscaler_efficiency = bw_int_to_fixed(3);
2133		dceip->max_dmif_buffer_allocated = 2;
2134		dceip->graphics_dmif_size = 12288;
2135		dceip->underlay_luma_dmif_size = 19456;
2136		dceip->underlay_chroma_dmif_size = 23552;
2137		dceip->pre_downscaler_enabled = true;
2138		dceip->underlay_downscale_prefetch_enabled = true;
2139		dceip->lb_write_pixels_per_dispclk = bw_int_to_fixed(1);
2140		dceip->lb_size_per_component444 = bw_int_to_fixed(82176);
2141		dceip->graphics_lb_nodownscaling_multi_line_prefetching = false;
2142		dceip->stutter_and_dram_clock_state_change_gated_before_cursor =
2143			bw_int_to_fixed(0);
2144		dceip->underlay420_luma_lb_size_per_component = bw_int_to_fixed(
2145			82176);
2146		dceip->underlay420_chroma_lb_size_per_component =
2147			bw_int_to_fixed(164352);
2148		dceip->underlay422_lb_size_per_component = bw_int_to_fixed(
2149			82176);
2150		dceip->cursor_chunk_width = bw_int_to_fixed(64);
2151		dceip->cursor_dcp_buffer_lines = bw_int_to_fixed(4);
2152		dceip->underlay_maximum_width_efficient_for_tiling =
2153			bw_int_to_fixed(1920);
2154		dceip->underlay_maximum_height_efficient_for_tiling =
2155			bw_int_to_fixed(1080);
2156		dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display =
2157			bw_frc_to_fixed(3, 10);
2158		dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation =
2159			bw_int_to_fixed(25);
2160		dceip->minimum_outstanding_pte_request_limit = bw_int_to_fixed(
2161			2);
2162		dceip->maximum_total_outstanding_pte_requests_allowed_by_saw =
2163			bw_int_to_fixed(128);
2164		dceip->limit_excessive_outstanding_dmif_requests = true;
2165		dceip->linear_mode_line_request_alternation_slice =
2166			bw_int_to_fixed(64);
2167		dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode =
2168			32;
2169		dceip->display_write_back420_luma_mcifwr_buffer_size = 12288;
2170		dceip->display_write_back420_chroma_mcifwr_buffer_size = 8192;
2171		dceip->request_efficiency = bw_frc_to_fixed(8, 10);
2172		dceip->dispclk_per_request = bw_int_to_fixed(2);
2173		dceip->dispclk_ramping_factor = bw_frc_to_fixed(105, 100);
2174		dceip->display_pipe_throughput_factor = bw_frc_to_fixed(105, 100);
2175		dceip->scatter_gather_pte_request_rows_in_tiling_mode = 2;
2176		dceip->mcifwr_all_surfaces_burst_time = bw_int_to_fixed(0); /* todo: this is a bug*/
2177		break;
2178	case BW_CALCS_VERSION_POLARIS10:
2179		/* TODO: Treat VEGAM the same as P10 for now
2180		 * Need to tune the para for VEGAM if needed */
2181	case BW_CALCS_VERSION_VEGAM:
2182		vbios->memory_type = bw_def_gddr5;
2183		vbios->dram_channel_width_in_bits = 32;
2184		vbios->number_of_dram_channels = asic_id.vram_width / vbios->dram_channel_width_in_bits;
2185		vbios->number_of_dram_banks = 8;
2186		vbios->high_yclk = bw_int_to_fixed(6000);
2187		vbios->mid_yclk = bw_int_to_fixed(3200);
2188		vbios->low_yclk = bw_int_to_fixed(1000);
2189		vbios->low_sclk = bw_int_to_fixed(300);
2190		vbios->mid1_sclk = bw_int_to_fixed(400);
2191		vbios->mid2_sclk = bw_int_to_fixed(500);
2192		vbios->mid3_sclk = bw_int_to_fixed(600);
2193		vbios->mid4_sclk = bw_int_to_fixed(700);
2194		vbios->mid5_sclk = bw_int_to_fixed(800);
2195		vbios->mid6_sclk = bw_int_to_fixed(974);
2196		vbios->high_sclk = bw_int_to_fixed(1154);
2197		vbios->low_voltage_max_dispclk = bw_int_to_fixed(459);
2198		vbios->mid_voltage_max_dispclk = bw_int_to_fixed(654);
2199		vbios->high_voltage_max_dispclk = bw_int_to_fixed(1108);
2200		vbios->low_voltage_max_phyclk = bw_int_to_fixed(540);
2201		vbios->mid_voltage_max_phyclk = bw_int_to_fixed(810);
2202		vbios->high_voltage_max_phyclk = bw_int_to_fixed(810);
2203		vbios->data_return_bus_width = bw_int_to_fixed(32);
2204		vbios->trc = bw_int_to_fixed(48);
2205		vbios->dmifmc_urgent_latency = bw_int_to_fixed(3);
2206		vbios->stutter_self_refresh_exit_latency = bw_int_to_fixed(5);
2207		vbios->stutter_self_refresh_entry_latency = bw_int_to_fixed(0);
2208		vbios->nbp_state_change_latency = bw_int_to_fixed(45);
2209		vbios->mcifwrmc_urgent_latency = bw_int_to_fixed(10);
2210		vbios->scatter_gather_enable = true;
2211		vbios->down_spread_percentage = bw_frc_to_fixed(5, 10);
2212		vbios->cursor_width = 32;
2213		vbios->average_compression_rate = 4;
2214		vbios->number_of_request_slots_gmc_reserves_for_dmif_per_channel = 256;
2215		vbios->blackout_duration = bw_int_to_fixed(0); /* us */
2216		vbios->maximum_blackout_recovery_time = bw_int_to_fixed(0);
2217
2218		dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation = 100;
2219		dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation = 100;
2220		dceip->percent_of_ideal_port_bw_received_after_urgent_latency = 100;
2221		dceip->large_cursor = false;
2222		dceip->dmif_request_buffer_size = bw_int_to_fixed(768);
2223		dceip->dmif_pipe_en_fbc_chunk_tracker = false;
2224		dceip->cursor_max_outstanding_group_num = 1;
2225		dceip->lines_interleaved_into_lb = 2;
2226		dceip->chunk_width = 256;
2227		dceip->number_of_graphics_pipes = 6;
2228		dceip->number_of_underlay_pipes = 0;
2229		dceip->low_power_tiling_mode = 0;
2230		dceip->display_write_back_supported = false;
2231		dceip->argb_compression_support = true;
2232		dceip->underlay_vscaler_efficiency6_bit_per_component =
2233			bw_frc_to_fixed(35556, 10000);
2234		dceip->underlay_vscaler_efficiency8_bit_per_component =
2235			bw_frc_to_fixed(34286, 10000);
2236		dceip->underlay_vscaler_efficiency10_bit_per_component =
2237			bw_frc_to_fixed(32, 10);
2238		dceip->underlay_vscaler_efficiency12_bit_per_component =
2239			bw_int_to_fixed(3);
2240		dceip->graphics_vscaler_efficiency6_bit_per_component =
2241			bw_frc_to_fixed(35, 10);
2242		dceip->graphics_vscaler_efficiency8_bit_per_component =
2243			bw_frc_to_fixed(34286, 10000);
2244		dceip->graphics_vscaler_efficiency10_bit_per_component =
2245			bw_frc_to_fixed(32, 10);
2246		dceip->graphics_vscaler_efficiency12_bit_per_component =
2247			bw_int_to_fixed(3);
2248		dceip->alpha_vscaler_efficiency = bw_int_to_fixed(3);
2249		dceip->max_dmif_buffer_allocated = 4;
2250		dceip->graphics_dmif_size = 12288;
2251		dceip->underlay_luma_dmif_size = 19456;
2252		dceip->underlay_chroma_dmif_size = 23552;
2253		dceip->pre_downscaler_enabled = true;
2254		dceip->underlay_downscale_prefetch_enabled = true;
2255		dceip->lb_write_pixels_per_dispclk = bw_int_to_fixed(1);
2256		dceip->lb_size_per_component444 = bw_int_to_fixed(245952);
2257		dceip->graphics_lb_nodownscaling_multi_line_prefetching = true;
2258		dceip->stutter_and_dram_clock_state_change_gated_before_cursor =
2259			bw_int_to_fixed(1);
2260		dceip->underlay420_luma_lb_size_per_component = bw_int_to_fixed(
2261			82176);
2262		dceip->underlay420_chroma_lb_size_per_component =
2263			bw_int_to_fixed(164352);
2264		dceip->underlay422_lb_size_per_component = bw_int_to_fixed(
2265			82176);
2266		dceip->cursor_chunk_width = bw_int_to_fixed(64);
2267		dceip->cursor_dcp_buffer_lines = bw_int_to_fixed(4);
2268		dceip->underlay_maximum_width_efficient_for_tiling =
2269			bw_int_to_fixed(1920);
2270		dceip->underlay_maximum_height_efficient_for_tiling =
2271			bw_int_to_fixed(1080);
2272		dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display =
2273			bw_frc_to_fixed(3, 10);
2274		dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation =
2275			bw_int_to_fixed(25);
2276		dceip->minimum_outstanding_pte_request_limit = bw_int_to_fixed(
2277			2);
2278		dceip->maximum_total_outstanding_pte_requests_allowed_by_saw =
2279			bw_int_to_fixed(128);
2280		dceip->limit_excessive_outstanding_dmif_requests = true;
2281		dceip->linear_mode_line_request_alternation_slice =
2282			bw_int_to_fixed(64);
2283		dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode =
2284			32;
2285		dceip->display_write_back420_luma_mcifwr_buffer_size = 12288;
2286		dceip->display_write_back420_chroma_mcifwr_buffer_size = 8192;
2287		dceip->request_efficiency = bw_frc_to_fixed(8, 10);
2288		dceip->dispclk_per_request = bw_int_to_fixed(2);
2289		dceip->dispclk_ramping_factor = bw_frc_to_fixed(105, 100);
2290		dceip->display_pipe_throughput_factor = bw_frc_to_fixed(105, 100);
2291		dceip->scatter_gather_pte_request_rows_in_tiling_mode = 2;
2292		dceip->mcifwr_all_surfaces_burst_time = bw_int_to_fixed(0);
2293		break;
2294	case BW_CALCS_VERSION_POLARIS11:
2295		vbios->memory_type = bw_def_gddr5;
2296		vbios->dram_channel_width_in_bits = 32;
2297		vbios->number_of_dram_channels = asic_id.vram_width / vbios->dram_channel_width_in_bits;
2298		vbios->number_of_dram_banks = 8;
2299		vbios->high_yclk = bw_int_to_fixed(6000);
2300		vbios->mid_yclk = bw_int_to_fixed(3200);
2301		vbios->low_yclk = bw_int_to_fixed(1000);
2302		vbios->low_sclk = bw_int_to_fixed(300);
2303		vbios->mid1_sclk = bw_int_to_fixed(400);
2304		vbios->mid2_sclk = bw_int_to_fixed(500);
2305		vbios->mid3_sclk = bw_int_to_fixed(600);
2306		vbios->mid4_sclk = bw_int_to_fixed(700);
2307		vbios->mid5_sclk = bw_int_to_fixed(800);
2308		vbios->mid6_sclk = bw_int_to_fixed(974);
2309		vbios->high_sclk = bw_int_to_fixed(1154);
2310		vbios->low_voltage_max_dispclk = bw_int_to_fixed(459);
2311		vbios->mid_voltage_max_dispclk = bw_int_to_fixed(654);
2312		vbios->high_voltage_max_dispclk = bw_int_to_fixed(1108);
2313		vbios->low_voltage_max_phyclk = bw_int_to_fixed(540);
2314		vbios->mid_voltage_max_phyclk = bw_int_to_fixed(810);
2315		vbios->high_voltage_max_phyclk = bw_int_to_fixed(810);
2316		vbios->data_return_bus_width = bw_int_to_fixed(32);
2317		vbios->trc = bw_int_to_fixed(48);
2318		if (vbios->number_of_dram_channels == 2) // 64-bit
2319			vbios->dmifmc_urgent_latency = bw_int_to_fixed(4);
2320		else
2321			vbios->dmifmc_urgent_latency = bw_int_to_fixed(3);
2322		vbios->stutter_self_refresh_exit_latency = bw_int_to_fixed(5);
2323		vbios->stutter_self_refresh_entry_latency = bw_int_to_fixed(0);
2324		vbios->nbp_state_change_latency = bw_int_to_fixed(45);
2325		vbios->mcifwrmc_urgent_latency = bw_int_to_fixed(10);
2326		vbios->scatter_gather_enable = true;
2327		vbios->down_spread_percentage = bw_frc_to_fixed(5, 10);
2328		vbios->cursor_width = 32;
2329		vbios->average_compression_rate = 4;
2330		vbios->number_of_request_slots_gmc_reserves_for_dmif_per_channel = 256;
2331		vbios->blackout_duration = bw_int_to_fixed(0); /* us */
2332		vbios->maximum_blackout_recovery_time = bw_int_to_fixed(0);
2333
2334		dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation = 100;
2335		dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation = 100;
2336		dceip->percent_of_ideal_port_bw_received_after_urgent_latency = 100;
2337		dceip->large_cursor = false;
2338		dceip->dmif_request_buffer_size = bw_int_to_fixed(768);
2339		dceip->dmif_pipe_en_fbc_chunk_tracker = false;
2340		dceip->cursor_max_outstanding_group_num = 1;
2341		dceip->lines_interleaved_into_lb = 2;
2342		dceip->chunk_width = 256;
2343		dceip->number_of_graphics_pipes = 5;
2344		dceip->number_of_underlay_pipes = 0;
2345		dceip->low_power_tiling_mode = 0;
2346		dceip->display_write_back_supported = false;
2347		dceip->argb_compression_support = true;
2348		dceip->underlay_vscaler_efficiency6_bit_per_component =
2349			bw_frc_to_fixed(35556, 10000);
2350		dceip->underlay_vscaler_efficiency8_bit_per_component =
2351			bw_frc_to_fixed(34286, 10000);
2352		dceip->underlay_vscaler_efficiency10_bit_per_component =
2353			bw_frc_to_fixed(32, 10);
2354		dceip->underlay_vscaler_efficiency12_bit_per_component =
2355			bw_int_to_fixed(3);
2356		dceip->graphics_vscaler_efficiency6_bit_per_component =
2357			bw_frc_to_fixed(35, 10);
2358		dceip->graphics_vscaler_efficiency8_bit_per_component =
2359			bw_frc_to_fixed(34286, 10000);
2360		dceip->graphics_vscaler_efficiency10_bit_per_component =
2361			bw_frc_to_fixed(32, 10);
2362		dceip->graphics_vscaler_efficiency12_bit_per_component =
2363			bw_int_to_fixed(3);
2364		dceip->alpha_vscaler_efficiency = bw_int_to_fixed(3);
2365		dceip->max_dmif_buffer_allocated = 4;
2366		dceip->graphics_dmif_size = 12288;
2367		dceip->underlay_luma_dmif_size = 19456;
2368		dceip->underlay_chroma_dmif_size = 23552;
2369		dceip->pre_downscaler_enabled = true;
2370		dceip->underlay_downscale_prefetch_enabled = true;
2371		dceip->lb_write_pixels_per_dispclk = bw_int_to_fixed(1);
2372		dceip->lb_size_per_component444 = bw_int_to_fixed(245952);
2373		dceip->graphics_lb_nodownscaling_multi_line_prefetching = true;
2374		dceip->stutter_and_dram_clock_state_change_gated_before_cursor =
2375			bw_int_to_fixed(1);
2376		dceip->underlay420_luma_lb_size_per_component = bw_int_to_fixed(
2377			82176);
2378		dceip->underlay420_chroma_lb_size_per_component =
2379			bw_int_to_fixed(164352);
2380		dceip->underlay422_lb_size_per_component = bw_int_to_fixed(
2381			82176);
2382		dceip->cursor_chunk_width = bw_int_to_fixed(64);
2383		dceip->cursor_dcp_buffer_lines = bw_int_to_fixed(4);
2384		dceip->underlay_maximum_width_efficient_for_tiling =
2385			bw_int_to_fixed(1920);
2386		dceip->underlay_maximum_height_efficient_for_tiling =
2387			bw_int_to_fixed(1080);
2388		dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display =
2389			bw_frc_to_fixed(3, 10);
2390		dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation =
2391			bw_int_to_fixed(25);
2392		dceip->minimum_outstanding_pte_request_limit = bw_int_to_fixed(
2393			2);
2394		dceip->maximum_total_outstanding_pte_requests_allowed_by_saw =
2395			bw_int_to_fixed(128);
2396		dceip->limit_excessive_outstanding_dmif_requests = true;
2397		dceip->linear_mode_line_request_alternation_slice =
2398			bw_int_to_fixed(64);
2399		dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode =
2400			32;
2401		dceip->display_write_back420_luma_mcifwr_buffer_size = 12288;
2402		dceip->display_write_back420_chroma_mcifwr_buffer_size = 8192;
2403		dceip->request_efficiency = bw_frc_to_fixed(8, 10);
2404		dceip->dispclk_per_request = bw_int_to_fixed(2);
2405		dceip->dispclk_ramping_factor = bw_frc_to_fixed(105, 100);
2406		dceip->display_pipe_throughput_factor = bw_frc_to_fixed(105, 100);
2407		dceip->scatter_gather_pte_request_rows_in_tiling_mode = 2;
2408		dceip->mcifwr_all_surfaces_burst_time = bw_int_to_fixed(0);
2409		break;
2410	case BW_CALCS_VERSION_POLARIS12:
2411		vbios->memory_type = bw_def_gddr5;
2412		vbios->dram_channel_width_in_bits = 32;
2413		vbios->number_of_dram_channels = asic_id.vram_width / vbios->dram_channel_width_in_bits;
2414		vbios->number_of_dram_banks = 8;
2415		vbios->high_yclk = bw_int_to_fixed(6000);
2416		vbios->mid_yclk = bw_int_to_fixed(3200);
2417		vbios->low_yclk = bw_int_to_fixed(1000);
2418		vbios->low_sclk = bw_int_to_fixed(678);
2419		vbios->mid1_sclk = bw_int_to_fixed(864);
2420		vbios->mid2_sclk = bw_int_to_fixed(900);
2421		vbios->mid3_sclk = bw_int_to_fixed(920);
2422		vbios->mid4_sclk = bw_int_to_fixed(940);
2423		vbios->mid5_sclk = bw_int_to_fixed(960);
2424		vbios->mid6_sclk = bw_int_to_fixed(980);
2425		vbios->high_sclk = bw_int_to_fixed(1049);
2426		vbios->low_voltage_max_dispclk = bw_int_to_fixed(459);
2427		vbios->mid_voltage_max_dispclk = bw_int_to_fixed(654);
2428		vbios->high_voltage_max_dispclk = bw_int_to_fixed(1108);
2429		vbios->low_voltage_max_phyclk = bw_int_to_fixed(540);
2430		vbios->mid_voltage_max_phyclk = bw_int_to_fixed(810);
2431		vbios->high_voltage_max_phyclk = bw_int_to_fixed(810);
2432		vbios->data_return_bus_width = bw_int_to_fixed(32);
2433		vbios->trc = bw_int_to_fixed(48);
2434		if (vbios->number_of_dram_channels == 2) // 64-bit
2435			vbios->dmifmc_urgent_latency = bw_int_to_fixed(4);
2436		else
2437			vbios->dmifmc_urgent_latency = bw_int_to_fixed(3);
2438		vbios->stutter_self_refresh_exit_latency = bw_int_to_fixed(5);
2439		vbios->stutter_self_refresh_entry_latency = bw_int_to_fixed(0);
2440		vbios->nbp_state_change_latency = bw_int_to_fixed(250);
2441		vbios->mcifwrmc_urgent_latency = bw_int_to_fixed(10);
2442		vbios->scatter_gather_enable = false;
2443		vbios->down_spread_percentage = bw_frc_to_fixed(5, 10);
2444		vbios->cursor_width = 32;
2445		vbios->average_compression_rate = 4;
2446		vbios->number_of_request_slots_gmc_reserves_for_dmif_per_channel = 256;
2447		vbios->blackout_duration = bw_int_to_fixed(0); /* us */
2448		vbios->maximum_blackout_recovery_time = bw_int_to_fixed(0);
2449
2450		dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation = 100;
2451		dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation = 100;
2452		dceip->percent_of_ideal_port_bw_received_after_urgent_latency = 100;
2453		dceip->large_cursor = false;
2454		dceip->dmif_request_buffer_size = bw_int_to_fixed(768);
2455		dceip->dmif_pipe_en_fbc_chunk_tracker = false;
2456		dceip->cursor_max_outstanding_group_num = 1;
2457		dceip->lines_interleaved_into_lb = 2;
2458		dceip->chunk_width = 256;
2459		dceip->number_of_graphics_pipes = 5;
2460		dceip->number_of_underlay_pipes = 0;
2461		dceip->low_power_tiling_mode = 0;
2462		dceip->display_write_back_supported = true;
2463		dceip->argb_compression_support = true;
2464		dceip->underlay_vscaler_efficiency6_bit_per_component =
2465			bw_frc_to_fixed(35556, 10000);
2466		dceip->underlay_vscaler_efficiency8_bit_per_component =
2467			bw_frc_to_fixed(34286, 10000);
2468		dceip->underlay_vscaler_efficiency10_bit_per_component =
2469			bw_frc_to_fixed(32, 10);
2470		dceip->underlay_vscaler_efficiency12_bit_per_component =
2471			bw_int_to_fixed(3);
2472		dceip->graphics_vscaler_efficiency6_bit_per_component =
2473			bw_frc_to_fixed(35, 10);
2474		dceip->graphics_vscaler_efficiency8_bit_per_component =
2475			bw_frc_to_fixed(34286, 10000);
2476		dceip->graphics_vscaler_efficiency10_bit_per_component =
2477			bw_frc_to_fixed(32, 10);
2478		dceip->graphics_vscaler_efficiency12_bit_per_component =
2479			bw_int_to_fixed(3);
2480		dceip->alpha_vscaler_efficiency = bw_int_to_fixed(3);
2481		dceip->max_dmif_buffer_allocated = 4;
2482		dceip->graphics_dmif_size = 12288;
2483		dceip->underlay_luma_dmif_size = 19456;
2484		dceip->underlay_chroma_dmif_size = 23552;
2485		dceip->pre_downscaler_enabled = true;
2486		dceip->underlay_downscale_prefetch_enabled = true;
2487		dceip->lb_write_pixels_per_dispclk = bw_int_to_fixed(1);
2488		dceip->lb_size_per_component444 = bw_int_to_fixed(245952);
2489		dceip->graphics_lb_nodownscaling_multi_line_prefetching = true;
2490		dceip->stutter_and_dram_clock_state_change_gated_before_cursor =
2491			bw_int_to_fixed(1);
2492		dceip->underlay420_luma_lb_size_per_component = bw_int_to_fixed(
2493			82176);
2494		dceip->underlay420_chroma_lb_size_per_component =
2495			bw_int_to_fixed(164352);
2496		dceip->underlay422_lb_size_per_component = bw_int_to_fixed(
2497			82176);
2498		dceip->cursor_chunk_width = bw_int_to_fixed(64);
2499		dceip->cursor_dcp_buffer_lines = bw_int_to_fixed(4);
2500		dceip->underlay_maximum_width_efficient_for_tiling =
2501			bw_int_to_fixed(1920);
2502		dceip->underlay_maximum_height_efficient_for_tiling =
2503			bw_int_to_fixed(1080);
2504		dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display =
2505			bw_frc_to_fixed(3, 10);
2506		dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation =
2507			bw_int_to_fixed(25);
2508		dceip->minimum_outstanding_pte_request_limit = bw_int_to_fixed(
2509			2);
2510		dceip->maximum_total_outstanding_pte_requests_allowed_by_saw =
2511			bw_int_to_fixed(128);
2512		dceip->limit_excessive_outstanding_dmif_requests = true;
2513		dceip->linear_mode_line_request_alternation_slice =
2514			bw_int_to_fixed(64);
2515		dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode =
2516			32;
2517		dceip->display_write_back420_luma_mcifwr_buffer_size = 12288;
2518		dceip->display_write_back420_chroma_mcifwr_buffer_size = 8192;
2519		dceip->request_efficiency = bw_frc_to_fixed(8, 10);
2520		dceip->dispclk_per_request = bw_int_to_fixed(2);
2521		dceip->dispclk_ramping_factor = bw_frc_to_fixed(105, 100);
2522		dceip->display_pipe_throughput_factor = bw_frc_to_fixed(105, 100);
2523		dceip->scatter_gather_pte_request_rows_in_tiling_mode = 2;
2524		dceip->mcifwr_all_surfaces_burst_time = bw_int_to_fixed(0);
2525		break;
2526	case BW_CALCS_VERSION_STONEY:
2527		vbios->memory_type = bw_def_gddr5;
2528		vbios->dram_channel_width_in_bits = 64;
2529		vbios->number_of_dram_channels = asic_id.vram_width / vbios->dram_channel_width_in_bits;
2530		vbios->number_of_dram_banks = 8;
2531		vbios->high_yclk = bw_int_to_fixed(1866);
2532		vbios->mid_yclk = bw_int_to_fixed(1866);
2533		vbios->low_yclk = bw_int_to_fixed(1333);
2534		vbios->low_sclk = bw_int_to_fixed(200);
2535		vbios->mid1_sclk = bw_int_to_fixed(600);
2536		vbios->mid2_sclk = bw_int_to_fixed(600);
2537		vbios->mid3_sclk = bw_int_to_fixed(600);
2538		vbios->mid4_sclk = bw_int_to_fixed(600);
2539		vbios->mid5_sclk = bw_int_to_fixed(600);
2540		vbios->mid6_sclk = bw_int_to_fixed(600);
2541		vbios->high_sclk = bw_int_to_fixed(800);
2542		vbios->low_voltage_max_dispclk = bw_int_to_fixed(352);
2543		vbios->mid_voltage_max_dispclk = bw_int_to_fixed(467);
2544		vbios->high_voltage_max_dispclk = bw_int_to_fixed(643);
2545		vbios->low_voltage_max_phyclk = bw_int_to_fixed(540);
2546		vbios->mid_voltage_max_phyclk = bw_int_to_fixed(810);
2547		vbios->high_voltage_max_phyclk = bw_int_to_fixed(810);
2548		vbios->data_return_bus_width = bw_int_to_fixed(32);
2549		vbios->trc = bw_int_to_fixed(50);
2550		vbios->dmifmc_urgent_latency = bw_int_to_fixed(4);
2551		vbios->stutter_self_refresh_exit_latency = bw_frc_to_fixed(158, 10);
2552		vbios->stutter_self_refresh_entry_latency = bw_int_to_fixed(0);
2553		vbios->nbp_state_change_latency = bw_frc_to_fixed(2008, 100);
2554		vbios->mcifwrmc_urgent_latency = bw_int_to_fixed(10);
2555		vbios->scatter_gather_enable = true;
2556		vbios->down_spread_percentage = bw_frc_to_fixed(5, 10);
2557		vbios->cursor_width = 32;
2558		vbios->average_compression_rate = 4;
2559		vbios->number_of_request_slots_gmc_reserves_for_dmif_per_channel = 256;
2560		vbios->blackout_duration = bw_int_to_fixed(0); /* us */
2561		vbios->maximum_blackout_recovery_time = bw_int_to_fixed(0);
2562
2563		dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation = 100;
2564		dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation = 100;
2565		dceip->percent_of_ideal_port_bw_received_after_urgent_latency = 100;
2566		dceip->large_cursor = false;
2567		dceip->dmif_request_buffer_size = bw_int_to_fixed(768);
2568		dceip->dmif_pipe_en_fbc_chunk_tracker = false;
2569		dceip->cursor_max_outstanding_group_num = 1;
2570		dceip->lines_interleaved_into_lb = 2;
2571		dceip->chunk_width = 256;
2572		dceip->number_of_graphics_pipes = 2;
2573		dceip->number_of_underlay_pipes = 1;
2574		dceip->low_power_tiling_mode = 0;
2575		dceip->display_write_back_supported = false;
2576		dceip->argb_compression_support = true;
2577		dceip->underlay_vscaler_efficiency6_bit_per_component =
2578			bw_frc_to_fixed(35556, 10000);
2579		dceip->underlay_vscaler_efficiency8_bit_per_component =
2580			bw_frc_to_fixed(34286, 10000);
2581		dceip->underlay_vscaler_efficiency10_bit_per_component =
2582			bw_frc_to_fixed(32, 10);
2583		dceip->underlay_vscaler_efficiency12_bit_per_component =
2584			bw_int_to_fixed(3);
2585		dceip->graphics_vscaler_efficiency6_bit_per_component =
2586			bw_frc_to_fixed(35, 10);
2587		dceip->graphics_vscaler_efficiency8_bit_per_component =
2588			bw_frc_to_fixed(34286, 10000);
2589		dceip->graphics_vscaler_efficiency10_bit_per_component =
2590			bw_frc_to_fixed(32, 10);
2591		dceip->graphics_vscaler_efficiency12_bit_per_component =
2592			bw_int_to_fixed(3);
2593		dceip->alpha_vscaler_efficiency = bw_int_to_fixed(3);
2594		dceip->max_dmif_buffer_allocated = 2;
2595		dceip->graphics_dmif_size = 12288;
2596		dceip->underlay_luma_dmif_size = 19456;
2597		dceip->underlay_chroma_dmif_size = 23552;
2598		dceip->pre_downscaler_enabled = true;
2599		dceip->underlay_downscale_prefetch_enabled = true;
2600		dceip->lb_write_pixels_per_dispclk = bw_int_to_fixed(1);
2601		dceip->lb_size_per_component444 = bw_int_to_fixed(82176);
2602		dceip->graphics_lb_nodownscaling_multi_line_prefetching = false;
2603		dceip->stutter_and_dram_clock_state_change_gated_before_cursor =
2604			bw_int_to_fixed(0);
2605		dceip->underlay420_luma_lb_size_per_component = bw_int_to_fixed(
2606			82176);
2607		dceip->underlay420_chroma_lb_size_per_component =
2608			bw_int_to_fixed(164352);
2609		dceip->underlay422_lb_size_per_component = bw_int_to_fixed(
2610			82176);
2611		dceip->cursor_chunk_width = bw_int_to_fixed(64);
2612		dceip->cursor_dcp_buffer_lines = bw_int_to_fixed(4);
2613		dceip->underlay_maximum_width_efficient_for_tiling =
2614			bw_int_to_fixed(1920);
2615		dceip->underlay_maximum_height_efficient_for_tiling =
2616			bw_int_to_fixed(1080);
2617		dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display =
2618			bw_frc_to_fixed(3, 10);
2619		dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation =
2620			bw_int_to_fixed(25);
2621		dceip->minimum_outstanding_pte_request_limit = bw_int_to_fixed(
2622			2);
2623		dceip->maximum_total_outstanding_pte_requests_allowed_by_saw =
2624			bw_int_to_fixed(128);
2625		dceip->limit_excessive_outstanding_dmif_requests = true;
2626		dceip->linear_mode_line_request_alternation_slice =
2627			bw_int_to_fixed(64);
2628		dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode =
2629			32;
2630		dceip->display_write_back420_luma_mcifwr_buffer_size = 12288;
2631		dceip->display_write_back420_chroma_mcifwr_buffer_size = 8192;
2632		dceip->request_efficiency = bw_frc_to_fixed(8, 10);
2633		dceip->dispclk_per_request = bw_int_to_fixed(2);
2634		dceip->dispclk_ramping_factor = bw_frc_to_fixed(105, 100);
2635		dceip->display_pipe_throughput_factor = bw_frc_to_fixed(105, 100);
2636		dceip->scatter_gather_pte_request_rows_in_tiling_mode = 2;
2637		dceip->mcifwr_all_surfaces_burst_time = bw_int_to_fixed(0);
2638		break;
2639	case BW_CALCS_VERSION_VEGA10:
2640		vbios->memory_type = bw_def_hbm;
2641		vbios->dram_channel_width_in_bits = 128;
2642		vbios->number_of_dram_channels = asic_id.vram_width / vbios->dram_channel_width_in_bits;
2643		vbios->number_of_dram_banks = 16;
2644		vbios->high_yclk = bw_int_to_fixed(2400);
2645		vbios->mid_yclk = bw_int_to_fixed(1700);
2646		vbios->low_yclk = bw_int_to_fixed(1000);
2647		vbios->low_sclk = bw_int_to_fixed(300);
2648		vbios->mid1_sclk = bw_int_to_fixed(350);
2649		vbios->mid2_sclk = bw_int_to_fixed(400);
2650		vbios->mid3_sclk = bw_int_to_fixed(500);
2651		vbios->mid4_sclk = bw_int_to_fixed(600);
2652		vbios->mid5_sclk = bw_int_to_fixed(700);
2653		vbios->mid6_sclk = bw_int_to_fixed(760);
2654		vbios->high_sclk = bw_int_to_fixed(776);
2655		vbios->low_voltage_max_dispclk = bw_int_to_fixed(460);
2656		vbios->mid_voltage_max_dispclk = bw_int_to_fixed(670);
2657		vbios->high_voltage_max_dispclk = bw_int_to_fixed(1133);
2658		vbios->low_voltage_max_phyclk = bw_int_to_fixed(540);
2659		vbios->mid_voltage_max_phyclk = bw_int_to_fixed(810);
2660		vbios->high_voltage_max_phyclk = bw_int_to_fixed(810);
2661		vbios->data_return_bus_width = bw_int_to_fixed(32);
2662		vbios->trc = bw_int_to_fixed(48);
2663		vbios->dmifmc_urgent_latency = bw_int_to_fixed(3);
2664		vbios->stutter_self_refresh_exit_latency = bw_frc_to_fixed(75, 10);
2665		vbios->stutter_self_refresh_entry_latency = bw_frc_to_fixed(19, 10);
2666		vbios->nbp_state_change_latency = bw_int_to_fixed(39);
2667		vbios->mcifwrmc_urgent_latency = bw_int_to_fixed(10);
2668		vbios->scatter_gather_enable = false;
2669		vbios->down_spread_percentage = bw_frc_to_fixed(5, 10);
2670		vbios->cursor_width = 32;
2671		vbios->average_compression_rate = 4;
2672		vbios->number_of_request_slots_gmc_reserves_for_dmif_per_channel = 8;
2673		vbios->blackout_duration = bw_int_to_fixed(0); /* us */
2674		vbios->maximum_blackout_recovery_time = bw_int_to_fixed(0);
2675
2676		dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation = 100;
2677		dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation = 100;
2678		dceip->percent_of_ideal_port_bw_received_after_urgent_latency = 100;
2679		dceip->large_cursor = false;
2680		dceip->dmif_request_buffer_size = bw_int_to_fixed(2304);
2681		dceip->dmif_pipe_en_fbc_chunk_tracker = true;
2682		dceip->cursor_max_outstanding_group_num = 1;
2683		dceip->lines_interleaved_into_lb = 2;
2684		dceip->chunk_width = 256;
2685		dceip->number_of_graphics_pipes = 6;
2686		dceip->number_of_underlay_pipes = 0;
2687		dceip->low_power_tiling_mode = 0;
2688		dceip->display_write_back_supported = true;
2689		dceip->argb_compression_support = true;
2690		dceip->underlay_vscaler_efficiency6_bit_per_component =
2691			bw_frc_to_fixed(35556, 10000);
2692		dceip->underlay_vscaler_efficiency8_bit_per_component =
2693			bw_frc_to_fixed(34286, 10000);
2694		dceip->underlay_vscaler_efficiency10_bit_per_component =
2695			bw_frc_to_fixed(32, 10);
2696		dceip->underlay_vscaler_efficiency12_bit_per_component =
2697			bw_int_to_fixed(3);
2698		dceip->graphics_vscaler_efficiency6_bit_per_component =
2699			bw_frc_to_fixed(35, 10);
2700		dceip->graphics_vscaler_efficiency8_bit_per_component =
2701			bw_frc_to_fixed(34286, 10000);
2702		dceip->graphics_vscaler_efficiency10_bit_per_component =
2703			bw_frc_to_fixed(32, 10);
2704		dceip->graphics_vscaler_efficiency12_bit_per_component =
2705			bw_int_to_fixed(3);
2706		dceip->alpha_vscaler_efficiency = bw_int_to_fixed(3);
2707		dceip->max_dmif_buffer_allocated = 4;
2708		dceip->graphics_dmif_size = 24576;
2709		dceip->underlay_luma_dmif_size = 19456;
2710		dceip->underlay_chroma_dmif_size = 23552;
2711		dceip->pre_downscaler_enabled = true;
2712		dceip->underlay_downscale_prefetch_enabled = false;
2713		dceip->lb_write_pixels_per_dispclk = bw_int_to_fixed(1);
2714		dceip->lb_size_per_component444 = bw_int_to_fixed(245952);
2715		dceip->graphics_lb_nodownscaling_multi_line_prefetching = true;
2716		dceip->stutter_and_dram_clock_state_change_gated_before_cursor =
2717			bw_int_to_fixed(1);
2718		dceip->underlay420_luma_lb_size_per_component = bw_int_to_fixed(
2719			82176);
2720		dceip->underlay420_chroma_lb_size_per_component =
2721			bw_int_to_fixed(164352);
2722		dceip->underlay422_lb_size_per_component = bw_int_to_fixed(
2723			82176);
2724		dceip->cursor_chunk_width = bw_int_to_fixed(64);
2725		dceip->cursor_dcp_buffer_lines = bw_int_to_fixed(4);
2726		dceip->underlay_maximum_width_efficient_for_tiling =
2727			bw_int_to_fixed(1920);
2728		dceip->underlay_maximum_height_efficient_for_tiling =
2729			bw_int_to_fixed(1080);
2730		dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display =
2731			bw_frc_to_fixed(3, 10);
2732		dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation =
2733			bw_int_to_fixed(25);
2734		dceip->minimum_outstanding_pte_request_limit = bw_int_to_fixed(
2735			2);
2736		dceip->maximum_total_outstanding_pte_requests_allowed_by_saw =
2737			bw_int_to_fixed(128);
2738		dceip->limit_excessive_outstanding_dmif_requests = true;
2739		dceip->linear_mode_line_request_alternation_slice =
2740			bw_int_to_fixed(64);
2741		dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode =
2742			32;
2743		dceip->display_write_back420_luma_mcifwr_buffer_size = 12288;
2744		dceip->display_write_back420_chroma_mcifwr_buffer_size = 8192;
2745		dceip->request_efficiency = bw_frc_to_fixed(8, 10);
2746		dceip->dispclk_per_request = bw_int_to_fixed(2);
2747		dceip->dispclk_ramping_factor = bw_frc_to_fixed(105, 100);
2748		dceip->display_pipe_throughput_factor = bw_frc_to_fixed(105, 100);
2749		dceip->scatter_gather_pte_request_rows_in_tiling_mode = 2;
2750		dceip->mcifwr_all_surfaces_burst_time = bw_int_to_fixed(0);
2751		break;
2752	default:
2753		break;
2754	}
2755	*bw_dceip = *dceip;
2756	*bw_vbios = *vbios;
2757
2758	kfree(dceip);
2759	kfree(vbios);
2760}
2761
2762/*
2763 * Compare calculated (required) clocks against the clocks available at
2764 * maximum voltage (max Performance Level).
2765 */
2766static bool is_display_configuration_supported(
2767	const struct bw_calcs_vbios *vbios,
2768	const struct dce_bw_output *calcs_output)
2769{
2770	uint32_t int_max_clk;
2771
2772	int_max_clk = bw_fixed_to_int(vbios->high_voltage_max_dispclk);
2773	int_max_clk *= 1000; /* MHz to kHz */
2774	if (calcs_output->dispclk_khz > int_max_clk)
2775		return false;
2776
2777	int_max_clk = bw_fixed_to_int(vbios->high_sclk);
2778	int_max_clk *= 1000; /* MHz to kHz */
2779	if (calcs_output->sclk_khz > int_max_clk)
2780		return false;
2781
2782	return true;
2783}
2784
2785static void populate_initial_data(
2786	const struct pipe_ctx pipe[], int pipe_count, struct bw_calcs_data *data)
2787{
2788	int i, j;
2789	int num_displays = 0;
2790
2791	data->underlay_surface_type = bw_def_420;
2792	data->panning_and_bezel_adjustment = bw_def_none;
2793	data->graphics_lb_bpc = 10;
2794	data->underlay_lb_bpc = 8;
2795	data->underlay_tiling_mode = bw_def_tiled;
2796	data->graphics_tiling_mode = bw_def_tiled;
2797	data->underlay_micro_tile_mode = bw_def_display_micro_tiling;
2798	data->graphics_micro_tile_mode = bw_def_display_micro_tiling;
2799	data->increase_voltage_to_support_mclk_switch = true;
2800
2801	/* Pipes with underlay first */
2802	for (i = 0; i < pipe_count; i++) {
2803		if (!pipe[i].stream || !pipe[i].bottom_pipe)
2804			continue;
2805
2806		ASSERT(pipe[i].plane_state);
2807
2808		if (num_displays == 0) {
2809			if (!pipe[i].plane_state->visible)
2810				data->d0_underlay_mode = bw_def_underlay_only;
2811			else
2812				data->d0_underlay_mode = bw_def_blend;
2813		} else {
2814			if (!pipe[i].plane_state->visible)
2815				data->d1_underlay_mode = bw_def_underlay_only;
2816			else
2817				data->d1_underlay_mode = bw_def_blend;
2818		}
2819
2820		data->fbc_en[num_displays + 4] = false;
2821		data->lpt_en[num_displays + 4] = false;
2822		data->h_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.h_total);
2823		data->v_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.v_total);
2824		data->pixel_rate[num_displays + 4] = bw_frc_to_fixed(pipe[i].stream->timing.pix_clk_100hz, 10000);
2825		data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.width);
2826		data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4];
2827		data->src_height[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.height);
2828		data->h_taps[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.taps.h_taps);
2829		data->v_taps[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.taps.v_taps);
2830		data->h_scale_ratio[num_displays + 4] = fixed31_32_to_bw_fixed(pipe[i].plane_res.scl_data.ratios.horz.value);
2831		data->v_scale_ratio[num_displays + 4] = fixed31_32_to_bw_fixed(pipe[i].plane_res.scl_data.ratios.vert.value);
2832		switch (pipe[i].plane_state->rotation) {
2833		case ROTATION_ANGLE_0:
2834			data->rotation_angle[num_displays + 4] = bw_int_to_fixed(0);
2835			break;
2836		case ROTATION_ANGLE_90:
2837			data->rotation_angle[num_displays + 4] = bw_int_to_fixed(90);
2838			break;
2839		case ROTATION_ANGLE_180:
2840			data->rotation_angle[num_displays + 4] = bw_int_to_fixed(180);
2841			break;
2842		case ROTATION_ANGLE_270:
2843			data->rotation_angle[num_displays + 4] = bw_int_to_fixed(270);
2844			break;
2845		default:
2846			break;
2847		}
2848		switch (pipe[i].plane_state->format) {
2849		case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr:
2850		case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555:
2851		case SURFACE_PIXEL_FORMAT_GRPH_RGB565:
2852			data->bytes_per_pixel[num_displays + 4] = 2;
2853			break;
2854		case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888:
2855		case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888:
2856		case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010:
2857		case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010:
2858		case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS:
2859		case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr:
2860		case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb:
2861			data->bytes_per_pixel[num_displays + 4] = 4;
2862			break;
2863		case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616:
2864		case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616:
2865		case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F:
2866			data->bytes_per_pixel[num_displays + 4] = 8;
2867			break;
2868		default:
2869			data->bytes_per_pixel[num_displays + 4] = 4;
2870			break;
2871		}
2872		data->interlace_mode[num_displays + 4] = false;
2873		data->stereo_mode[num_displays + 4] = bw_def_mono;
2874
2875
2876		for (j = 0; j < 2; j++) {
2877			data->fbc_en[num_displays * 2 + j] = false;
2878			data->lpt_en[num_displays * 2 + j] = false;
2879
2880			data->src_height[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.viewport.height);
2881			data->src_width[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.viewport.width);
2882			data->pitch_in_pixels[num_displays * 2 + j] = bw_int_to_fixed(
2883					pipe[i].bottom_pipe->plane_state->plane_size.surface_pitch);
2884			data->h_taps[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.taps.h_taps);
2885			data->v_taps[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.taps.v_taps);
2886			data->h_scale_ratio[num_displays * 2 + j] = fixed31_32_to_bw_fixed(
2887					pipe[i].bottom_pipe->plane_res.scl_data.ratios.horz.value);
2888			data->v_scale_ratio[num_displays * 2 + j] = fixed31_32_to_bw_fixed(
2889					pipe[i].bottom_pipe->plane_res.scl_data.ratios.vert.value);
2890			switch (pipe[i].bottom_pipe->plane_state->rotation) {
2891			case ROTATION_ANGLE_0:
2892				data->rotation_angle[num_displays * 2 + j] = bw_int_to_fixed(0);
2893				break;
2894			case ROTATION_ANGLE_90:
2895				data->rotation_angle[num_displays * 2 + j] = bw_int_to_fixed(90);
2896				break;
2897			case ROTATION_ANGLE_180:
2898				data->rotation_angle[num_displays * 2 + j] = bw_int_to_fixed(180);
2899				break;
2900			case ROTATION_ANGLE_270:
2901				data->rotation_angle[num_displays * 2 + j] = bw_int_to_fixed(270);
2902				break;
2903			default:
2904				break;
2905			}
2906			data->stereo_mode[num_displays * 2 + j] = bw_def_mono;
2907		}
2908
2909		num_displays++;
2910	}
2911
2912	/* Pipes without underlay after */
2913	for (i = 0; i < pipe_count; i++) {
2914		unsigned int pixel_clock_100hz;
2915		if (!pipe[i].stream || pipe[i].bottom_pipe)
2916			continue;
2917
2918
2919		data->fbc_en[num_displays + 4] = false;
2920		data->lpt_en[num_displays + 4] = false;
2921		data->h_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.h_total);
2922		data->v_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.v_total);
2923		pixel_clock_100hz = pipe[i].stream->timing.pix_clk_100hz;
2924		if (pipe[i].stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
2925			pixel_clock_100hz *= 2;
2926		data->pixel_rate[num_displays + 4] = bw_frc_to_fixed(pixel_clock_100hz, 10000);
2927		if (pipe[i].plane_state) {
2928			data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.width);
2929			data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4];
2930			data->src_height[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.height);
2931			data->h_taps[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.taps.h_taps);
2932			data->v_taps[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.taps.v_taps);
2933			data->h_scale_ratio[num_displays + 4] = fixed31_32_to_bw_fixed(pipe[i].plane_res.scl_data.ratios.horz.value);
2934			data->v_scale_ratio[num_displays + 4] = fixed31_32_to_bw_fixed(pipe[i].plane_res.scl_data.ratios.vert.value);
2935			switch (pipe[i].plane_state->rotation) {
2936			case ROTATION_ANGLE_0:
2937				data->rotation_angle[num_displays + 4] = bw_int_to_fixed(0);
2938				break;
2939			case ROTATION_ANGLE_90:
2940				data->rotation_angle[num_displays + 4] = bw_int_to_fixed(90);
2941				break;
2942			case ROTATION_ANGLE_180:
2943				data->rotation_angle[num_displays + 4] = bw_int_to_fixed(180);
2944				break;
2945			case ROTATION_ANGLE_270:
2946				data->rotation_angle[num_displays + 4] = bw_int_to_fixed(270);
2947				break;
2948			default:
2949				break;
2950			}
2951			switch (pipe[i].plane_state->format) {
2952			case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr:
2953			case SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb:
2954			case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555:
2955			case SURFACE_PIXEL_FORMAT_GRPH_RGB565:
2956				data->bytes_per_pixel[num_displays + 4] = 2;
2957				break;
2958			case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888:
2959			case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888:
2960			case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010:
2961			case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010:
2962			case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS:
2963			case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr:
2964			case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb:
2965				data->bytes_per_pixel[num_displays + 4] = 4;
2966				break;
2967			case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616:
2968			case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616:
2969			case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F:
2970				data->bytes_per_pixel[num_displays + 4] = 8;
2971				break;
2972			default:
2973				data->bytes_per_pixel[num_displays + 4] = 4;
2974				break;
2975			}
2976		} else if (pipe[i].stream->dst.width != 0 &&
2977					pipe[i].stream->dst.height != 0 &&
2978					pipe[i].stream->src.width != 0 &&
2979					pipe[i].stream->src.height != 0) {
2980			data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->src.width);
2981			data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4];
2982			data->src_height[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->src.height);
2983			data->h_taps[num_displays + 4] = pipe[i].stream->src.width == pipe[i].stream->dst.width ? bw_int_to_fixed(1) : bw_int_to_fixed(2);
2984			data->v_taps[num_displays + 4] = pipe[i].stream->src.height == pipe[i].stream->dst.height ? bw_int_to_fixed(1) : bw_int_to_fixed(2);
2985			data->h_scale_ratio[num_displays + 4] = bw_frc_to_fixed(pipe[i].stream->src.width, pipe[i].stream->dst.width);
2986			data->v_scale_ratio[num_displays + 4] = bw_frc_to_fixed(pipe[i].stream->src.height, pipe[i].stream->dst.height);
2987			data->rotation_angle[num_displays + 4] = bw_int_to_fixed(0);
2988			data->bytes_per_pixel[num_displays + 4] = 4;
2989		} else {
2990			data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.h_addressable);
2991			data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4];
2992			data->src_height[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.v_addressable);
2993			data->h_taps[num_displays + 4] = bw_int_to_fixed(1);
2994			data->v_taps[num_displays + 4] = bw_int_to_fixed(1);
2995			data->h_scale_ratio[num_displays + 4] = bw_int_to_fixed(1);
2996			data->v_scale_ratio[num_displays + 4] = bw_int_to_fixed(1);
2997			data->rotation_angle[num_displays + 4] = bw_int_to_fixed(0);
2998			data->bytes_per_pixel[num_displays + 4] = 4;
2999		}
3000
3001		data->interlace_mode[num_displays + 4] = false;
3002		data->stereo_mode[num_displays + 4] = bw_def_mono;
3003		num_displays++;
3004	}
3005
3006	data->number_of_displays = num_displays;
3007}
3008
3009static bool all_displays_in_sync(const struct pipe_ctx pipe[],
3010				 int pipe_count)
3011{
3012	const struct pipe_ctx *active_pipes[MAX_PIPES];
3013	int i, num_active_pipes = 0;
3014
3015	for (i = 0; i < pipe_count; i++) {
3016		if (!resource_is_pipe_type(&pipe[i], OPP_HEAD))
3017			continue;
3018
3019		active_pipes[num_active_pipes++] = &pipe[i];
3020	}
3021
3022	if (!num_active_pipes)
3023		return false;
3024
3025	for (i = 1; i < num_active_pipes; ++i) {
3026		if (!resource_are_streams_timing_synchronizable(
3027			    active_pipes[0]->stream, active_pipes[i]->stream)) {
3028			return false;
3029		}
3030	}
3031
3032	return true;
3033}
3034
3035/*
3036 * Return:
3037 *	true -	Display(s) configuration supported.
3038 *		In this case 'calcs_output' contains data for HW programming
3039 *	false - Display(s) configuration not supported (not enough bandwidth).
3040 */
3041bool bw_calcs(struct dc_context *ctx,
3042	const struct bw_calcs_dceip *dceip,
3043	const struct bw_calcs_vbios *vbios,
3044	const struct pipe_ctx pipe[],
3045	int pipe_count,
3046	struct dce_bw_output *calcs_output)
3047{
3048	struct bw_calcs_data *data = kzalloc(sizeof(struct bw_calcs_data),
3049					     GFP_KERNEL);
3050	if (!data)
3051		return false;
3052
3053	populate_initial_data(pipe, pipe_count, data);
3054
3055	if (ctx->dc->config.multi_mon_pp_mclk_switch)
3056		calcs_output->all_displays_in_sync = all_displays_in_sync(pipe, pipe_count);
3057	else
3058		calcs_output->all_displays_in_sync = false;
3059
3060	if (data->number_of_displays != 0) {
3061		uint8_t yclk_lvl;
3062		struct bw_fixed high_sclk = vbios->high_sclk;
3063		struct bw_fixed mid1_sclk = vbios->mid1_sclk;
3064		struct bw_fixed mid2_sclk = vbios->mid2_sclk;
3065		struct bw_fixed mid3_sclk = vbios->mid3_sclk;
3066		struct bw_fixed mid4_sclk = vbios->mid4_sclk;
3067		struct bw_fixed mid5_sclk = vbios->mid5_sclk;
3068		struct bw_fixed mid6_sclk = vbios->mid6_sclk;
3069		struct bw_fixed low_sclk = vbios->low_sclk;
3070		struct bw_fixed high_yclk = vbios->high_yclk;
3071		struct bw_fixed mid_yclk = vbios->mid_yclk;
3072		struct bw_fixed low_yclk = vbios->low_yclk;
3073
3074		if (ctx->dc->debug.bandwidth_calcs_trace) {
3075			print_bw_calcs_dceip(ctx, dceip);
3076			print_bw_calcs_vbios(ctx, vbios);
3077			print_bw_calcs_data(ctx, data);
3078		}
3079		calculate_bandwidth(dceip, vbios, data);
3080
3081		yclk_lvl = data->y_clk_level;
3082
3083		calcs_output->nbp_state_change_enable =
3084			data->nbp_state_change_enable;
3085		calcs_output->cpuc_state_change_enable =
3086				data->cpuc_state_change_enable;
3087		calcs_output->cpup_state_change_enable =
3088				data->cpup_state_change_enable;
3089		calcs_output->stutter_mode_enable =
3090				data->stutter_mode_enable;
3091		calcs_output->dispclk_khz =
3092			bw_fixed_to_int(bw_mul(data->dispclk,
3093					bw_int_to_fixed(1000)));
3094		calcs_output->blackout_recovery_time_us =
3095			bw_fixed_to_int(data->blackout_recovery_time);
3096		calcs_output->sclk_khz =
3097			bw_fixed_to_int(bw_mul(data->required_sclk,
3098					bw_int_to_fixed(1000)));
3099		calcs_output->sclk_deep_sleep_khz =
3100			bw_fixed_to_int(bw_mul(data->sclk_deep_sleep,
3101					bw_int_to_fixed(1000)));
3102		if (yclk_lvl == 0)
3103			calcs_output->yclk_khz = bw_fixed_to_int(
3104				bw_mul(low_yclk, bw_int_to_fixed(1000)));
3105		else if (yclk_lvl == 1)
3106			calcs_output->yclk_khz = bw_fixed_to_int(
3107				bw_mul(mid_yclk, bw_int_to_fixed(1000)));
3108		else
3109			calcs_output->yclk_khz = bw_fixed_to_int(
3110				bw_mul(high_yclk, bw_int_to_fixed(1000)));
3111
3112		/* units: nanosecond, 16bit storage. */
3113
3114		calcs_output->nbp_state_change_wm_ns[0].a_mark =
3115			bw_fixed_to_int(bw_mul(data->
3116				nbp_state_change_watermark[4], bw_int_to_fixed(1000)));
3117		calcs_output->nbp_state_change_wm_ns[1].a_mark =
3118			bw_fixed_to_int(bw_mul(data->
3119				nbp_state_change_watermark[5], bw_int_to_fixed(1000)));
3120		calcs_output->nbp_state_change_wm_ns[2].a_mark =
3121			bw_fixed_to_int(bw_mul(data->
3122				nbp_state_change_watermark[6], bw_int_to_fixed(1000)));
3123
3124		if (ctx->dc->caps.max_slave_planes) {
3125			calcs_output->nbp_state_change_wm_ns[3].a_mark =
3126				bw_fixed_to_int(bw_mul(data->
3127					nbp_state_change_watermark[0], bw_int_to_fixed(1000)));
3128			calcs_output->nbp_state_change_wm_ns[4].a_mark =
3129				bw_fixed_to_int(bw_mul(data->
3130							nbp_state_change_watermark[1], bw_int_to_fixed(1000)));
3131		} else {
3132			calcs_output->nbp_state_change_wm_ns[3].a_mark =
3133				bw_fixed_to_int(bw_mul(data->
3134					nbp_state_change_watermark[7], bw_int_to_fixed(1000)));
3135			calcs_output->nbp_state_change_wm_ns[4].a_mark =
3136				bw_fixed_to_int(bw_mul(data->
3137					nbp_state_change_watermark[8], bw_int_to_fixed(1000)));
3138		}
3139		calcs_output->nbp_state_change_wm_ns[5].a_mark =
3140			bw_fixed_to_int(bw_mul(data->
3141				nbp_state_change_watermark[9], bw_int_to_fixed(1000)));
3142
3143
3144
3145		calcs_output->stutter_exit_wm_ns[0].a_mark =
3146			bw_fixed_to_int(bw_mul(data->
3147				stutter_exit_watermark[4], bw_int_to_fixed(1000)));
3148		calcs_output->stutter_exit_wm_ns[1].a_mark =
3149			bw_fixed_to_int(bw_mul(data->
3150				stutter_exit_watermark[5], bw_int_to_fixed(1000)));
3151		calcs_output->stutter_exit_wm_ns[2].a_mark =
3152			bw_fixed_to_int(bw_mul(data->
3153				stutter_exit_watermark[6], bw_int_to_fixed(1000)));
3154		if (ctx->dc->caps.max_slave_planes) {
3155			calcs_output->stutter_exit_wm_ns[3].a_mark =
3156				bw_fixed_to_int(bw_mul(data->
3157					stutter_exit_watermark[0], bw_int_to_fixed(1000)));
3158			calcs_output->stutter_exit_wm_ns[4].a_mark =
3159				bw_fixed_to_int(bw_mul(data->
3160					stutter_exit_watermark[1], bw_int_to_fixed(1000)));
3161		} else {
3162			calcs_output->stutter_exit_wm_ns[3].a_mark =
3163				bw_fixed_to_int(bw_mul(data->
3164					stutter_exit_watermark[7], bw_int_to_fixed(1000)));
3165			calcs_output->stutter_exit_wm_ns[4].a_mark =
3166				bw_fixed_to_int(bw_mul(data->
3167					stutter_exit_watermark[8], bw_int_to_fixed(1000)));
3168		}
3169		calcs_output->stutter_exit_wm_ns[5].a_mark =
3170			bw_fixed_to_int(bw_mul(data->
3171				stutter_exit_watermark[9], bw_int_to_fixed(1000)));
3172
3173		calcs_output->stutter_entry_wm_ns[0].a_mark =
3174			bw_fixed_to_int(bw_mul(data->
3175				stutter_entry_watermark[4], bw_int_to_fixed(1000)));
3176		calcs_output->stutter_entry_wm_ns[1].a_mark =
3177			bw_fixed_to_int(bw_mul(data->
3178				stutter_entry_watermark[5], bw_int_to_fixed(1000)));
3179		calcs_output->stutter_entry_wm_ns[2].a_mark =
3180			bw_fixed_to_int(bw_mul(data->
3181				stutter_entry_watermark[6], bw_int_to_fixed(1000)));
3182		if (ctx->dc->caps.max_slave_planes) {
3183			calcs_output->stutter_entry_wm_ns[3].a_mark =
3184				bw_fixed_to_int(bw_mul(data->
3185					stutter_entry_watermark[0], bw_int_to_fixed(1000)));
3186			calcs_output->stutter_entry_wm_ns[4].a_mark =
3187				bw_fixed_to_int(bw_mul(data->
3188					stutter_entry_watermark[1], bw_int_to_fixed(1000)));
3189		} else {
3190			calcs_output->stutter_entry_wm_ns[3].a_mark =
3191				bw_fixed_to_int(bw_mul(data->
3192					stutter_entry_watermark[7], bw_int_to_fixed(1000)));
3193			calcs_output->stutter_entry_wm_ns[4].a_mark =
3194				bw_fixed_to_int(bw_mul(data->
3195					stutter_entry_watermark[8], bw_int_to_fixed(1000)));
3196		}
3197		calcs_output->stutter_entry_wm_ns[5].a_mark =
3198			bw_fixed_to_int(bw_mul(data->
3199				stutter_entry_watermark[9], bw_int_to_fixed(1000)));
3200
3201		calcs_output->urgent_wm_ns[0].a_mark =
3202			bw_fixed_to_int(bw_mul(data->
3203				urgent_watermark[4], bw_int_to_fixed(1000)));
3204		calcs_output->urgent_wm_ns[1].a_mark =
3205			bw_fixed_to_int(bw_mul(data->
3206				urgent_watermark[5], bw_int_to_fixed(1000)));
3207		calcs_output->urgent_wm_ns[2].a_mark =
3208			bw_fixed_to_int(bw_mul(data->
3209				urgent_watermark[6], bw_int_to_fixed(1000)));
3210		if (ctx->dc->caps.max_slave_planes) {
3211			calcs_output->urgent_wm_ns[3].a_mark =
3212				bw_fixed_to_int(bw_mul(data->
3213					urgent_watermark[0], bw_int_to_fixed(1000)));
3214			calcs_output->urgent_wm_ns[4].a_mark =
3215				bw_fixed_to_int(bw_mul(data->
3216					urgent_watermark[1], bw_int_to_fixed(1000)));
3217		} else {
3218			calcs_output->urgent_wm_ns[3].a_mark =
3219				bw_fixed_to_int(bw_mul(data->
3220					urgent_watermark[7], bw_int_to_fixed(1000)));
3221			calcs_output->urgent_wm_ns[4].a_mark =
3222				bw_fixed_to_int(bw_mul(data->
3223					urgent_watermark[8], bw_int_to_fixed(1000)));
3224		}
3225		calcs_output->urgent_wm_ns[5].a_mark =
3226			bw_fixed_to_int(bw_mul(data->
3227				urgent_watermark[9], bw_int_to_fixed(1000)));
3228
3229		if (dceip->version != BW_CALCS_VERSION_CARRIZO) {
3230			((struct bw_calcs_vbios *)vbios)->low_sclk = mid3_sclk;
3231			((struct bw_calcs_vbios *)vbios)->mid1_sclk = mid3_sclk;
3232			((struct bw_calcs_vbios *)vbios)->mid2_sclk = mid3_sclk;
3233			calculate_bandwidth(dceip, vbios, data);
3234
3235			calcs_output->nbp_state_change_wm_ns[0].b_mark =
3236				bw_fixed_to_int(bw_mul(data->
3237					nbp_state_change_watermark[4],bw_int_to_fixed(1000)));
3238			calcs_output->nbp_state_change_wm_ns[1].b_mark =
3239				bw_fixed_to_int(bw_mul(data->
3240					nbp_state_change_watermark[5], bw_int_to_fixed(1000)));
3241			calcs_output->nbp_state_change_wm_ns[2].b_mark =
3242				bw_fixed_to_int(bw_mul(data->
3243					nbp_state_change_watermark[6], bw_int_to_fixed(1000)));
3244
3245			if (ctx->dc->caps.max_slave_planes) {
3246				calcs_output->nbp_state_change_wm_ns[3].b_mark =
3247					bw_fixed_to_int(bw_mul(data->
3248						nbp_state_change_watermark[0], bw_int_to_fixed(1000)));
3249				calcs_output->nbp_state_change_wm_ns[4].b_mark =
3250					bw_fixed_to_int(bw_mul(data->
3251						nbp_state_change_watermark[1], bw_int_to_fixed(1000)));
3252			} else {
3253				calcs_output->nbp_state_change_wm_ns[3].b_mark =
3254					bw_fixed_to_int(bw_mul(data->
3255						nbp_state_change_watermark[7], bw_int_to_fixed(1000)));
3256				calcs_output->nbp_state_change_wm_ns[4].b_mark =
3257					bw_fixed_to_int(bw_mul(data->
3258						nbp_state_change_watermark[8], bw_int_to_fixed(1000)));
3259			}
3260			calcs_output->nbp_state_change_wm_ns[5].b_mark =
3261				bw_fixed_to_int(bw_mul(data->
3262					nbp_state_change_watermark[9], bw_int_to_fixed(1000)));
3263
3264
3265
3266			calcs_output->stutter_exit_wm_ns[0].b_mark =
3267				bw_fixed_to_int(bw_mul(data->
3268					stutter_exit_watermark[4], bw_int_to_fixed(1000)));
3269			calcs_output->stutter_exit_wm_ns[1].b_mark =
3270				bw_fixed_to_int(bw_mul(data->
3271					stutter_exit_watermark[5], bw_int_to_fixed(1000)));
3272			calcs_output->stutter_exit_wm_ns[2].b_mark =
3273				bw_fixed_to_int(bw_mul(data->
3274					stutter_exit_watermark[6], bw_int_to_fixed(1000)));
3275			if (ctx->dc->caps.max_slave_planes) {
3276				calcs_output->stutter_exit_wm_ns[3].b_mark =
3277					bw_fixed_to_int(bw_mul(data->
3278						stutter_exit_watermark[0], bw_int_to_fixed(1000)));
3279				calcs_output->stutter_exit_wm_ns[4].b_mark =
3280					bw_fixed_to_int(bw_mul(data->
3281						stutter_exit_watermark[1], bw_int_to_fixed(1000)));
3282			} else {
3283				calcs_output->stutter_exit_wm_ns[3].b_mark =
3284					bw_fixed_to_int(bw_mul(data->
3285						stutter_exit_watermark[7], bw_int_to_fixed(1000)));
3286				calcs_output->stutter_exit_wm_ns[4].b_mark =
3287					bw_fixed_to_int(bw_mul(data->
3288						stutter_exit_watermark[8], bw_int_to_fixed(1000)));
3289			}
3290			calcs_output->stutter_exit_wm_ns[5].b_mark =
3291				bw_fixed_to_int(bw_mul(data->
3292					stutter_exit_watermark[9], bw_int_to_fixed(1000)));
3293
3294			calcs_output->stutter_entry_wm_ns[0].b_mark =
3295				bw_fixed_to_int(bw_mul(data->
3296					stutter_entry_watermark[4], bw_int_to_fixed(1000)));
3297			calcs_output->stutter_entry_wm_ns[1].b_mark =
3298				bw_fixed_to_int(bw_mul(data->
3299					stutter_entry_watermark[5], bw_int_to_fixed(1000)));
3300			calcs_output->stutter_entry_wm_ns[2].b_mark =
3301				bw_fixed_to_int(bw_mul(data->
3302					stutter_entry_watermark[6], bw_int_to_fixed(1000)));
3303			if (ctx->dc->caps.max_slave_planes) {
3304				calcs_output->stutter_entry_wm_ns[3].b_mark =
3305					bw_fixed_to_int(bw_mul(data->
3306						stutter_entry_watermark[0], bw_int_to_fixed(1000)));
3307				calcs_output->stutter_entry_wm_ns[4].b_mark =
3308					bw_fixed_to_int(bw_mul(data->
3309						stutter_entry_watermark[1], bw_int_to_fixed(1000)));
3310			} else {
3311				calcs_output->stutter_entry_wm_ns[3].b_mark =
3312					bw_fixed_to_int(bw_mul(data->
3313						stutter_entry_watermark[7], bw_int_to_fixed(1000)));
3314				calcs_output->stutter_entry_wm_ns[4].b_mark =
3315					bw_fixed_to_int(bw_mul(data->
3316						stutter_entry_watermark[8], bw_int_to_fixed(1000)));
3317			}
3318			calcs_output->stutter_entry_wm_ns[5].b_mark =
3319				bw_fixed_to_int(bw_mul(data->
3320					stutter_entry_watermark[9], bw_int_to_fixed(1000)));
3321
3322			calcs_output->urgent_wm_ns[0].b_mark =
3323				bw_fixed_to_int(bw_mul(data->
3324					urgent_watermark[4], bw_int_to_fixed(1000)));
3325			calcs_output->urgent_wm_ns[1].b_mark =
3326				bw_fixed_to_int(bw_mul(data->
3327					urgent_watermark[5], bw_int_to_fixed(1000)));
3328			calcs_output->urgent_wm_ns[2].b_mark =
3329				bw_fixed_to_int(bw_mul(data->
3330					urgent_watermark[6], bw_int_to_fixed(1000)));
3331			if (ctx->dc->caps.max_slave_planes) {
3332				calcs_output->urgent_wm_ns[3].b_mark =
3333					bw_fixed_to_int(bw_mul(data->
3334						urgent_watermark[0], bw_int_to_fixed(1000)));
3335				calcs_output->urgent_wm_ns[4].b_mark =
3336					bw_fixed_to_int(bw_mul(data->
3337						urgent_watermark[1], bw_int_to_fixed(1000)));
3338			} else {
3339				calcs_output->urgent_wm_ns[3].b_mark =
3340					bw_fixed_to_int(bw_mul(data->
3341						urgent_watermark[7], bw_int_to_fixed(1000)));
3342				calcs_output->urgent_wm_ns[4].b_mark =
3343					bw_fixed_to_int(bw_mul(data->
3344						urgent_watermark[8], bw_int_to_fixed(1000)));
3345			}
3346			calcs_output->urgent_wm_ns[5].b_mark =
3347				bw_fixed_to_int(bw_mul(data->
3348					urgent_watermark[9], bw_int_to_fixed(1000)));
3349
3350			((struct bw_calcs_vbios *)vbios)->low_sclk = low_sclk;
3351			((struct bw_calcs_vbios *)vbios)->mid1_sclk = mid1_sclk;
3352			((struct bw_calcs_vbios *)vbios)->mid2_sclk = mid2_sclk;
3353			((struct bw_calcs_vbios *)vbios)->low_yclk = mid_yclk;
3354			calculate_bandwidth(dceip, vbios, data);
3355
3356			calcs_output->nbp_state_change_wm_ns[0].c_mark =
3357				bw_fixed_to_int(bw_mul(data->
3358					nbp_state_change_watermark[4], bw_int_to_fixed(1000)));
3359			calcs_output->nbp_state_change_wm_ns[1].c_mark =
3360				bw_fixed_to_int(bw_mul(data->
3361					nbp_state_change_watermark[5], bw_int_to_fixed(1000)));
3362			calcs_output->nbp_state_change_wm_ns[2].c_mark =
3363				bw_fixed_to_int(bw_mul(data->
3364					nbp_state_change_watermark[6], bw_int_to_fixed(1000)));
3365			if (ctx->dc->caps.max_slave_planes) {
3366				calcs_output->nbp_state_change_wm_ns[3].c_mark =
3367					bw_fixed_to_int(bw_mul(data->
3368						nbp_state_change_watermark[0], bw_int_to_fixed(1000)));
3369				calcs_output->nbp_state_change_wm_ns[4].c_mark =
3370					bw_fixed_to_int(bw_mul(data->
3371						nbp_state_change_watermark[1], bw_int_to_fixed(1000)));
3372			} else {
3373				calcs_output->nbp_state_change_wm_ns[3].c_mark =
3374					bw_fixed_to_int(bw_mul(data->
3375						nbp_state_change_watermark[7], bw_int_to_fixed(1000)));
3376				calcs_output->nbp_state_change_wm_ns[4].c_mark =
3377					bw_fixed_to_int(bw_mul(data->
3378						nbp_state_change_watermark[8], bw_int_to_fixed(1000)));
3379			}
3380			calcs_output->nbp_state_change_wm_ns[5].c_mark =
3381				bw_fixed_to_int(bw_mul(data->
3382					nbp_state_change_watermark[9], bw_int_to_fixed(1000)));
3383
3384
3385			calcs_output->stutter_exit_wm_ns[0].c_mark =
3386				bw_fixed_to_int(bw_mul(data->
3387					stutter_exit_watermark[4], bw_int_to_fixed(1000)));
3388			calcs_output->stutter_exit_wm_ns[1].c_mark =
3389				bw_fixed_to_int(bw_mul(data->
3390					stutter_exit_watermark[5], bw_int_to_fixed(1000)));
3391			calcs_output->stutter_exit_wm_ns[2].c_mark =
3392				bw_fixed_to_int(bw_mul(data->
3393					stutter_exit_watermark[6], bw_int_to_fixed(1000)));
3394			if (ctx->dc->caps.max_slave_planes) {
3395				calcs_output->stutter_exit_wm_ns[3].c_mark =
3396					bw_fixed_to_int(bw_mul(data->
3397						stutter_exit_watermark[0], bw_int_to_fixed(1000)));
3398				calcs_output->stutter_exit_wm_ns[4].c_mark =
3399					bw_fixed_to_int(bw_mul(data->
3400						stutter_exit_watermark[1], bw_int_to_fixed(1000)));
3401			} else {
3402				calcs_output->stutter_exit_wm_ns[3].c_mark =
3403					bw_fixed_to_int(bw_mul(data->
3404						stutter_exit_watermark[7], bw_int_to_fixed(1000)));
3405				calcs_output->stutter_exit_wm_ns[4].c_mark =
3406					bw_fixed_to_int(bw_mul(data->
3407						stutter_exit_watermark[8], bw_int_to_fixed(1000)));
3408			}
3409			calcs_output->stutter_exit_wm_ns[5].c_mark =
3410				bw_fixed_to_int(bw_mul(data->
3411					stutter_exit_watermark[9], bw_int_to_fixed(1000)));
3412			calcs_output->stutter_entry_wm_ns[0].c_mark =
3413				bw_fixed_to_int(bw_mul(data->
3414					stutter_entry_watermark[4], bw_int_to_fixed(1000)));
3415			calcs_output->stutter_entry_wm_ns[1].c_mark =
3416				bw_fixed_to_int(bw_mul(data->
3417					stutter_entry_watermark[5], bw_int_to_fixed(1000)));
3418			calcs_output->stutter_entry_wm_ns[2].c_mark =
3419				bw_fixed_to_int(bw_mul(data->
3420					stutter_entry_watermark[6], bw_int_to_fixed(1000)));
3421			if (ctx->dc->caps.max_slave_planes) {
3422				calcs_output->stutter_entry_wm_ns[3].c_mark =
3423					bw_fixed_to_int(bw_mul(data->stutter_entry_watermark[0],
3424						bw_int_to_fixed(1000)));
3425				calcs_output->stutter_entry_wm_ns[4].c_mark =
3426					bw_fixed_to_int(bw_mul(data->stutter_entry_watermark[1],
3427						bw_int_to_fixed(1000)));
3428			} else {
3429				calcs_output->stutter_entry_wm_ns[3].c_mark =
3430					bw_fixed_to_int(bw_mul(data->stutter_entry_watermark[7],
3431						bw_int_to_fixed(1000)));
3432				calcs_output->stutter_entry_wm_ns[4].c_mark =
3433					bw_fixed_to_int(bw_mul(data->stutter_entry_watermark[8],
3434						bw_int_to_fixed(1000)));
3435			}
3436			calcs_output->stutter_entry_wm_ns[5].c_mark =
3437				bw_fixed_to_int(bw_mul(data->
3438					stutter_entry_watermark[9], bw_int_to_fixed(1000)));
3439			calcs_output->urgent_wm_ns[0].c_mark =
3440				bw_fixed_to_int(bw_mul(data->
3441					urgent_watermark[4], bw_int_to_fixed(1000)));
3442			calcs_output->urgent_wm_ns[1].c_mark =
3443				bw_fixed_to_int(bw_mul(data->
3444					urgent_watermark[5], bw_int_to_fixed(1000)));
3445			calcs_output->urgent_wm_ns[2].c_mark =
3446				bw_fixed_to_int(bw_mul(data->
3447					urgent_watermark[6], bw_int_to_fixed(1000)));
3448			if (ctx->dc->caps.max_slave_planes) {
3449				calcs_output->urgent_wm_ns[3].c_mark =
3450					bw_fixed_to_int(bw_mul(data->
3451						urgent_watermark[0], bw_int_to_fixed(1000)));
3452				calcs_output->urgent_wm_ns[4].c_mark =
3453					bw_fixed_to_int(bw_mul(data->
3454						urgent_watermark[1], bw_int_to_fixed(1000)));
3455			} else {
3456				calcs_output->urgent_wm_ns[3].c_mark =
3457					bw_fixed_to_int(bw_mul(data->
3458						urgent_watermark[7], bw_int_to_fixed(1000)));
3459				calcs_output->urgent_wm_ns[4].c_mark =
3460					bw_fixed_to_int(bw_mul(data->
3461						urgent_watermark[8], bw_int_to_fixed(1000)));
3462			}
3463			calcs_output->urgent_wm_ns[5].c_mark =
3464				bw_fixed_to_int(bw_mul(data->
3465					urgent_watermark[9], bw_int_to_fixed(1000)));
3466		}
3467
3468		if (dceip->version == BW_CALCS_VERSION_CARRIZO) {
3469			((struct bw_calcs_vbios *)vbios)->low_yclk = high_yclk;
3470			((struct bw_calcs_vbios *)vbios)->mid_yclk = high_yclk;
3471			((struct bw_calcs_vbios *)vbios)->low_sclk = high_sclk;
3472			((struct bw_calcs_vbios *)vbios)->mid1_sclk = high_sclk;
3473			((struct bw_calcs_vbios *)vbios)->mid2_sclk = high_sclk;
3474			((struct bw_calcs_vbios *)vbios)->mid3_sclk = high_sclk;
3475			((struct bw_calcs_vbios *)vbios)->mid4_sclk = high_sclk;
3476			((struct bw_calcs_vbios *)vbios)->mid5_sclk = high_sclk;
3477			((struct bw_calcs_vbios *)vbios)->mid6_sclk = high_sclk;
3478		} else {
3479			((struct bw_calcs_vbios *)vbios)->low_yclk = mid_yclk;
3480			((struct bw_calcs_vbios *)vbios)->low_sclk = mid3_sclk;
3481			((struct bw_calcs_vbios *)vbios)->mid1_sclk = mid3_sclk;
3482			((struct bw_calcs_vbios *)vbios)->mid2_sclk = mid3_sclk;
3483		}
3484
3485		calculate_bandwidth(dceip, vbios, data);
3486
3487		calcs_output->nbp_state_change_wm_ns[0].d_mark =
3488			bw_fixed_to_int(bw_mul(data->
3489				nbp_state_change_watermark[4], bw_int_to_fixed(1000)));
3490		calcs_output->nbp_state_change_wm_ns[1].d_mark =
3491			bw_fixed_to_int(bw_mul(data->
3492				nbp_state_change_watermark[5], bw_int_to_fixed(1000)));
3493		calcs_output->nbp_state_change_wm_ns[2].d_mark =
3494			bw_fixed_to_int(bw_mul(data->
3495				nbp_state_change_watermark[6], bw_int_to_fixed(1000)));
3496		if (ctx->dc->caps.max_slave_planes) {
3497			calcs_output->nbp_state_change_wm_ns[3].d_mark =
3498				bw_fixed_to_int(bw_mul(data->
3499					nbp_state_change_watermark[0], bw_int_to_fixed(1000)));
3500			calcs_output->nbp_state_change_wm_ns[4].d_mark =
3501				bw_fixed_to_int(bw_mul(data->
3502					nbp_state_change_watermark[1], bw_int_to_fixed(1000)));
3503		} else {
3504			calcs_output->nbp_state_change_wm_ns[3].d_mark =
3505				bw_fixed_to_int(bw_mul(data->
3506					nbp_state_change_watermark[7], bw_int_to_fixed(1000)));
3507			calcs_output->nbp_state_change_wm_ns[4].d_mark =
3508				bw_fixed_to_int(bw_mul(data->
3509					nbp_state_change_watermark[8], bw_int_to_fixed(1000)));
3510		}
3511		calcs_output->nbp_state_change_wm_ns[5].d_mark =
3512			bw_fixed_to_int(bw_mul(data->
3513				nbp_state_change_watermark[9], bw_int_to_fixed(1000)));
3514
3515		calcs_output->stutter_exit_wm_ns[0].d_mark =
3516			bw_fixed_to_int(bw_mul(data->
3517				stutter_exit_watermark[4], bw_int_to_fixed(1000)));
3518		calcs_output->stutter_exit_wm_ns[1].d_mark =
3519			bw_fixed_to_int(bw_mul(data->
3520				stutter_exit_watermark[5], bw_int_to_fixed(1000)));
3521		calcs_output->stutter_exit_wm_ns[2].d_mark =
3522			bw_fixed_to_int(bw_mul(data->
3523				stutter_exit_watermark[6], bw_int_to_fixed(1000)));
3524		if (ctx->dc->caps.max_slave_planes) {
3525			calcs_output->stutter_exit_wm_ns[3].d_mark =
3526				bw_fixed_to_int(bw_mul(data->
3527					stutter_exit_watermark[0], bw_int_to_fixed(1000)));
3528			calcs_output->stutter_exit_wm_ns[4].d_mark =
3529				bw_fixed_to_int(bw_mul(data->
3530					stutter_exit_watermark[1], bw_int_to_fixed(1000)));
3531		} else {
3532			calcs_output->stutter_exit_wm_ns[3].d_mark =
3533				bw_fixed_to_int(bw_mul(data->
3534					stutter_exit_watermark[7], bw_int_to_fixed(1000)));
3535			calcs_output->stutter_exit_wm_ns[4].d_mark =
3536				bw_fixed_to_int(bw_mul(data->
3537					stutter_exit_watermark[8], bw_int_to_fixed(1000)));
3538		}
3539		calcs_output->stutter_exit_wm_ns[5].d_mark =
3540			bw_fixed_to_int(bw_mul(data->
3541				stutter_exit_watermark[9], bw_int_to_fixed(1000)));
3542
3543		calcs_output->stutter_entry_wm_ns[0].d_mark =
3544			bw_fixed_to_int(bw_mul(data->
3545				stutter_entry_watermark[4], bw_int_to_fixed(1000)));
3546		calcs_output->stutter_entry_wm_ns[1].d_mark =
3547			bw_fixed_to_int(bw_mul(data->
3548				stutter_entry_watermark[5], bw_int_to_fixed(1000)));
3549		calcs_output->stutter_entry_wm_ns[2].d_mark =
3550			bw_fixed_to_int(bw_mul(data->
3551				stutter_entry_watermark[6], bw_int_to_fixed(1000)));
3552		if (ctx->dc->caps.max_slave_planes) {
3553			calcs_output->stutter_entry_wm_ns[3].d_mark =
3554				bw_fixed_to_int(bw_mul(data->
3555					stutter_entry_watermark[0], bw_int_to_fixed(1000)));
3556			calcs_output->stutter_entry_wm_ns[4].d_mark =
3557				bw_fixed_to_int(bw_mul(data->
3558					stutter_entry_watermark[1], bw_int_to_fixed(1000)));
3559		} else {
3560			calcs_output->stutter_entry_wm_ns[3].d_mark =
3561				bw_fixed_to_int(bw_mul(data->
3562					stutter_entry_watermark[7], bw_int_to_fixed(1000)));
3563			calcs_output->stutter_entry_wm_ns[4].d_mark =
3564				bw_fixed_to_int(bw_mul(data->
3565					stutter_entry_watermark[8], bw_int_to_fixed(1000)));
3566		}
3567		calcs_output->stutter_entry_wm_ns[5].d_mark =
3568			bw_fixed_to_int(bw_mul(data->
3569				stutter_entry_watermark[9], bw_int_to_fixed(1000)));
3570
3571		calcs_output->urgent_wm_ns[0].d_mark =
3572			bw_fixed_to_int(bw_mul(data->
3573				urgent_watermark[4], bw_int_to_fixed(1000)));
3574		calcs_output->urgent_wm_ns[1].d_mark =
3575			bw_fixed_to_int(bw_mul(data->
3576				urgent_watermark[5], bw_int_to_fixed(1000)));
3577		calcs_output->urgent_wm_ns[2].d_mark =
3578			bw_fixed_to_int(bw_mul(data->
3579				urgent_watermark[6], bw_int_to_fixed(1000)));
3580		if (ctx->dc->caps.max_slave_planes) {
3581			calcs_output->urgent_wm_ns[3].d_mark =
3582				bw_fixed_to_int(bw_mul(data->
3583					urgent_watermark[0], bw_int_to_fixed(1000)));
3584			calcs_output->urgent_wm_ns[4].d_mark =
3585				bw_fixed_to_int(bw_mul(data->
3586					urgent_watermark[1], bw_int_to_fixed(1000)));
3587		} else {
3588			calcs_output->urgent_wm_ns[3].d_mark =
3589				bw_fixed_to_int(bw_mul(data->
3590					urgent_watermark[7], bw_int_to_fixed(1000)));
3591			calcs_output->urgent_wm_ns[4].d_mark =
3592				bw_fixed_to_int(bw_mul(data->
3593					urgent_watermark[8], bw_int_to_fixed(1000)));
3594		}
3595		calcs_output->urgent_wm_ns[5].d_mark =
3596			bw_fixed_to_int(bw_mul(data->
3597				urgent_watermark[9], bw_int_to_fixed(1000)));
3598
3599		((struct bw_calcs_vbios *)vbios)->low_yclk = low_yclk;
3600		((struct bw_calcs_vbios *)vbios)->mid_yclk = mid_yclk;
3601		((struct bw_calcs_vbios *)vbios)->low_sclk = low_sclk;
3602		((struct bw_calcs_vbios *)vbios)->mid1_sclk = mid1_sclk;
3603		((struct bw_calcs_vbios *)vbios)->mid2_sclk = mid2_sclk;
3604		((struct bw_calcs_vbios *)vbios)->mid3_sclk = mid3_sclk;
3605		((struct bw_calcs_vbios *)vbios)->mid4_sclk = mid4_sclk;
3606		((struct bw_calcs_vbios *)vbios)->mid5_sclk = mid5_sclk;
3607		((struct bw_calcs_vbios *)vbios)->mid6_sclk = mid6_sclk;
3608		((struct bw_calcs_vbios *)vbios)->high_sclk = high_sclk;
3609	} else {
3610		calcs_output->nbp_state_change_enable = true;
3611		calcs_output->cpuc_state_change_enable = true;
3612		calcs_output->cpup_state_change_enable = true;
3613		calcs_output->stutter_mode_enable = true;
3614		calcs_output->dispclk_khz = 0;
3615		calcs_output->sclk_khz = 0;
3616	}
3617
3618	kfree(data);
3619
3620	return is_display_configuration_supported(vbios, calcs_output);
3621}