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