Bug Summary

File:dev/pci/drm/amd/display/dc/calcs/dce_calcs.c
Warning:line 1496, column 2
Value stored to 'num_cursor_lines' is never read

Annotated Source Code

Press '?' to see keyboard shortcuts

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