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