0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #include <linux/slab.h>
0027
0028 #include "resource.h"
0029 #include "dm_services.h"
0030 #include "dce_calcs.h"
0031 #include "dc.h"
0032 #include "core_types.h"
0033 #include "dal_asic_id.h"
0034 #include "calcs_logger.h"
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 static enum bw_calcs_version bw_calcs_version_from_asic_id(struct hw_asic_id asic_id)
0050 {
0051 switch (asic_id.chip_family) {
0052
0053 case FAMILY_CZ:
0054 if (ASIC_REV_IS_STONEY(asic_id.hw_internal_rev))
0055 return BW_CALCS_VERSION_STONEY;
0056 return BW_CALCS_VERSION_CARRIZO;
0057
0058 case FAMILY_VI:
0059 if (ASIC_REV_IS_POLARIS12_V(asic_id.hw_internal_rev))
0060 return BW_CALCS_VERSION_POLARIS12;
0061 if (ASIC_REV_IS_POLARIS10_P(asic_id.hw_internal_rev))
0062 return BW_CALCS_VERSION_POLARIS10;
0063 if (ASIC_REV_IS_POLARIS11_M(asic_id.hw_internal_rev))
0064 return BW_CALCS_VERSION_POLARIS11;
0065 if (ASIC_REV_IS_VEGAM(asic_id.hw_internal_rev))
0066 return BW_CALCS_VERSION_VEGAM;
0067 return BW_CALCS_VERSION_INVALID;
0068
0069 case FAMILY_AI:
0070 return BW_CALCS_VERSION_VEGA10;
0071
0072 default:
0073 return BW_CALCS_VERSION_INVALID;
0074 }
0075 }
0076
0077 static void calculate_bandwidth(
0078 const struct bw_calcs_dceip *dceip,
0079 const struct bw_calcs_vbios *vbios,
0080 struct bw_calcs_data *data)
0081
0082 {
0083 const int32_t pixels_per_chunk = 512;
0084 const int32_t high = 2;
0085 const int32_t mid = 1;
0086 const int32_t low = 0;
0087 const uint32_t s_low = 0;
0088 const uint32_t s_mid1 = 1;
0089 const uint32_t s_mid2 = 2;
0090 const uint32_t s_mid3 = 3;
0091 const uint32_t s_mid4 = 4;
0092 const uint32_t s_mid5 = 5;
0093 const uint32_t s_mid6 = 6;
0094 const uint32_t s_high = 7;
0095 const uint32_t dmif_chunk_buff_margin = 1;
0096
0097 uint32_t max_chunks_fbc_mode;
0098 int32_t num_cursor_lines;
0099
0100 int32_t i, j, k;
0101 struct bw_fixed *yclk;
0102 struct bw_fixed *sclk;
0103 bool d0_underlay_enable;
0104 bool d1_underlay_enable;
0105 bool fbc_enabled;
0106 bool lpt_enabled;
0107 enum bw_defines sclk_message;
0108 enum bw_defines yclk_message;
0109 enum bw_defines *tiling_mode;
0110 enum bw_defines *surface_type;
0111 enum bw_defines voltage;
0112 enum bw_defines pipe_check;
0113 enum bw_defines hsr_check;
0114 enum bw_defines vsr_check;
0115 enum bw_defines lb_size_check;
0116 enum bw_defines fbc_check;
0117 enum bw_defines rotation_check;
0118 enum bw_defines mode_check;
0119 enum bw_defines nbp_state_change_enable_blank;
0120
0121 int32_t number_of_displays_enabled = 0;
0122 int32_t number_of_displays_enabled_with_margin = 0;
0123 int32_t number_of_aligned_displays_with_no_margin = 0;
0124
0125 yclk = kcalloc(3, sizeof(*yclk), GFP_KERNEL);
0126 if (!yclk)
0127 return;
0128
0129 sclk = kcalloc(8, sizeof(*sclk), GFP_KERNEL);
0130 if (!sclk)
0131 goto free_yclk;
0132
0133 tiling_mode = kcalloc(maximum_number_of_surfaces, sizeof(*tiling_mode), GFP_KERNEL);
0134 if (!tiling_mode)
0135 goto free_sclk;
0136
0137 surface_type = kcalloc(maximum_number_of_surfaces, sizeof(*surface_type), GFP_KERNEL);
0138 if (!surface_type)
0139 goto free_tiling_mode;
0140
0141 yclk[low] = vbios->low_yclk;
0142 yclk[mid] = vbios->mid_yclk;
0143 yclk[high] = vbios->high_yclk;
0144 sclk[s_low] = vbios->low_sclk;
0145 sclk[s_mid1] = vbios->mid1_sclk;
0146 sclk[s_mid2] = vbios->mid2_sclk;
0147 sclk[s_mid3] = vbios->mid3_sclk;
0148 sclk[s_mid4] = vbios->mid4_sclk;
0149 sclk[s_mid5] = vbios->mid5_sclk;
0150 sclk[s_mid6] = vbios->mid6_sclk;
0151 sclk[s_high] = vbios->high_sclk;
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172 if (data->d0_underlay_mode == bw_def_none)
0173 d0_underlay_enable = false;
0174 else
0175 d0_underlay_enable = true;
0176 if (data->d1_underlay_mode == bw_def_none)
0177 d1_underlay_enable = false;
0178 else
0179 d1_underlay_enable = true;
0180 data->number_of_underlay_surfaces = d0_underlay_enable + d1_underlay_enable;
0181 switch (data->underlay_surface_type) {
0182 case bw_def_420:
0183 surface_type[0] = bw_def_underlay420_luma;
0184 surface_type[2] = bw_def_underlay420_luma;
0185 data->bytes_per_pixel[0] = 1;
0186 data->bytes_per_pixel[2] = 1;
0187 surface_type[1] = bw_def_underlay420_chroma;
0188 surface_type[3] = bw_def_underlay420_chroma;
0189 data->bytes_per_pixel[1] = 2;
0190 data->bytes_per_pixel[3] = 2;
0191 data->lb_size_per_component[0] = dceip->underlay420_luma_lb_size_per_component;
0192 data->lb_size_per_component[1] = dceip->underlay420_chroma_lb_size_per_component;
0193 data->lb_size_per_component[2] = dceip->underlay420_luma_lb_size_per_component;
0194 data->lb_size_per_component[3] = dceip->underlay420_chroma_lb_size_per_component;
0195 break;
0196 case bw_def_422:
0197 surface_type[0] = bw_def_underlay422;
0198 surface_type[2] = bw_def_underlay422;
0199 data->bytes_per_pixel[0] = 2;
0200 data->bytes_per_pixel[2] = 2;
0201 data->lb_size_per_component[0] = dceip->underlay422_lb_size_per_component;
0202 data->lb_size_per_component[2] = dceip->underlay422_lb_size_per_component;
0203 break;
0204 default:
0205 surface_type[0] = bw_def_underlay444;
0206 surface_type[2] = bw_def_underlay444;
0207 data->bytes_per_pixel[0] = 4;
0208 data->bytes_per_pixel[2] = 4;
0209 data->lb_size_per_component[0] = dceip->lb_size_per_component444;
0210 data->lb_size_per_component[2] = dceip->lb_size_per_component444;
0211 break;
0212 }
0213 if (d0_underlay_enable) {
0214 switch (data->underlay_surface_type) {
0215 case bw_def_420:
0216 data->enable[0] = 1;
0217 data->enable[1] = 1;
0218 break;
0219 default:
0220 data->enable[0] = 1;
0221 data->enable[1] = 0;
0222 break;
0223 }
0224 }
0225 else {
0226 data->enable[0] = 0;
0227 data->enable[1] = 0;
0228 }
0229 if (d1_underlay_enable) {
0230 switch (data->underlay_surface_type) {
0231 case bw_def_420:
0232 data->enable[2] = 1;
0233 data->enable[3] = 1;
0234 break;
0235 default:
0236 data->enable[2] = 1;
0237 data->enable[3] = 0;
0238 break;
0239 }
0240 }
0241 else {
0242 data->enable[2] = 0;
0243 data->enable[3] = 0;
0244 }
0245 data->use_alpha[0] = 0;
0246 data->use_alpha[1] = 0;
0247 data->use_alpha[2] = 0;
0248 data->use_alpha[3] = 0;
0249 data->scatter_gather_enable_for_pipe[0] = vbios->scatter_gather_enable;
0250 data->scatter_gather_enable_for_pipe[1] = vbios->scatter_gather_enable;
0251 data->scatter_gather_enable_for_pipe[2] = vbios->scatter_gather_enable;
0252 data->scatter_gather_enable_for_pipe[3] = vbios->scatter_gather_enable;
0253
0254 data->interlace_mode[0] = data->interlace_mode[4];
0255 data->interlace_mode[1] = data->interlace_mode[4];
0256
0257 data->interlace_mode[2] = data->interlace_mode[5];
0258 data->interlace_mode[3] = data->interlace_mode[5];
0259
0260 data->h_total[0] = data->h_total[4];
0261 data->v_total[0] = data->v_total[4];
0262 data->h_total[1] = data->h_total[4];
0263 data->v_total[1] = data->v_total[4];
0264
0265 data->h_total[2] = data->h_total[5];
0266 data->v_total[2] = data->v_total[5];
0267 data->h_total[3] = data->h_total[5];
0268 data->v_total[3] = data->v_total[5];
0269
0270 data->pixel_rate[0] = data->pixel_rate[4];
0271 data->pixel_rate[1] = data->pixel_rate[4];
0272
0273 data->pixel_rate[2] = data->pixel_rate[5];
0274 data->pixel_rate[3] = data->pixel_rate[5];
0275 if ((data->underlay_tiling_mode == bw_def_array_linear_general || data->underlay_tiling_mode == bw_def_array_linear_aligned)) {
0276 tiling_mode[0] = bw_def_linear;
0277 tiling_mode[1] = bw_def_linear;
0278 tiling_mode[2] = bw_def_linear;
0279 tiling_mode[3] = bw_def_linear;
0280 }
0281 else {
0282 tiling_mode[0] = bw_def_landscape;
0283 tiling_mode[1] = bw_def_landscape;
0284 tiling_mode[2] = bw_def_landscape;
0285 tiling_mode[3] = bw_def_landscape;
0286 }
0287 data->lb_bpc[0] = data->underlay_lb_bpc;
0288 data->lb_bpc[1] = data->underlay_lb_bpc;
0289 data->lb_bpc[2] = data->underlay_lb_bpc;
0290 data->lb_bpc[3] = data->underlay_lb_bpc;
0291 data->compression_rate[0] = bw_int_to_fixed(1);
0292 data->compression_rate[1] = bw_int_to_fixed(1);
0293 data->compression_rate[2] = bw_int_to_fixed(1);
0294 data->compression_rate[3] = bw_int_to_fixed(1);
0295 data->access_one_channel_only[0] = 0;
0296 data->access_one_channel_only[1] = 0;
0297 data->access_one_channel_only[2] = 0;
0298 data->access_one_channel_only[3] = 0;
0299 data->cursor_width_pixels[0] = bw_int_to_fixed(0);
0300 data->cursor_width_pixels[1] = bw_int_to_fixed(0);
0301 data->cursor_width_pixels[2] = bw_int_to_fixed(0);
0302 data->cursor_width_pixels[3] = bw_int_to_fixed(0);
0303
0304 fbc_enabled = false;
0305 lpt_enabled = false;
0306 for (i = 4; i <= maximum_number_of_surfaces - 3; i++) {
0307 if (i < data->number_of_displays + 4) {
0308 if (i == 4 && data->d0_underlay_mode == bw_def_underlay_only) {
0309 data->enable[i] = 0;
0310 data->use_alpha[i] = 0;
0311 }
0312 else if (i == 4 && data->d0_underlay_mode == bw_def_blend) {
0313 data->enable[i] = 1;
0314 data->use_alpha[i] = 1;
0315 }
0316 else if (i == 4) {
0317 data->enable[i] = 1;
0318 data->use_alpha[i] = 0;
0319 }
0320 else if (i == 5 && data->d1_underlay_mode == bw_def_underlay_only) {
0321 data->enable[i] = 0;
0322 data->use_alpha[i] = 0;
0323 }
0324 else if (i == 5 && data->d1_underlay_mode == bw_def_blend) {
0325 data->enable[i] = 1;
0326 data->use_alpha[i] = 1;
0327 }
0328 else {
0329 data->enable[i] = 1;
0330 data->use_alpha[i] = 0;
0331 }
0332 }
0333 else {
0334 data->enable[i] = 0;
0335 data->use_alpha[i] = 0;
0336 }
0337 data->scatter_gather_enable_for_pipe[i] = vbios->scatter_gather_enable;
0338 surface_type[i] = bw_def_graphics;
0339 data->lb_size_per_component[i] = dceip->lb_size_per_component444;
0340 if (data->graphics_tiling_mode == bw_def_array_linear_general || data->graphics_tiling_mode == bw_def_array_linear_aligned) {
0341 tiling_mode[i] = bw_def_linear;
0342 }
0343 else {
0344 tiling_mode[i] = bw_def_tiled;
0345 }
0346 data->lb_bpc[i] = data->graphics_lb_bpc;
0347 if ((data->fbc_en[i] == 1 && (dceip->argb_compression_support || data->d0_underlay_mode != bw_def_blended))) {
0348 data->compression_rate[i] = bw_int_to_fixed(vbios->average_compression_rate);
0349 data->access_one_channel_only[i] = data->lpt_en[i];
0350 }
0351 else {
0352 data->compression_rate[i] = bw_int_to_fixed(1);
0353 data->access_one_channel_only[i] = 0;
0354 }
0355 if (data->fbc_en[i] == 1) {
0356 fbc_enabled = true;
0357 if (data->lpt_en[i] == 1) {
0358 lpt_enabled = true;
0359 }
0360 }
0361 data->cursor_width_pixels[i] = bw_int_to_fixed(vbios->cursor_width);
0362 }
0363
0364 data->scatter_gather_enable_for_pipe[maximum_number_of_surfaces - 2] = 0;
0365 data->scatter_gather_enable_for_pipe[maximum_number_of_surfaces - 1] = 0;
0366 if (data->d1_display_write_back_dwb_enable == 1) {
0367 data->enable[maximum_number_of_surfaces - 2] = 1;
0368 data->enable[maximum_number_of_surfaces - 1] = 1;
0369 }
0370 else {
0371 data->enable[maximum_number_of_surfaces - 2] = 0;
0372 data->enable[maximum_number_of_surfaces - 1] = 0;
0373 }
0374 surface_type[maximum_number_of_surfaces - 2] = bw_def_display_write_back420_luma;
0375 surface_type[maximum_number_of_surfaces - 1] = bw_def_display_write_back420_chroma;
0376 data->lb_size_per_component[maximum_number_of_surfaces - 2] = dceip->underlay420_luma_lb_size_per_component;
0377 data->lb_size_per_component[maximum_number_of_surfaces - 1] = dceip->underlay420_chroma_lb_size_per_component;
0378 data->bytes_per_pixel[maximum_number_of_surfaces - 2] = 1;
0379 data->bytes_per_pixel[maximum_number_of_surfaces - 1] = 2;
0380 data->interlace_mode[maximum_number_of_surfaces - 2] = data->interlace_mode[5];
0381 data->interlace_mode[maximum_number_of_surfaces - 1] = data->interlace_mode[5];
0382 data->h_taps[maximum_number_of_surfaces - 2] = bw_int_to_fixed(1);
0383 data->h_taps[maximum_number_of_surfaces - 1] = bw_int_to_fixed(1);
0384 data->v_taps[maximum_number_of_surfaces - 2] = bw_int_to_fixed(1);
0385 data->v_taps[maximum_number_of_surfaces - 1] = bw_int_to_fixed(1);
0386 data->rotation_angle[maximum_number_of_surfaces - 2] = bw_int_to_fixed(0);
0387 data->rotation_angle[maximum_number_of_surfaces - 1] = bw_int_to_fixed(0);
0388 tiling_mode[maximum_number_of_surfaces - 2] = bw_def_linear;
0389 tiling_mode[maximum_number_of_surfaces - 1] = bw_def_linear;
0390 data->lb_bpc[maximum_number_of_surfaces - 2] = 8;
0391 data->lb_bpc[maximum_number_of_surfaces - 1] = 8;
0392 data->compression_rate[maximum_number_of_surfaces - 2] = bw_int_to_fixed(1);
0393 data->compression_rate[maximum_number_of_surfaces - 1] = bw_int_to_fixed(1);
0394 data->access_one_channel_only[maximum_number_of_surfaces - 2] = 0;
0395 data->access_one_channel_only[maximum_number_of_surfaces - 1] = 0;
0396
0397 data->h_total[maximum_number_of_surfaces - 2] = data->h_total[5];
0398 data->h_total[maximum_number_of_surfaces - 1] = data->h_total[5];
0399 data->v_total[maximum_number_of_surfaces - 2] = data->v_total[5];
0400 data->v_total[maximum_number_of_surfaces - 1] = data->v_total[5];
0401 data->pixel_rate[maximum_number_of_surfaces - 2] = data->pixel_rate[5];
0402 data->pixel_rate[maximum_number_of_surfaces - 1] = data->pixel_rate[5];
0403 data->src_width[maximum_number_of_surfaces - 2] = data->src_width[5];
0404 data->src_width[maximum_number_of_surfaces - 1] = data->src_width[5];
0405 data->src_height[maximum_number_of_surfaces - 2] = data->src_height[5];
0406 data->src_height[maximum_number_of_surfaces - 1] = data->src_height[5];
0407 data->pitch_in_pixels[maximum_number_of_surfaces - 2] = data->src_width[5];
0408 data->pitch_in_pixels[maximum_number_of_surfaces - 1] = data->src_width[5];
0409 data->h_scale_ratio[maximum_number_of_surfaces - 2] = bw_int_to_fixed(1);
0410 data->h_scale_ratio[maximum_number_of_surfaces - 1] = bw_int_to_fixed(1);
0411 data->v_scale_ratio[maximum_number_of_surfaces - 2] = bw_int_to_fixed(1);
0412 data->v_scale_ratio[maximum_number_of_surfaces - 1] = bw_int_to_fixed(1);
0413 data->stereo_mode[maximum_number_of_surfaces - 2] = bw_def_mono;
0414 data->stereo_mode[maximum_number_of_surfaces - 1] = bw_def_mono;
0415 data->cursor_width_pixels[maximum_number_of_surfaces - 2] = bw_int_to_fixed(0);
0416 data->cursor_width_pixels[maximum_number_of_surfaces - 1] = bw_int_to_fixed(0);
0417 data->use_alpha[maximum_number_of_surfaces - 2] = 0;
0418 data->use_alpha[maximum_number_of_surfaces - 1] = 0;
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428
0429
0430
0431
0432
0433 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0434 if (data->enable[i]) {
0435 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) {
0436 data->h_taps[i] = bw_int_to_fixed(1);
0437 data->v_taps[i] = bw_int_to_fixed(1);
0438 }
0439 if (surface_type[i] == bw_def_display_write_back420_chroma || surface_type[i] == bw_def_underlay420_chroma) {
0440 data->pitch_in_pixels_after_surface_type[i] = bw_div(data->pitch_in_pixels[i], bw_int_to_fixed(2));
0441 data->src_width_after_surface_type = bw_div(data->src_width[i], bw_int_to_fixed(2));
0442 data->src_height_after_surface_type = bw_div(data->src_height[i], bw_int_to_fixed(2));
0443 data->hsr_after_surface_type = bw_div(data->h_scale_ratio[i], bw_int_to_fixed(2));
0444 data->vsr_after_surface_type = bw_div(data->v_scale_ratio[i], bw_int_to_fixed(2));
0445 }
0446 else {
0447 data->pitch_in_pixels_after_surface_type[i] = data->pitch_in_pixels[i];
0448 data->src_width_after_surface_type = data->src_width[i];
0449 data->src_height_after_surface_type = data->src_height[i];
0450 data->hsr_after_surface_type = data->h_scale_ratio[i];
0451 data->vsr_after_surface_type = data->v_scale_ratio[i];
0452 }
0453 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) {
0454 data->src_width_after_rotation = data->src_height_after_surface_type;
0455 data->src_height_after_rotation = data->src_width_after_surface_type;
0456 data->hsr_after_rotation = data->vsr_after_surface_type;
0457 data->vsr_after_rotation = data->hsr_after_surface_type;
0458 }
0459 else {
0460 data->src_width_after_rotation = data->src_width_after_surface_type;
0461 data->src_height_after_rotation = data->src_height_after_surface_type;
0462 data->hsr_after_rotation = data->hsr_after_surface_type;
0463 data->vsr_after_rotation = data->vsr_after_surface_type;
0464 }
0465 switch (data->stereo_mode[i]) {
0466 case bw_def_top_bottom:
0467 data->source_width_pixels[i] = data->src_width_after_rotation;
0468 data->source_height_pixels = bw_mul(bw_int_to_fixed(2), data->src_height_after_rotation);
0469 data->hsr_after_stereo = data->hsr_after_rotation;
0470 data->vsr_after_stereo = bw_mul(bw_int_to_fixed(1), data->vsr_after_rotation);
0471 break;
0472 case bw_def_side_by_side:
0473 data->source_width_pixels[i] = bw_mul(bw_int_to_fixed(2), data->src_width_after_rotation);
0474 data->source_height_pixels = data->src_height_after_rotation;
0475 data->hsr_after_stereo = bw_mul(bw_int_to_fixed(1), data->hsr_after_rotation);
0476 data->vsr_after_stereo = data->vsr_after_rotation;
0477 break;
0478 default:
0479 data->source_width_pixels[i] = data->src_width_after_rotation;
0480 data->source_height_pixels = data->src_height_after_rotation;
0481 data->hsr_after_stereo = data->hsr_after_rotation;
0482 data->vsr_after_stereo = data->vsr_after_rotation;
0483 break;
0484 }
0485 data->hsr[i] = data->hsr_after_stereo;
0486 if (data->interlace_mode[i]) {
0487 data->vsr[i] = bw_mul(data->vsr_after_stereo, bw_int_to_fixed(2));
0488 }
0489 else {
0490 data->vsr[i] = data->vsr_after_stereo;
0491 }
0492 if (data->panning_and_bezel_adjustment != bw_def_none) {
0493 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));
0494 }
0495 else {
0496 data->source_width_rounded_up_to_chunks[i] = bw_ceil2(data->source_width_pixels[i], bw_int_to_fixed(128));
0497 }
0498 data->source_height_rounded_up_to_chunks[i] = data->source_height_pixels;
0499 }
0500 }
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512 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)) {
0513 pipe_check = bw_def_ok;
0514 }
0515 else {
0516 pipe_check = bw_def_notok;
0517 }
0518 hsr_check = bw_def_ok;
0519 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0520 if (data->enable[i]) {
0521 if (bw_neq(data->hsr[i], bw_int_to_fixed(1))) {
0522 if (bw_mtn(data->hsr[i], bw_int_to_fixed(4))) {
0523 hsr_check = bw_def_hsr_mtn_4;
0524 }
0525 else {
0526 if (bw_mtn(data->hsr[i], data->h_taps[i])) {
0527 hsr_check = bw_def_hsr_mtn_h_taps;
0528 }
0529 else {
0530 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)))) {
0531 hsr_check = bw_def_ceiling__h_taps_div_4___meq_hsr;
0532 }
0533 }
0534 }
0535 }
0536 }
0537 }
0538 vsr_check = bw_def_ok;
0539 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0540 if (data->enable[i]) {
0541 if (bw_neq(data->vsr[i], bw_int_to_fixed(1))) {
0542 if (bw_mtn(data->vsr[i], bw_int_to_fixed(4))) {
0543 vsr_check = bw_def_vsr_mtn_4;
0544 }
0545 else {
0546 if (bw_mtn(data->vsr[i], data->v_taps[i])) {
0547 vsr_check = bw_def_vsr_mtn_v_taps;
0548 }
0549 }
0550 }
0551 }
0552 }
0553 lb_size_check = bw_def_ok;
0554 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0555 if (data->enable[i]) {
0556 if ((dceip->pre_downscaler_enabled && bw_mtn(data->hsr[i], bw_int_to_fixed(1)))) {
0557 data->source_width_in_lb = bw_div(data->source_width_pixels[i], data->hsr[i]);
0558 }
0559 else {
0560 data->source_width_in_lb = data->source_width_pixels[i];
0561 }
0562 switch (data->lb_bpc[i]) {
0563 case 8:
0564 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));
0565 break;
0566 case 10:
0567 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));
0568 break;
0569 default:
0570 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));
0571 break;
0572 }
0573 data->lb_partitions[i] = bw_floor2(bw_div(data->lb_size_per_component[i], data->lb_line_pitch), bw_int_to_fixed(1));
0574
0575 if ((surface_type[i] != bw_def_graphics || dceip->graphics_lb_nodownscaling_multi_line_prefetching == 1)) {
0576 data->lb_partitions_max[i] = bw_int_to_fixed(10);
0577 }
0578 else {
0579 data->lb_partitions_max[i] = bw_int_to_fixed(7);
0580 }
0581 data->lb_partitions[i] = bw_min2(data->lb_partitions_max[i], data->lb_partitions[i]);
0582 if (bw_mtn(bw_add(data->v_taps[i], bw_int_to_fixed(1)), data->lb_partitions[i])) {
0583 lb_size_check = bw_def_notok;
0584 }
0585 }
0586 }
0587 fbc_check = bw_def_ok;
0588 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0589 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)) {
0590 fbc_check = bw_def_invalid_rotation_or_bpp_or_stereo;
0591 }
0592 }
0593 rotation_check = bw_def_ok;
0594 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0595 if (data->enable[i]) {
0596 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)) {
0597 rotation_check = bw_def_invalid_linear_or_stereo_mode;
0598 }
0599 }
0600 }
0601 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) {
0602 mode_check = bw_def_ok;
0603 }
0604 else {
0605 mode_check = bw_def_notok;
0606 }
0607
0608 data->number_of_dram_wrchannels = vbios->number_of_dram_channels;
0609 data->number_of_dram_channels = vbios->number_of_dram_channels;
0610
0611
0612
0613
0614
0615 if ((fbc_enabled == 1 && lpt_enabled == 1)) {
0616 if (vbios->memory_type == bw_def_hbm)
0617 data->dram_efficiency = bw_frc_to_fixed(5, 10);
0618 else
0619 data->dram_efficiency = bw_int_to_fixed(1);
0620
0621
0622 if (dceip->low_power_tiling_mode == 0) {
0623 data->number_of_dram_channels = 1;
0624 }
0625 else if (dceip->low_power_tiling_mode == 1) {
0626 data->number_of_dram_channels = 2;
0627 }
0628 else if (dceip->low_power_tiling_mode == 2) {
0629 data->number_of_dram_channels = 4;
0630 }
0631 else {
0632 data->number_of_dram_channels = 1;
0633 }
0634 }
0635 else {
0636 if (vbios->memory_type == bw_def_hbm)
0637 data->dram_efficiency = bw_frc_to_fixed(5, 10);
0638 else
0639 data->dram_efficiency = bw_frc_to_fixed(8, 10);
0640 }
0641
0642
0643
0644
0645
0646 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0647 if (data->enable[i]) {
0648 if ((bw_equ(data->rotation_angle[i], bw_int_to_fixed(90)) || bw_equ(data->rotation_angle[i], bw_int_to_fixed(270)))) {
0649 if ((i < 4)) {
0650
0651 data->orthogonal_rotation[i] = 1;
0652 }
0653 else {
0654
0655 if (data->graphics_micro_tile_mode == bw_def_rotated_micro_tiling) {
0656 data->orthogonal_rotation[i] = 0;
0657 }
0658 else {
0659 data->orthogonal_rotation[i] = 1;
0660 }
0661 }
0662 }
0663 else {
0664 if ((i < 4)) {
0665
0666 if (data->underlay_micro_tile_mode == bw_def_display_micro_tiling) {
0667 data->orthogonal_rotation[i] = 0;
0668 }
0669 else {
0670 data->orthogonal_rotation[i] = 1;
0671 }
0672 }
0673 else {
0674
0675 if (data->graphics_micro_tile_mode == bw_def_display_micro_tiling) {
0676 data->orthogonal_rotation[i] = 0;
0677 }
0678 else {
0679 data->orthogonal_rotation[i] = 1;
0680 }
0681 }
0682 }
0683 if (bw_equ(data->rotation_angle[i], bw_int_to_fixed(90)) || bw_equ(data->rotation_angle[i], bw_int_to_fixed(270))) {
0684 data->underlay_maximum_source_efficient_for_tiling = dceip->underlay_maximum_height_efficient_for_tiling;
0685 }
0686 else {
0687 data->underlay_maximum_source_efficient_for_tiling = dceip->underlay_maximum_width_efficient_for_tiling;
0688 }
0689 if (surface_type[i] == bw_def_display_write_back420_luma || surface_type[i] == bw_def_display_write_back420_chroma) {
0690 data->bytes_per_request[i] = bw_int_to_fixed(64);
0691 data->useful_bytes_per_request[i] = bw_int_to_fixed(64);
0692 data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(1);
0693 data->latency_hiding_lines[i] = bw_int_to_fixed(1);
0694 }
0695 else if (tiling_mode[i] == bw_def_linear) {
0696 data->bytes_per_request[i] = bw_int_to_fixed(64);
0697 data->useful_bytes_per_request[i] = bw_int_to_fixed(64);
0698 data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
0699 data->latency_hiding_lines[i] = bw_int_to_fixed(2);
0700 }
0701 else {
0702 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))))) {
0703 switch (data->bytes_per_pixel[i]) {
0704 case 8:
0705 data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
0706 data->latency_hiding_lines[i] = bw_int_to_fixed(2);
0707 if (data->orthogonal_rotation[i]) {
0708 data->bytes_per_request[i] = bw_int_to_fixed(32);
0709 data->useful_bytes_per_request[i] = bw_int_to_fixed(32);
0710 }
0711 else {
0712 data->bytes_per_request[i] = bw_int_to_fixed(64);
0713 data->useful_bytes_per_request[i] = bw_int_to_fixed(64);
0714 }
0715 break;
0716 case 4:
0717 if (data->orthogonal_rotation[i]) {
0718 data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
0719 data->latency_hiding_lines[i] = bw_int_to_fixed(2);
0720 data->bytes_per_request[i] = bw_int_to_fixed(32);
0721 data->useful_bytes_per_request[i] = bw_int_to_fixed(16);
0722 }
0723 else {
0724 data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
0725 data->latency_hiding_lines[i] = bw_int_to_fixed(2);
0726 data->bytes_per_request[i] = bw_int_to_fixed(64);
0727 data->useful_bytes_per_request[i] = bw_int_to_fixed(64);
0728 }
0729 break;
0730 case 2:
0731 data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
0732 data->latency_hiding_lines[i] = bw_int_to_fixed(2);
0733 data->bytes_per_request[i] = bw_int_to_fixed(32);
0734 data->useful_bytes_per_request[i] = bw_int_to_fixed(32);
0735 break;
0736 default:
0737 data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
0738 data->latency_hiding_lines[i] = bw_int_to_fixed(2);
0739 data->bytes_per_request[i] = bw_int_to_fixed(32);
0740 data->useful_bytes_per_request[i] = bw_int_to_fixed(16);
0741 break;
0742 }
0743 }
0744 else {
0745 data->bytes_per_request[i] = bw_int_to_fixed(64);
0746 data->useful_bytes_per_request[i] = bw_int_to_fixed(64);
0747 if (data->orthogonal_rotation[i]) {
0748 data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(8);
0749 data->latency_hiding_lines[i] = bw_int_to_fixed(4);
0750 }
0751 else {
0752 switch (data->bytes_per_pixel[i]) {
0753 case 4:
0754 data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(2);
0755 data->latency_hiding_lines[i] = bw_int_to_fixed(2);
0756 break;
0757 case 2:
0758 data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(4);
0759 data->latency_hiding_lines[i] = bw_int_to_fixed(4);
0760 break;
0761 default:
0762 data->lines_interleaved_in_mem_access[i] = bw_int_to_fixed(8);
0763 data->latency_hiding_lines[i] = bw_int_to_fixed(4);
0764 break;
0765 }
0766 }
0767 }
0768 }
0769 }
0770 }
0771
0772
0773
0774
0775
0776
0777
0778
0779
0780
0781
0782
0783
0784
0785
0786
0787
0788
0789
0790
0791
0792
0793
0794
0795
0796
0797
0798
0799
0800
0801
0802
0803 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0804 if (data->enable[i]) {
0805 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));
0806 if (data->panning_and_bezel_adjustment == bw_def_any_lines) {
0807 data->v_filter_init[i] = bw_add(data->v_filter_init[i], bw_int_to_fixed(1));
0808 }
0809 if (data->stereo_mode[i] == bw_def_top_bottom) {
0810 data->v_filter_init[i] = bw_min2(data->v_filter_init[i], bw_int_to_fixed(4));
0811 }
0812 if (data->stereo_mode[i] == bw_def_top_bottom) {
0813 data->num_lines_at_frame_start = bw_int_to_fixed(1);
0814 }
0815 else {
0816 data->num_lines_at_frame_start = bw_int_to_fixed(3);
0817 }
0818 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) {
0819 data->line_buffer_prefetch[i] = 0;
0820 }
0821 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))))))) {
0822 data->line_buffer_prefetch[i] = 1;
0823 }
0824 else {
0825 data->line_buffer_prefetch[i] = 0;
0826 }
0827 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);
0828 if (data->line_buffer_prefetch[i] == 1) {
0829 data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_max2(bw_int_to_fixed(1), data->vsr[i]);
0830 }
0831 else if (bw_leq(data->vsr[i], bw_int_to_fixed(1))) {
0832 data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_int_to_fixed(1);
0833 } else if (bw_leq(data->vsr[i],
0834 bw_frc_to_fixed(4, 3))) {
0835 data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_div(bw_int_to_fixed(4), bw_int_to_fixed(3));
0836 } else if (bw_leq(data->vsr[i],
0837 bw_frc_to_fixed(6, 4))) {
0838 data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_div(bw_int_to_fixed(6), bw_int_to_fixed(4));
0839 }
0840 else if (bw_leq(data->vsr[i], bw_int_to_fixed(2))) {
0841 data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_int_to_fixed(2);
0842 }
0843 else if (bw_leq(data->vsr[i], bw_int_to_fixed(3))) {
0844 data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_int_to_fixed(3);
0845 }
0846 else {
0847 data->lb_lines_in_per_line_out_in_middle_of_frame[i] = bw_int_to_fixed(4);
0848 }
0849 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))) {
0850 data->horizontal_blank_and_chunk_granularity_factor[i] = bw_int_to_fixed(1);
0851 }
0852 else {
0853 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))));
0854 }
0855 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]);
0856 data->display_bandwidth[i] = bw_mul(data->request_bandwidth[i], data->bytes_per_request[i]);
0857 }
0858 }
0859
0860
0861
0862
0863
0864
0865
0866
0867
0868
0869
0870
0871
0872
0873
0874 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0875 if (data->enable[i]) {
0876 if ((dceip->dmif_pipe_en_fbc_chunk_tracker + 3 == i && fbc_enabled == 0 && tiling_mode[i] != bw_def_linear)) {
0877 data->max_chunks_non_fbc_mode[i] = 128 - dmif_chunk_buff_margin;
0878 }
0879 else {
0880 data->max_chunks_non_fbc_mode[i] = 16 - dmif_chunk_buff_margin;
0881 }
0882 }
0883 if (data->fbc_en[i] == 1) {
0884 max_chunks_fbc_mode = 128 - dmif_chunk_buff_margin;
0885 }
0886 }
0887 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0888 if (data->enable[i]) {
0889 switch (surface_type[i]) {
0890 case bw_def_display_write_back420_luma:
0891 data->data_buffer_size[i] = bw_int_to_fixed(dceip->display_write_back420_luma_mcifwr_buffer_size);
0892 break;
0893 case bw_def_display_write_back420_chroma:
0894 data->data_buffer_size[i] = bw_int_to_fixed(dceip->display_write_back420_chroma_mcifwr_buffer_size);
0895 break;
0896 case bw_def_underlay420_luma:
0897 data->data_buffer_size[i] = bw_int_to_fixed(dceip->underlay_luma_dmif_size);
0898 break;
0899 case bw_def_underlay420_chroma:
0900 data->data_buffer_size[i] = bw_div(bw_int_to_fixed(dceip->underlay_chroma_dmif_size), bw_int_to_fixed(2));
0901 break;
0902 case bw_def_underlay422:case bw_def_underlay444:
0903 if (data->orthogonal_rotation[i] == 0) {
0904 data->data_buffer_size[i] = bw_int_to_fixed(dceip->underlay_luma_dmif_size);
0905 }
0906 else {
0907 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));
0908 }
0909 break;
0910 default:
0911 if (data->fbc_en[i] == 1) {
0912
0913 if (data->number_of_displays == 1) {
0914 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)));
0915 }
0916 else {
0917 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));
0918 }
0919 }
0920 else {
0921
0922 if (data->number_of_displays == 1) {
0923 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)));
0924 }
0925 else {
0926 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));
0927 }
0928 }
0929 break;
0930 }
0931 if (surface_type[i] == bw_def_display_write_back420_luma || surface_type[i] == bw_def_display_write_back420_chroma) {
0932 data->memory_chunk_size_in_bytes[i] = bw_int_to_fixed(1024);
0933 data->pipe_chunk_size_in_bytes[i] = bw_int_to_fixed(1024);
0934 }
0935 else {
0936 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]));
0937 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]));
0938 }
0939 }
0940 }
0941 data->min_dmif_size_in_time = bw_int_to_fixed(9999);
0942 data->min_mcifwr_size_in_time = bw_int_to_fixed(9999);
0943 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0944 if (data->enable[i]) {
0945 if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
0946 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)) {
0947 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]);
0948 }
0949 }
0950 else {
0951 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)) {
0952 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]);
0953 }
0954 }
0955 }
0956 }
0957 data->total_requests_for_dmif_size = bw_int_to_fixed(0);
0958 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0959 if (data->enable[i] && surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
0960 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]));
0961 }
0962 }
0963 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0964 if (data->enable[i]) {
0965 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))) {
0966 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]));
0967 }
0968 else {
0969 data->adjusted_data_buffer_size[i] = data->data_buffer_size[i];
0970 }
0971 }
0972 }
0973 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
0974 if (data->enable[i]) {
0975 if (data->number_of_displays == 1 && data->number_of_underlay_surfaces == 0) {
0976
0977 data->outstanding_chunk_request_limit[i] = bw_int_to_fixed(127);
0978 }
0979 else {
0980 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));
0981
0982 if (i >= 4) {
0983 data->outstanding_chunk_request_limit[i] = bw_max2(bw_int_to_fixed(127), data->outstanding_chunk_request_limit[i]);
0984 }
0985 }
0986 }
0987 }
0988
0989
0990
0991
0992
0993
0994
0995
0996
0997 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)))) {
0998 data->peak_pte_request_to_eviction_ratio_limiting = dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display;
0999 }
1000 else {
1001 data->peak_pte_request_to_eviction_ratio_limiting = dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation;
1002 }
1003 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1004 if (data->enable[i] && data->scatter_gather_enable_for_pipe[i] == 1) {
1005 if (tiling_mode[i] == bw_def_linear) {
1006 data->useful_pte_per_pte_request = bw_int_to_fixed(8);
1007 data->scatter_gather_page_width[i] = bw_div(bw_int_to_fixed(4096), bw_int_to_fixed(data->bytes_per_pixel[i]));
1008 data->scatter_gather_page_height[i] = bw_int_to_fixed(1);
1009 data->scatter_gather_pte_request_rows = bw_int_to_fixed(1);
1010 data->scatter_gather_row_height = bw_int_to_fixed(dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode);
1011 }
1012 else if (bw_equ(data->rotation_angle[i], bw_int_to_fixed(0)) || bw_equ(data->rotation_angle[i], bw_int_to_fixed(180))) {
1013 data->useful_pte_per_pte_request = bw_int_to_fixed(8);
1014 switch (data->bytes_per_pixel[i]) {
1015 case 4:
1016 data->scatter_gather_page_width[i] = bw_int_to_fixed(32);
1017 data->scatter_gather_page_height[i] = bw_int_to_fixed(32);
1018 break;
1019 case 2:
1020 data->scatter_gather_page_width[i] = bw_int_to_fixed(64);
1021 data->scatter_gather_page_height[i] = bw_int_to_fixed(32);
1022 break;
1023 default:
1024 data->scatter_gather_page_width[i] = bw_int_to_fixed(64);
1025 data->scatter_gather_page_height[i] = bw_int_to_fixed(64);
1026 break;
1027 }
1028 data->scatter_gather_pte_request_rows = bw_int_to_fixed(dceip->scatter_gather_pte_request_rows_in_tiling_mode);
1029 data->scatter_gather_row_height = data->scatter_gather_page_height[i];
1030 }
1031 else {
1032 data->useful_pte_per_pte_request = bw_int_to_fixed(1);
1033 switch (data->bytes_per_pixel[i]) {
1034 case 4:
1035 data->scatter_gather_page_width[i] = bw_int_to_fixed(32);
1036 data->scatter_gather_page_height[i] = bw_int_to_fixed(32);
1037 break;
1038 case 2:
1039 data->scatter_gather_page_width[i] = bw_int_to_fixed(32);
1040 data->scatter_gather_page_height[i] = bw_int_to_fixed(64);
1041 break;
1042 default:
1043 data->scatter_gather_page_width[i] = bw_int_to_fixed(64);
1044 data->scatter_gather_page_height[i] = bw_int_to_fixed(64);
1045 break;
1046 }
1047 data->scatter_gather_pte_request_rows = bw_int_to_fixed(dceip->scatter_gather_pte_request_rows_in_tiling_mode);
1048 data->scatter_gather_row_height = data->scatter_gather_page_height[i];
1049 }
1050 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);
1051 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]);
1052 data->scatter_gather_pte_requests_in_vblank = bw_mul(data->scatter_gather_pte_request_rows, data->scatter_gather_pte_requests_in_row[i]);
1053 if (bw_equ(data->peak_pte_request_to_eviction_ratio_limiting, bw_int_to_fixed(0))) {
1054 data->scatter_gather_pte_request_limit[i] = data->scatter_gather_pte_requests_in_vblank;
1055 }
1056 else {
1057 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))));
1058 }
1059 }
1060 }
1061
1062
1063
1064 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));
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085 data->cursor_total_data = bw_int_to_fixed(0);
1086 data->cursor_total_request_groups = bw_int_to_fixed(0);
1087 data->scatter_gather_total_pte_requests = bw_int_to_fixed(0);
1088 data->scatter_gather_total_pte_request_groups = bw_int_to_fixed(0);
1089 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1090 if (data->enable[i]) {
1091 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)));
1092 if (dceip->large_cursor == 1) {
1093 data->cursor_total_request_groups = bw_add(data->cursor_total_request_groups, bw_int_to_fixed((dceip->cursor_max_outstanding_group_num + 1)));
1094 }
1095 else {
1096 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)));
1097 }
1098 if (data->scatter_gather_enable_for_pipe[i]) {
1099 data->scatter_gather_total_pte_requests = bw_add(data->scatter_gather_total_pte_requests, data->scatter_gather_pte_request_limit[i]);
1100 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)));
1101 }
1102 }
1103 }
1104 data->tile_width_in_pixels = bw_int_to_fixed(8);
1105 data->dmif_total_number_of_data_request_page_close_open = bw_int_to_fixed(0);
1106 data->mcifwr_total_number_of_data_request_page_close_open = bw_int_to_fixed(0);
1107 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1108 if (data->enable[i]) {
1109 if (data->scatter_gather_enable_for_pipe[i] == 1 && tiling_mode[i] != bw_def_linear) {
1110 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])));
1111 }
1112 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))) {
1113 data->bytes_per_page_close_open = dceip->linear_mode_line_request_alternation_slice;
1114 }
1115 else {
1116 data->bytes_per_page_close_open = data->memory_chunk_size_in_bytes[i];
1117 }
1118 if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
1119 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));
1120 }
1121 else {
1122 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));
1123 }
1124 }
1125 }
1126 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));
1127 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));
1128 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1129 if (data->enable[i]) {
1130 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]);
1131 }
1132 }
1133 data->total_requests_for_adjusted_dmif_size = bw_int_to_fixed(0);
1134 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1135 if (data->enable[i]) {
1136 if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
1137 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]));
1138 }
1139 }
1140 }
1141 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));
1142 data->total_dmifmc_urgent_latency = bw_mul(vbios->dmifmc_urgent_latency, data->total_dmifmc_urgent_trips);
1143 data->total_display_reads_required_data = bw_int_to_fixed(0);
1144 data->total_display_reads_required_dram_access_data = bw_int_to_fixed(0);
1145 data->total_display_writes_required_data = bw_int_to_fixed(0);
1146 data->total_display_writes_required_dram_access_data = bw_int_to_fixed(0);
1147 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1148 if (data->enable[i]) {
1149 if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
1150 data->display_reads_required_data = data->adjusted_data_buffer_size_in_memory[i];
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161 if (vbios->memory_type == bw_def_hbm) {
1162 data->display_reads_required_dram_access_data = data->adjusted_data_buffer_size_in_memory[i];
1163 }
1164 else {
1165 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)));
1166 }
1167 data->total_display_reads_required_data = bw_add(data->total_display_reads_required_data, data->display_reads_required_data);
1168 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);
1169 }
1170 else {
1171 data->total_display_writes_required_data = bw_add(data->total_display_writes_required_data, data->adjusted_data_buffer_size_in_memory[i]);
1172 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))));
1173 }
1174 }
1175 }
1176 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)));
1177 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)));
1178 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1179 if (data->enable[i]) {
1180 if (bw_mtn(data->v_filter_init[i], bw_int_to_fixed(4))) {
1181 data->src_pixels_for_first_output_pixel[i] = bw_mul(bw_int_to_fixed(4), data->source_width_rounded_up_to_chunks[i]);
1182 }
1183 else {
1184 if (bw_mtn(data->v_filter_init[i], bw_int_to_fixed(2))) {
1185 data->src_pixels_for_first_output_pixel[i] = bw_int_to_fixed(512);
1186 }
1187 else {
1188 data->src_pixels_for_first_output_pixel[i] = bw_int_to_fixed(0);
1189 }
1190 }
1191 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]);
1192 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])));
1193 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]);
1194 data->active_time[i] = bw_div(bw_div(data->source_width_rounded_up_to_chunks[i], data->hsr[i]), data->pixel_rate[i]);
1195 }
1196 }
1197 for (i = 0; i <= 2; i++) {
1198 for (j = 0; j <= 7; j++) {
1199 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)))));
1200 if (data->d1_display_write_back_dwb_enable == 1) {
1201 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))));
1202 }
1203 }
1204 }
1205 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1206 for (j = 0; j <= 2; j++) {
1207 for (k = 0; k <= 7; k++) {
1208 if (data->enable[i]) {
1209 if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
1210
1211
1212 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)))));
1213 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]));
1214
1215
1216
1217
1218
1219 if (surface_type[i] == bw_def_graphics) {
1220 switch (data->lb_bpc[i]) {
1221 case 6:
1222 data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency6_bit_per_component;
1223 break;
1224 case 8:
1225 data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency8_bit_per_component;
1226 break;
1227 case 10:
1228 data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency10_bit_per_component;
1229 break;
1230 default:
1231 data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency12_bit_per_component;
1232 break;
1233 }
1234 if (data->use_alpha[i] == 1) {
1235 data->v_scaler_efficiency = bw_min2(data->v_scaler_efficiency, dceip->alpha_vscaler_efficiency);
1236 }
1237 }
1238 else {
1239 switch (data->lb_bpc[i]) {
1240 case 6:
1241 data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency6_bit_per_component;
1242 break;
1243 case 8:
1244 data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency8_bit_per_component;
1245 break;
1246 case 10:
1247 data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency10_bit_per_component;
1248 break;
1249 default:
1250 data->v_scaler_efficiency = bw_int_to_fixed(3);
1251 break;
1252 }
1253 }
1254 if (dceip->pre_downscaler_enabled && bw_mtn(data->hsr[i], bw_int_to_fixed(1))) {
1255 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]));
1256 }
1257 else {
1258 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))));
1259 }
1260 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]))))));
1261 }
1262 else {
1263 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]));
1264
1265
1266
1267
1268
1269 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])))));
1270 }
1271 }
1272 }
1273 }
1274 }
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288 number_of_displays_enabled = 0;
1289 number_of_displays_enabled_with_margin = 0;
1290 for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
1291 if (data->enable[k]) {
1292 number_of_displays_enabled = number_of_displays_enabled + 1;
1293 }
1294 data->display_pstate_change_enable[k] = 0;
1295 }
1296 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1297 if (data->enable[i]) {
1298 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)))) {
1299 if (bw_ltn(data->vsr[i], bw_int_to_fixed(2))) {
1300 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]);
1301 }
1302 else {
1303 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]);
1304 }
1305 }
1306 else {
1307 data->cursor_latency_hiding[i] = bw_int_to_fixed(9999);
1308 }
1309 }
1310 }
1311 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1312 if (data->enable[i]) {
1313 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) {
1314 if (number_of_displays_enabled > 2)
1315 data->minimum_latency_hiding[i] = bw_sub(bw_div(bw_mul((bw_div((bw_add(bw_sub(data->lb_partitions[i], bw_int_to_fixed(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);
1316 else
1317 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);
1318 }
1319 else {
1320 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);
1321 }
1322 data->minimum_latency_hiding_with_cursor[i] = bw_min2(data->minimum_latency_hiding[i], data->cursor_latency_hiding[i]);
1323 }
1324 }
1325 for (i = 0; i <= 2; i++) {
1326 for (j = 0; j <= 7; j++) {
1327 data->blackout_duration_margin[i][j] = bw_int_to_fixed(9999);
1328 data->dispclk_required_for_blackout_duration[i][j] = bw_int_to_fixed(0);
1329 data->dispclk_required_for_blackout_recovery[i][j] = bw_int_to_fixed(0);
1330 for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
1331 if (data->enable[k] && bw_mtn(vbios->blackout_duration, bw_int_to_fixed(0))) {
1332 if (surface_type[k] != bw_def_display_write_back420_luma && surface_type[k] != bw_def_display_write_back420_chroma) {
1333 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]));
1334 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]))));
1335 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]))) {
1336 data->dispclk_required_for_blackout_recovery[i][j] = bw_int_to_fixed(9999);
1337 }
1338 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])))))) {
1339 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]));
1340 }
1341 }
1342 else {
1343 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]));
1344 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]))));
1345 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]))) {
1346 data->dispclk_required_for_blackout_recovery[i][j] = bw_int_to_fixed(9999);
1347 }
1348 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])))))) {
1349 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]));
1350 }
1351 }
1352 }
1353 }
1354 }
1355 }
1356 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)) {
1357 data->cpup_state_change_enable = bw_def_yes;
1358 if (bw_ltn(data->dispclk_required_for_blackout_recovery[high][s_high], vbios->high_voltage_max_dispclk)) {
1359 data->cpuc_state_change_enable = bw_def_yes;
1360 }
1361 else {
1362 data->cpuc_state_change_enable = bw_def_no;
1363 }
1364 }
1365 else {
1366 data->cpup_state_change_enable = bw_def_no;
1367 data->cpuc_state_change_enable = bw_def_no;
1368 }
1369
1370
1371
1372
1373
1374
1375
1376 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1377 if (data->enable[i]) {
1378
1379
1380 data->maximum_latency_hiding[i] = bw_add(data->minimum_latency_hiding[i],
1381 bw_mul(bw_frc_to_fixed(5, 10), data->total_dmifmc_urgent_latency));
1382 data->maximum_latency_hiding_with_cursor[i] = bw_min2(data->maximum_latency_hiding[i], data->cursor_latency_hiding[i]);
1383 }
1384 }
1385 for (i = 0; i <= 2; i++) {
1386 for (j = 0; j <= 7; j++) {
1387 data->min_dram_speed_change_margin[i][j] = bw_int_to_fixed(9999);
1388 data->dram_speed_change_margin = bw_int_to_fixed(9999);
1389 data->dispclk_required_for_dram_speed_change[i][j] = bw_int_to_fixed(0);
1390 data->num_displays_with_margin[i][j] = 0;
1391 for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
1392 if (data->enable[k]) {
1393 if (surface_type[k] != bw_def_display_write_back420_luma && surface_type[k] != bw_def_display_write_back420_chroma) {
1394 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]);
1395 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)))) {
1396
1397 data->min_dram_speed_change_margin[i][j] = bw_min2(data->min_dram_speed_change_margin[i][j], data->dram_speed_change_margin);
1398
1399 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]))));
1400 if ((bw_ltn(data->dispclk_required_for_dram_speed_change_pipe[i][j], vbios->high_voltage_max_dispclk))) {
1401 data->display_pstate_change_enable[k] = 1;
1402 data->num_displays_with_margin[i][j] = data->num_displays_with_margin[i][j] + 1;
1403 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]);
1404 }
1405 }
1406 }
1407 else {
1408 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]);
1409 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)))) {
1410
1411 data->min_dram_speed_change_margin[i][j] = bw_min2(data->min_dram_speed_change_margin[i][j], data->dram_speed_change_margin);
1412
1413 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]))));
1414 if ((bw_ltn(data->dispclk_required_for_dram_speed_change_pipe[i][j], vbios->high_voltage_max_dispclk))) {
1415 data->display_pstate_change_enable[k] = 1;
1416 data->num_displays_with_margin[i][j] = data->num_displays_with_margin[i][j] + 1;
1417 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]);
1418 }
1419 }
1420 }
1421 }
1422 }
1423 }
1424 }
1425
1426 for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
1427 if (data->enable[k] == 1 && data->display_pstate_change_enable[k] == 1) {
1428 number_of_displays_enabled_with_margin = number_of_displays_enabled_with_margin + 1;
1429 }
1430 }
1431
1432
1433
1434 data->min_vblank_dram_speed_change_margin = bw_int_to_fixed(9999);
1435 for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
1436 if (data->enable[k]) {
1437 if (surface_type[k] != bw_def_display_write_back420_luma && surface_type[k] != bw_def_display_write_back420_chroma) {
1438 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]);
1439 data->min_vblank_dram_speed_change_margin = bw_min2(data->min_vblank_dram_speed_change_margin, data->v_blank_dram_speed_change_margin[k]);
1440 }
1441 else {
1442 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]);
1443 data->min_vblank_dram_speed_change_margin = bw_min2(data->min_vblank_dram_speed_change_margin, data->v_blank_dram_speed_change_margin[k]);
1444 }
1445 }
1446 }
1447 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1448 data->displays_with_same_mode[i] = bw_int_to_fixed(0);
1449 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))) {
1450 for (j = 0; j <= maximum_number_of_surfaces - 1; j++) {
1451 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]))) {
1452 data->displays_with_same_mode[i] = bw_add(data->displays_with_same_mode[i], bw_int_to_fixed(1));
1453 }
1454 }
1455 }
1456 }
1457
1458 number_of_aligned_displays_with_no_margin = 0;
1459 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1460 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]));
1461 }
1462
1463
1464
1465
1466 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)) {
1467 data->nbp_state_change_enable = bw_def_yes;
1468 }
1469 else {
1470 data->nbp_state_change_enable = bw_def_no;
1471 }
1472
1473 if (number_of_aligned_displays_with_no_margin == number_of_displays_enabled) {
1474 nbp_state_change_enable_blank = bw_def_yes;
1475 }
1476 else {
1477 nbp_state_change_enable_blank = bw_def_no;
1478 }
1479
1480
1481
1482
1483 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1484 if (data->enable[i]) {
1485 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]);
1486 data->average_bandwidth[i] = bw_div(data->average_bandwidth_no_compression[i], data->compression_rate[i]);
1487 }
1488 }
1489 data->total_average_bandwidth_no_compression = bw_int_to_fixed(0);
1490 data->total_average_bandwidth = bw_int_to_fixed(0);
1491 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1492 if (data->enable[i]) {
1493 data->total_average_bandwidth_no_compression = bw_add(data->total_average_bandwidth_no_compression, data->average_bandwidth_no_compression[i]);
1494 data->total_average_bandwidth = bw_add(data->total_average_bandwidth, data->average_bandwidth[i]);
1495 }
1496 }
1497
1498
1499
1500
1501
1502 data->min_cursor_memory_interface_buffer_size_in_time = bw_int_to_fixed(9999);
1503
1504 num_cursor_lines = 0;
1505 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1506 if (data->enable[i]) {
1507 if (bw_mtn(data->cursor_width_pixels[i], bw_int_to_fixed(0))) {
1508
1509 if (bw_leq(data->cursor_width_pixels[i], bw_int_to_fixed(64)) && dceip->large_cursor == 1) {
1510 num_cursor_lines = 4;
1511 }
1512 else {
1513 num_cursor_lines = 2;
1514 }
1515 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]));
1516 }
1517 }
1518 }
1519
1520 if (number_of_displays_enabled > 2) {
1521 data->chunk_request_delay = 0;
1522 }
1523 else {
1524 data->chunk_request_delay = bw_fixed_to_int(bw_div(bw_int_to_fixed(512), vbios->high_voltage_max_dispclk));
1525 }
1526 data->min_read_buffer_size_in_time = bw_min2(data->min_cursor_memory_interface_buffer_size_in_time, data->min_dmif_size_in_time);
1527 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));
1528 data->display_writes_time_for_data_transfer = bw_sub(data->min_mcifwr_size_in_time, vbios->mcifwrmc_urgent_latency);
1529 data->dmif_required_dram_bandwidth = bw_div(data->total_display_reads_required_dram_access_data, data->display_reads_time_for_data_transfer);
1530 data->mcifwr_required_dram_bandwidth = bw_div(data->total_display_writes_required_dram_access_data, data->display_writes_time_for_data_transfer);
1531 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);
1532 data->required_mcifmcwr_urgent_latency = bw_sub(data->min_mcifwr_size_in_time, data->mcifwr_total_page_close_open_time);
1533 if (bw_mtn(data->scatter_gather_total_pte_requests, dceip->maximum_total_outstanding_pte_requests_allowed_by_saw)) {
1534 data->required_dram_bandwidth_gbyte_per_second = bw_int_to_fixed(9999);
1535 yclk_message = bw_def_exceeded_allowed_outstanding_pte_req_queue_size;
1536 data->y_clk_level = high;
1537 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));
1538 }
1539 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)) {
1540 data->required_dram_bandwidth_gbyte_per_second = bw_int_to_fixed(9999);
1541 yclk_message = bw_def_exceeded_allowed_page_close_open;
1542 data->y_clk_level = high;
1543 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));
1544 }
1545 else {
1546 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));
1547 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)))
1548 && 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))) {
1549 yclk_message = bw_fixed_to_int(vbios->low_yclk);
1550 data->y_clk_level = low;
1551 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));
1552 }
1553 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)))
1554 && 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))) {
1555 yclk_message = bw_fixed_to_int(vbios->mid_yclk);
1556 data->y_clk_level = mid;
1557 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));
1558 }
1559 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)))
1560 && 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)))) {
1561 yclk_message = bw_fixed_to_int(vbios->high_yclk);
1562 data->y_clk_level = high;
1563 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));
1564 }
1565 else {
1566 yclk_message = bw_def_exceeded_allowed_maximum_bw;
1567 data->y_clk_level = high;
1568 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));
1569 }
1570 }
1571
1572
1573
1574
1575
1576 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))));
1577 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);
1578 if (bw_mtn(data->scatter_gather_total_pte_requests, dceip->maximum_total_outstanding_pte_requests_allowed_by_saw)) {
1579 data->required_sclk = bw_int_to_fixed(9999);
1580 sclk_message = bw_def_exceeded_allowed_outstanding_pte_req_queue_size;
1581 data->sclk_level = s_high;
1582 }
1583 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)) {
1584 data->required_sclk = bw_int_to_fixed(9999);
1585 sclk_message = bw_def_exceeded_allowed_page_close_open;
1586 data->sclk_level = s_high;
1587 }
1588 else {
1589 data->required_sclk = bw_max2(data->dmif_required_sclk, data->mcifwr_required_sclk);
1590 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))
1591 && 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))) {
1592 sclk_message = bw_def_low;
1593 data->sclk_level = s_low;
1594 data->required_sclk = vbios->low_sclk;
1595 }
1596 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))
1597 && 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))) {
1598 sclk_message = bw_def_mid;
1599 data->sclk_level = s_mid1;
1600 data->required_sclk = vbios->mid1_sclk;
1601 }
1602 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))
1603 && 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))) {
1604 sclk_message = bw_def_mid;
1605 data->sclk_level = s_mid2;
1606 data->required_sclk = vbios->mid2_sclk;
1607 }
1608 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))
1609 && 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))) {
1610 sclk_message = bw_def_mid;
1611 data->sclk_level = s_mid3;
1612 data->required_sclk = vbios->mid3_sclk;
1613 }
1614 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))
1615 && 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))) {
1616 sclk_message = bw_def_mid;
1617 data->sclk_level = s_mid4;
1618 data->required_sclk = vbios->mid4_sclk;
1619 }
1620 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))
1621 && 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))) {
1622 sclk_message = bw_def_mid;
1623 data->sclk_level = s_mid5;
1624 data->required_sclk = vbios->mid5_sclk;
1625 }
1626 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))
1627 && 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))) {
1628 sclk_message = bw_def_mid;
1629 data->sclk_level = s_mid6;
1630 data->required_sclk = vbios->mid6_sclk;
1631 }
1632 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))
1633 && bw_ltn(data->required_sclk, sclk[s_high])) {
1634 sclk_message = bw_def_high;
1635 data->sclk_level = s_high;
1636 data->required_sclk = vbios->high_sclk;
1637 }
1638 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))
1639 && bw_ltn(data->required_sclk, sclk[s_high])) {
1640 sclk_message = bw_def_high;
1641 data->sclk_level = s_high;
1642 data->required_sclk = vbios->high_sclk;
1643 }
1644 else {
1645 sclk_message = bw_def_exceeded_allowed_maximum_sclk;
1646 data->sclk_level = s_high;
1647
1648 }
1649 }
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664 data->downspread_factor = bw_add(bw_int_to_fixed(1), bw_div(vbios->down_spread_percentage, bw_int_to_fixed(100)));
1665 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1666 if (data->enable[i]) {
1667 if (surface_type[i] == bw_def_graphics) {
1668 switch (data->lb_bpc[i]) {
1669 case 6:
1670 data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency6_bit_per_component;
1671 break;
1672 case 8:
1673 data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency8_bit_per_component;
1674 break;
1675 case 10:
1676 data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency10_bit_per_component;
1677 break;
1678 default:
1679 data->v_scaler_efficiency = dceip->graphics_vscaler_efficiency12_bit_per_component;
1680 break;
1681 }
1682 if (data->use_alpha[i] == 1) {
1683 data->v_scaler_efficiency = bw_min2(data->v_scaler_efficiency, dceip->alpha_vscaler_efficiency);
1684 }
1685 }
1686 else {
1687 switch (data->lb_bpc[i]) {
1688 case 6:
1689 data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency6_bit_per_component;
1690 break;
1691 case 8:
1692 data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency8_bit_per_component;
1693 break;
1694 case 10:
1695 data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency10_bit_per_component;
1696 break;
1697 default:
1698 data->v_scaler_efficiency = dceip->underlay_vscaler_efficiency12_bit_per_component;
1699 break;
1700 }
1701 }
1702 if (dceip->pre_downscaler_enabled && bw_mtn(data->hsr[i], bw_int_to_fixed(1))) {
1703 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]));
1704 }
1705 else {
1706 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))));
1707 }
1708 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);
1709 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)));
1710 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));
1711 }
1712 }
1713 data->total_dispclk_required_with_ramping = bw_int_to_fixed(0);
1714 data->total_dispclk_required_without_ramping = bw_int_to_fixed(0);
1715 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1716 if (data->enable[i]) {
1717 if (bw_ltn(data->total_dispclk_required_with_ramping, data->dispclk_required_with_ramping[i])) {
1718 data->total_dispclk_required_with_ramping = data->dispclk_required_with_ramping[i];
1719 }
1720 if (bw_ltn(data->total_dispclk_required_without_ramping, data->dispclk_required_without_ramping[i])) {
1721 data->total_dispclk_required_without_ramping = data->dispclk_required_without_ramping[i];
1722 }
1723 }
1724 }
1725 data->total_read_request_bandwidth = bw_int_to_fixed(0);
1726 data->total_write_request_bandwidth = bw_int_to_fixed(0);
1727 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1728 if (data->enable[i]) {
1729 if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
1730 data->total_read_request_bandwidth = bw_add(data->total_read_request_bandwidth, data->request_bandwidth[i]);
1731 }
1732 else {
1733 data->total_write_request_bandwidth = bw_add(data->total_write_request_bandwidth, data->request_bandwidth[i]);
1734 }
1735 }
1736 }
1737 data->dispclk_required_for_total_read_request_bandwidth = bw_div(bw_mul(data->total_read_request_bandwidth, dceip->dispclk_per_request), dceip->request_efficiency);
1738 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);
1739 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);
1740 if (data->cpuc_state_change_enable == bw_def_yes) {
1741 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]);
1742 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]);
1743 }
1744 if (data->cpup_state_change_enable == bw_def_yes) {
1745 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]);
1746 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]);
1747 }
1748 if (data->nbp_state_change_enable == bw_def_yes && data->increase_voltage_to_support_mclk_switch) {
1749 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]);
1750 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]);
1751 }
1752 if (bw_ltn(data->total_dispclk_required_with_ramping_with_request_bandwidth, vbios->high_voltage_max_dispclk)) {
1753 data->dispclk = data->total_dispclk_required_with_ramping_with_request_bandwidth;
1754 }
1755 else if (bw_ltn(data->total_dispclk_required_without_ramping_with_request_bandwidth, vbios->high_voltage_max_dispclk)) {
1756 data->dispclk = vbios->high_voltage_max_dispclk;
1757 }
1758 else {
1759 data->dispclk = data->total_dispclk_required_without_ramping_with_request_bandwidth;
1760 }
1761
1762
1763
1764
1765
1766 if (pipe_check == bw_def_notok) {
1767 voltage = bw_def_na;
1768 }
1769 else if (mode_check == bw_def_notok) {
1770 voltage = bw_def_notok;
1771 }
1772 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)) {
1773 voltage = bw_def_0_72;
1774 }
1775 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)) {
1776 voltage = bw_def_0_8;
1777 }
1778 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)) {
1779 if ((data->nbp_state_change_enable == bw_def_no && nbp_state_change_enable_blank == bw_def_no)) {
1780 voltage = bw_def_high_no_nbp_state_change;
1781 }
1782 else {
1783 voltage = bw_def_0_9;
1784 }
1785 }
1786 else {
1787 voltage = bw_def_notok;
1788 }
1789 if (voltage == bw_def_0_72) {
1790 data->max_phyclk = vbios->low_voltage_max_phyclk;
1791 }
1792 else if (voltage == bw_def_0_8) {
1793 data->max_phyclk = vbios->mid_voltage_max_phyclk;
1794 }
1795 else {
1796 data->max_phyclk = vbios->high_voltage_max_phyclk;
1797 }
1798
1799 data->blackout_recovery_time = bw_int_to_fixed(0);
1800 for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
1801 if (data->enable[k] && bw_mtn(vbios->blackout_duration, bw_int_to_fixed(0)) && data->cpup_state_change_enable == bw_def_yes) {
1802 if (surface_type[k] != bw_def_display_write_back420_luma && surface_type[k] != bw_def_display_write_back420_chroma) {
1803 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]));
1804 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])))))) {
1805 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])))));
1806 }
1807 }
1808 else {
1809 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]));
1810 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])))))) {
1811 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])))));
1812 }
1813 }
1814 }
1815 }
1816
1817
1818
1819
1820
1821
1822 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1823 if (data->enable[i]) {
1824 if (surface_type[i] == bw_def_display_write_back420_luma || surface_type[i] == bw_def_display_write_back420_chroma) {
1825 data->pixels_per_data_fifo_entry[i] = bw_int_to_fixed(16);
1826 }
1827 else if (surface_type[i] == bw_def_graphics) {
1828 data->pixels_per_data_fifo_entry[i] = bw_div(bw_int_to_fixed(64), bw_int_to_fixed(data->bytes_per_pixel[i]));
1829 }
1830 else if (data->orthogonal_rotation[i] == 0) {
1831 data->pixels_per_data_fifo_entry[i] = bw_int_to_fixed(16);
1832 }
1833 else {
1834 data->pixels_per_data_fifo_entry[i] = bw_div(bw_int_to_fixed(16), bw_int_to_fixed(data->bytes_per_pixel[i]));
1835 }
1836 }
1837 }
1838 data->min_pixels_per_data_fifo_entry = bw_int_to_fixed(9999);
1839 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1840 if (data->enable[i]) {
1841 if (bw_mtn(data->min_pixels_per_data_fifo_entry, data->pixels_per_data_fifo_entry[i])) {
1842 data->min_pixels_per_data_fifo_entry = data->pixels_per_data_fifo_entry[i];
1843 }
1844 }
1845 }
1846 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);
1847
1848
1849
1850
1851
1852
1853 data->chunk_request_time = bw_int_to_fixed(0);
1854 data->cursor_request_time = bw_int_to_fixed(0);
1855
1856 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1857 if (data->enable[i]) {
1858 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))))));
1859 }
1860 }
1861
1862 data->cursor_request_time = (bw_div(data->cursor_total_data, (bw_mul(bw_int_to_fixed(32), sclk[data->sclk_level]))));
1863 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1864 if (data->enable[i]) {
1865 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]));
1866 if (surface_type[i] != bw_def_display_write_back420_luma && surface_type[i] != bw_def_display_write_back420_chroma) {
1867 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);
1868 data->stutter_exit_watermark[i] = bw_add(bw_sub(vbios->stutter_self_refresh_exit_latency, data->total_dmifmc_urgent_latency), data->urgent_watermark[i]);
1869 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]);
1870
1871 if (data->display_pstate_change_enable[i] == 1) {
1872 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]));
1873 }
1874 else {
1875
1876 data->nbp_state_change_watermark[i] = bw_int_to_fixed(131000);
1877 }
1878 }
1879 else {
1880 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);
1881 data->stutter_exit_watermark[i] = bw_int_to_fixed(0);
1882 data->stutter_entry_watermark[i] = bw_int_to_fixed(0);
1883 if (data->display_pstate_change_enable[i] == 1) {
1884 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]));
1885 }
1886 else {
1887
1888 data->nbp_state_change_watermark[i] = bw_int_to_fixed(131000);
1889 }
1890 }
1891 }
1892 }
1893
1894
1895
1896 data->stutter_mode_enable = data->cpuc_state_change_enable;
1897 if (data->number_of_displays > 1) {
1898 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1899 if (data->enable[i]) {
1900 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]))) {
1901 data->stutter_mode_enable = bw_def_no;
1902 }
1903 }
1904 }
1905 }
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921 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));
1922 if (bw_mtn(data->total_display_writes_required_dram_access_data, bw_int_to_fixed(0))) {
1923 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));
1924 }
1925 else {
1926 data->mcifwrdram_access_efficiency = bw_int_to_fixed(0);
1927 }
1928
1929
1930
1931
1932
1933
1934
1935 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1936 if (data->enable[i]) {
1937 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]))));
1938 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]);
1939 }
1940 }
1941 data->min_stutter_refresh_duration = bw_int_to_fixed(9999);
1942 data->total_stutter_dmif_buffer_size = 0;
1943 data->total_bytes_requested = 0;
1944 data->min_stutter_dmif_buffer_size = 9999;
1945 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1946 if (data->enable[i]) {
1947 if (bw_mtn(data->min_stutter_refresh_duration, data->stutter_refresh_duration[i])) {
1948 data->min_stutter_refresh_duration = data->stutter_refresh_duration[i];
1949 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])))));
1950 data->min_stutter_dmif_buffer_size = bw_fixed_to_int(data->stutter_dmif_buffer_size[i]);
1951 }
1952 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)));
1953 }
1954 }
1955 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));
1956 data->num_stutter_bursts = data->total_bytes_requested / data->min_stutter_dmif_buffer_size;
1957 data->total_stutter_cycle_duration = bw_add(bw_add(data->min_stutter_refresh_duration, vbios->stutter_self_refresh_exit_latency), data->stutter_burst_time);
1958 data->time_in_self_refresh = data->min_stutter_refresh_duration;
1959 if (data->d1_display_write_back_dwb_enable == 1) {
1960 data->stutter_efficiency = bw_int_to_fixed(0);
1961 }
1962 else if (bw_ltn(data->time_in_self_refresh, bw_int_to_fixed(0))) {
1963 data->stutter_efficiency = bw_int_to_fixed(0);
1964 }
1965 else {
1966
1967 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)));
1968 }
1969
1970
1971
1972 data->worst_number_of_trips_to_memory = bw_int_to_fixed(1);
1973 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1974 if (data->enable[i] && data->scatter_gather_enable_for_pipe[i] == 1) {
1975 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));
1976 if (bw_ltn(data->worst_number_of_trips_to_memory, data->number_of_trips_to_memory_for_getting_apte_row[i])) {
1977 data->worst_number_of_trips_to_memory = data->number_of_trips_to_memory_for_getting_apte_row[i];
1978 }
1979 }
1980 }
1981 data->immediate_flip_time = bw_mul(data->worst_number_of_trips_to_memory, data->total_dmifmc_urgent_latency);
1982
1983
1984 data->latency_for_non_dmif_clients = bw_add(data->total_dmifmc_urgent_latency, data->dmif_burst_time[data->y_clk_level][data->sclk_level]);
1985 if (data->d1_display_write_back_dwb_enable == 1) {
1986 data->latency_for_non_mcifwr_clients = bw_add(vbios->mcifwrmc_urgent_latency, dceip->mcifwr_all_surfaces_burst_time);
1987 }
1988 else {
1989 data->latency_for_non_mcifwr_clients = bw_int_to_fixed(0);
1990 }
1991
1992 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);
1993
1994
1995 data->v_blank_nbp_state_dram_speed_change_latency_supported = bw_int_to_fixed(99999);
1996 data->nbp_state_dram_speed_change_latency_supported = bw_int_to_fixed(99999);
1997 for (i = 0; i <= maximum_number_of_surfaces - 1; i++) {
1998 if (data->enable[i]) {
1999 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));
2000 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));
2001 }
2002 }
2003
2004 for (i = 1; i <= 5; i++) {
2005 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)));
2006 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))) {
2007 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))));
2008 }
2009 else {
2010 data->dmif_required_sclk_for_urgent_latency[i] = bw_int_to_fixed(bw_def_na);
2011 }
2012 }
2013
2014 for (k = 0; k <= maximum_number_of_surfaces - 1; k++) {
2015 data->output_bpphdmi[k] = bw_def_na;
2016 data->output_bppdp4_lane_hbr[k] = bw_def_na;
2017 data->output_bppdp4_lane_hbr2[k] = bw_def_na;
2018 data->output_bppdp4_lane_hbr3[k] = bw_def_na;
2019 if (data->enable[k]) {
2020 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)));
2021 if (bw_meq(data->max_phyclk, bw_int_to_fixed(270))) {
2022 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)));
2023 }
2024 if (bw_meq(data->max_phyclk, bw_int_to_fixed(540))) {
2025 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)));
2026 }
2027 if (bw_meq(data->max_phyclk, bw_int_to_fixed(810))) {
2028 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)));
2029 }
2030 }
2031 }
2032
2033 kfree(surface_type);
2034 free_tiling_mode:
2035 kfree(tiling_mode);
2036 free_sclk:
2037 kfree(sclk);
2038 free_yclk:
2039 kfree(yclk);
2040 }
2041
2042
2043
2044
2045 void bw_calcs_init(struct bw_calcs_dceip *bw_dceip,
2046 struct bw_calcs_vbios *bw_vbios,
2047 struct hw_asic_id asic_id)
2048 {
2049 struct bw_calcs_dceip *dceip;
2050 struct bw_calcs_vbios *vbios;
2051
2052 enum bw_calcs_version version = bw_calcs_version_from_asic_id(asic_id);
2053
2054 dceip = kzalloc(sizeof(*dceip), GFP_KERNEL);
2055 if (!dceip)
2056 return;
2057
2058 vbios = kzalloc(sizeof(*vbios), GFP_KERNEL);
2059 if (!vbios) {
2060 kfree(dceip);
2061 return;
2062 }
2063
2064 dceip->version = version;
2065
2066 switch (version) {
2067 case BW_CALCS_VERSION_CARRIZO:
2068 vbios->memory_type = bw_def_gddr5;
2069 vbios->dram_channel_width_in_bits = 64;
2070 vbios->number_of_dram_channels = asic_id.vram_width / vbios->dram_channel_width_in_bits;
2071 vbios->number_of_dram_banks = 8;
2072 vbios->high_yclk = bw_int_to_fixed(1600);
2073 vbios->mid_yclk = bw_int_to_fixed(1600);
2074 vbios->low_yclk = bw_frc_to_fixed(66666, 100);
2075 vbios->low_sclk = bw_int_to_fixed(200);
2076 vbios->mid1_sclk = bw_int_to_fixed(300);
2077 vbios->mid2_sclk = bw_int_to_fixed(300);
2078 vbios->mid3_sclk = bw_int_to_fixed(300);
2079 vbios->mid4_sclk = bw_int_to_fixed(300);
2080 vbios->mid5_sclk = bw_int_to_fixed(300);
2081 vbios->mid6_sclk = bw_int_to_fixed(300);
2082 vbios->high_sclk = bw_frc_to_fixed(62609, 100);
2083 vbios->low_voltage_max_dispclk = bw_int_to_fixed(352);
2084 vbios->mid_voltage_max_dispclk = bw_int_to_fixed(467);
2085 vbios->high_voltage_max_dispclk = bw_int_to_fixed(643);
2086 vbios->low_voltage_max_phyclk = bw_int_to_fixed(540);
2087 vbios->mid_voltage_max_phyclk = bw_int_to_fixed(810);
2088 vbios->high_voltage_max_phyclk = bw_int_to_fixed(810);
2089 vbios->data_return_bus_width = bw_int_to_fixed(32);
2090 vbios->trc = bw_int_to_fixed(50);
2091 vbios->dmifmc_urgent_latency = bw_int_to_fixed(4);
2092 vbios->stutter_self_refresh_exit_latency = bw_frc_to_fixed(153, 10);
2093 vbios->stutter_self_refresh_entry_latency = bw_int_to_fixed(0);
2094 vbios->nbp_state_change_latency = bw_frc_to_fixed(19649, 1000);
2095 vbios->mcifwrmc_urgent_latency = bw_int_to_fixed(10);
2096 vbios->scatter_gather_enable = true;
2097 vbios->down_spread_percentage = bw_frc_to_fixed(5, 10);
2098 vbios->cursor_width = 32;
2099 vbios->average_compression_rate = 4;
2100 vbios->number_of_request_slots_gmc_reserves_for_dmif_per_channel = 256;
2101 vbios->blackout_duration = bw_int_to_fixed(0);
2102 vbios->maximum_blackout_recovery_time = bw_int_to_fixed(0);
2103
2104 dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation = 100;
2105 dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation = 100;
2106 dceip->percent_of_ideal_port_bw_received_after_urgent_latency = 100;
2107 dceip->large_cursor = false;
2108 dceip->dmif_request_buffer_size = bw_int_to_fixed(768);
2109 dceip->dmif_pipe_en_fbc_chunk_tracker = false;
2110 dceip->cursor_max_outstanding_group_num = 1;
2111 dceip->lines_interleaved_into_lb = 2;
2112 dceip->chunk_width = 256;
2113 dceip->number_of_graphics_pipes = 3;
2114 dceip->number_of_underlay_pipes = 1;
2115 dceip->low_power_tiling_mode = 0;
2116 dceip->display_write_back_supported = false;
2117 dceip->argb_compression_support = false;
2118 dceip->underlay_vscaler_efficiency6_bit_per_component =
2119 bw_frc_to_fixed(35556, 10000);
2120 dceip->underlay_vscaler_efficiency8_bit_per_component =
2121 bw_frc_to_fixed(34286, 10000);
2122 dceip->underlay_vscaler_efficiency10_bit_per_component =
2123 bw_frc_to_fixed(32, 10);
2124 dceip->underlay_vscaler_efficiency12_bit_per_component =
2125 bw_int_to_fixed(3);
2126 dceip->graphics_vscaler_efficiency6_bit_per_component =
2127 bw_frc_to_fixed(35, 10);
2128 dceip->graphics_vscaler_efficiency8_bit_per_component =
2129 bw_frc_to_fixed(34286, 10000);
2130 dceip->graphics_vscaler_efficiency10_bit_per_component =
2131 bw_frc_to_fixed(32, 10);
2132 dceip->graphics_vscaler_efficiency12_bit_per_component =
2133 bw_int_to_fixed(3);
2134 dceip->alpha_vscaler_efficiency = bw_int_to_fixed(3);
2135 dceip->max_dmif_buffer_allocated = 2;
2136 dceip->graphics_dmif_size = 12288;
2137 dceip->underlay_luma_dmif_size = 19456;
2138 dceip->underlay_chroma_dmif_size = 23552;
2139 dceip->pre_downscaler_enabled = true;
2140 dceip->underlay_downscale_prefetch_enabled = true;
2141 dceip->lb_write_pixels_per_dispclk = bw_int_to_fixed(1);
2142 dceip->lb_size_per_component444 = bw_int_to_fixed(82176);
2143 dceip->graphics_lb_nodownscaling_multi_line_prefetching = false;
2144 dceip->stutter_and_dram_clock_state_change_gated_before_cursor =
2145 bw_int_to_fixed(0);
2146 dceip->underlay420_luma_lb_size_per_component = bw_int_to_fixed(
2147 82176);
2148 dceip->underlay420_chroma_lb_size_per_component =
2149 bw_int_to_fixed(164352);
2150 dceip->underlay422_lb_size_per_component = bw_int_to_fixed(
2151 82176);
2152 dceip->cursor_chunk_width = bw_int_to_fixed(64);
2153 dceip->cursor_dcp_buffer_lines = bw_int_to_fixed(4);
2154 dceip->underlay_maximum_width_efficient_for_tiling =
2155 bw_int_to_fixed(1920);
2156 dceip->underlay_maximum_height_efficient_for_tiling =
2157 bw_int_to_fixed(1080);
2158 dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display =
2159 bw_frc_to_fixed(3, 10);
2160 dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation =
2161 bw_int_to_fixed(25);
2162 dceip->minimum_outstanding_pte_request_limit = bw_int_to_fixed(
2163 2);
2164 dceip->maximum_total_outstanding_pte_requests_allowed_by_saw =
2165 bw_int_to_fixed(128);
2166 dceip->limit_excessive_outstanding_dmif_requests = true;
2167 dceip->linear_mode_line_request_alternation_slice =
2168 bw_int_to_fixed(64);
2169 dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode =
2170 32;
2171 dceip->display_write_back420_luma_mcifwr_buffer_size = 12288;
2172 dceip->display_write_back420_chroma_mcifwr_buffer_size = 8192;
2173 dceip->request_efficiency = bw_frc_to_fixed(8, 10);
2174 dceip->dispclk_per_request = bw_int_to_fixed(2);
2175 dceip->dispclk_ramping_factor = bw_frc_to_fixed(105, 100);
2176 dceip->display_pipe_throughput_factor = bw_frc_to_fixed(105, 100);
2177 dceip->scatter_gather_pte_request_rows_in_tiling_mode = 2;
2178 dceip->mcifwr_all_surfaces_burst_time = bw_int_to_fixed(0);
2179 break;
2180 case BW_CALCS_VERSION_POLARIS10:
2181
2182
2183 case BW_CALCS_VERSION_VEGAM:
2184 vbios->memory_type = bw_def_gddr5;
2185 vbios->dram_channel_width_in_bits = 32;
2186 vbios->number_of_dram_channels = asic_id.vram_width / vbios->dram_channel_width_in_bits;
2187 vbios->number_of_dram_banks = 8;
2188 vbios->high_yclk = bw_int_to_fixed(6000);
2189 vbios->mid_yclk = bw_int_to_fixed(3200);
2190 vbios->low_yclk = bw_int_to_fixed(1000);
2191 vbios->low_sclk = bw_int_to_fixed(300);
2192 vbios->mid1_sclk = bw_int_to_fixed(400);
2193 vbios->mid2_sclk = bw_int_to_fixed(500);
2194 vbios->mid3_sclk = bw_int_to_fixed(600);
2195 vbios->mid4_sclk = bw_int_to_fixed(700);
2196 vbios->mid5_sclk = bw_int_to_fixed(800);
2197 vbios->mid6_sclk = bw_int_to_fixed(974);
2198 vbios->high_sclk = bw_int_to_fixed(1154);
2199 vbios->low_voltage_max_dispclk = bw_int_to_fixed(459);
2200 vbios->mid_voltage_max_dispclk = bw_int_to_fixed(654);
2201 vbios->high_voltage_max_dispclk = bw_int_to_fixed(1108);
2202 vbios->low_voltage_max_phyclk = bw_int_to_fixed(540);
2203 vbios->mid_voltage_max_phyclk = bw_int_to_fixed(810);
2204 vbios->high_voltage_max_phyclk = bw_int_to_fixed(810);
2205 vbios->data_return_bus_width = bw_int_to_fixed(32);
2206 vbios->trc = bw_int_to_fixed(48);
2207 vbios->dmifmc_urgent_latency = bw_int_to_fixed(3);
2208 vbios->stutter_self_refresh_exit_latency = bw_int_to_fixed(5);
2209 vbios->stutter_self_refresh_entry_latency = bw_int_to_fixed(0);
2210 vbios->nbp_state_change_latency = bw_int_to_fixed(45);
2211 vbios->mcifwrmc_urgent_latency = bw_int_to_fixed(10);
2212 vbios->scatter_gather_enable = true;
2213 vbios->down_spread_percentage = bw_frc_to_fixed(5, 10);
2214 vbios->cursor_width = 32;
2215 vbios->average_compression_rate = 4;
2216 vbios->number_of_request_slots_gmc_reserves_for_dmif_per_channel = 256;
2217 vbios->blackout_duration = bw_int_to_fixed(0);
2218 vbios->maximum_blackout_recovery_time = bw_int_to_fixed(0);
2219
2220 dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation = 100;
2221 dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation = 100;
2222 dceip->percent_of_ideal_port_bw_received_after_urgent_latency = 100;
2223 dceip->large_cursor = false;
2224 dceip->dmif_request_buffer_size = bw_int_to_fixed(768);
2225 dceip->dmif_pipe_en_fbc_chunk_tracker = false;
2226 dceip->cursor_max_outstanding_group_num = 1;
2227 dceip->lines_interleaved_into_lb = 2;
2228 dceip->chunk_width = 256;
2229 dceip->number_of_graphics_pipes = 6;
2230 dceip->number_of_underlay_pipes = 0;
2231 dceip->low_power_tiling_mode = 0;
2232 dceip->display_write_back_supported = false;
2233 dceip->argb_compression_support = true;
2234 dceip->underlay_vscaler_efficiency6_bit_per_component =
2235 bw_frc_to_fixed(35556, 10000);
2236 dceip->underlay_vscaler_efficiency8_bit_per_component =
2237 bw_frc_to_fixed(34286, 10000);
2238 dceip->underlay_vscaler_efficiency10_bit_per_component =
2239 bw_frc_to_fixed(32, 10);
2240 dceip->underlay_vscaler_efficiency12_bit_per_component =
2241 bw_int_to_fixed(3);
2242 dceip->graphics_vscaler_efficiency6_bit_per_component =
2243 bw_frc_to_fixed(35, 10);
2244 dceip->graphics_vscaler_efficiency8_bit_per_component =
2245 bw_frc_to_fixed(34286, 10000);
2246 dceip->graphics_vscaler_efficiency10_bit_per_component =
2247 bw_frc_to_fixed(32, 10);
2248 dceip->graphics_vscaler_efficiency12_bit_per_component =
2249 bw_int_to_fixed(3);
2250 dceip->alpha_vscaler_efficiency = bw_int_to_fixed(3);
2251 dceip->max_dmif_buffer_allocated = 4;
2252 dceip->graphics_dmif_size = 12288;
2253 dceip->underlay_luma_dmif_size = 19456;
2254 dceip->underlay_chroma_dmif_size = 23552;
2255 dceip->pre_downscaler_enabled = true;
2256 dceip->underlay_downscale_prefetch_enabled = true;
2257 dceip->lb_write_pixels_per_dispclk = bw_int_to_fixed(1);
2258 dceip->lb_size_per_component444 = bw_int_to_fixed(245952);
2259 dceip->graphics_lb_nodownscaling_multi_line_prefetching = true;
2260 dceip->stutter_and_dram_clock_state_change_gated_before_cursor =
2261 bw_int_to_fixed(1);
2262 dceip->underlay420_luma_lb_size_per_component = bw_int_to_fixed(
2263 82176);
2264 dceip->underlay420_chroma_lb_size_per_component =
2265 bw_int_to_fixed(164352);
2266 dceip->underlay422_lb_size_per_component = bw_int_to_fixed(
2267 82176);
2268 dceip->cursor_chunk_width = bw_int_to_fixed(64);
2269 dceip->cursor_dcp_buffer_lines = bw_int_to_fixed(4);
2270 dceip->underlay_maximum_width_efficient_for_tiling =
2271 bw_int_to_fixed(1920);
2272 dceip->underlay_maximum_height_efficient_for_tiling =
2273 bw_int_to_fixed(1080);
2274 dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display =
2275 bw_frc_to_fixed(3, 10);
2276 dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation =
2277 bw_int_to_fixed(25);
2278 dceip->minimum_outstanding_pte_request_limit = bw_int_to_fixed(
2279 2);
2280 dceip->maximum_total_outstanding_pte_requests_allowed_by_saw =
2281 bw_int_to_fixed(128);
2282 dceip->limit_excessive_outstanding_dmif_requests = true;
2283 dceip->linear_mode_line_request_alternation_slice =
2284 bw_int_to_fixed(64);
2285 dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode =
2286 32;
2287 dceip->display_write_back420_luma_mcifwr_buffer_size = 12288;
2288 dceip->display_write_back420_chroma_mcifwr_buffer_size = 8192;
2289 dceip->request_efficiency = bw_frc_to_fixed(8, 10);
2290 dceip->dispclk_per_request = bw_int_to_fixed(2);
2291 dceip->dispclk_ramping_factor = bw_frc_to_fixed(105, 100);
2292 dceip->display_pipe_throughput_factor = bw_frc_to_fixed(105, 100);
2293 dceip->scatter_gather_pte_request_rows_in_tiling_mode = 2;
2294 dceip->mcifwr_all_surfaces_burst_time = bw_int_to_fixed(0);
2295 break;
2296 case BW_CALCS_VERSION_POLARIS11:
2297 vbios->memory_type = bw_def_gddr5;
2298 vbios->dram_channel_width_in_bits = 32;
2299 vbios->number_of_dram_channels = asic_id.vram_width / vbios->dram_channel_width_in_bits;
2300 vbios->number_of_dram_banks = 8;
2301 vbios->high_yclk = bw_int_to_fixed(6000);
2302 vbios->mid_yclk = bw_int_to_fixed(3200);
2303 vbios->low_yclk = bw_int_to_fixed(1000);
2304 vbios->low_sclk = bw_int_to_fixed(300);
2305 vbios->mid1_sclk = bw_int_to_fixed(400);
2306 vbios->mid2_sclk = bw_int_to_fixed(500);
2307 vbios->mid3_sclk = bw_int_to_fixed(600);
2308 vbios->mid4_sclk = bw_int_to_fixed(700);
2309 vbios->mid5_sclk = bw_int_to_fixed(800);
2310 vbios->mid6_sclk = bw_int_to_fixed(974);
2311 vbios->high_sclk = bw_int_to_fixed(1154);
2312 vbios->low_voltage_max_dispclk = bw_int_to_fixed(459);
2313 vbios->mid_voltage_max_dispclk = bw_int_to_fixed(654);
2314 vbios->high_voltage_max_dispclk = bw_int_to_fixed(1108);
2315 vbios->low_voltage_max_phyclk = bw_int_to_fixed(540);
2316 vbios->mid_voltage_max_phyclk = bw_int_to_fixed(810);
2317 vbios->high_voltage_max_phyclk = bw_int_to_fixed(810);
2318 vbios->data_return_bus_width = bw_int_to_fixed(32);
2319 vbios->trc = bw_int_to_fixed(48);
2320 if (vbios->number_of_dram_channels == 2)
2321 vbios->dmifmc_urgent_latency = bw_int_to_fixed(4);
2322 else
2323 vbios->dmifmc_urgent_latency = bw_int_to_fixed(3);
2324 vbios->stutter_self_refresh_exit_latency = bw_int_to_fixed(5);
2325 vbios->stutter_self_refresh_entry_latency = bw_int_to_fixed(0);
2326 vbios->nbp_state_change_latency = bw_int_to_fixed(45);
2327 vbios->mcifwrmc_urgent_latency = bw_int_to_fixed(10);
2328 vbios->scatter_gather_enable = true;
2329 vbios->down_spread_percentage = bw_frc_to_fixed(5, 10);
2330 vbios->cursor_width = 32;
2331 vbios->average_compression_rate = 4;
2332 vbios->number_of_request_slots_gmc_reserves_for_dmif_per_channel = 256;
2333 vbios->blackout_duration = bw_int_to_fixed(0);
2334 vbios->maximum_blackout_recovery_time = bw_int_to_fixed(0);
2335
2336 dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation = 100;
2337 dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation = 100;
2338 dceip->percent_of_ideal_port_bw_received_after_urgent_latency = 100;
2339 dceip->large_cursor = false;
2340 dceip->dmif_request_buffer_size = bw_int_to_fixed(768);
2341 dceip->dmif_pipe_en_fbc_chunk_tracker = false;
2342 dceip->cursor_max_outstanding_group_num = 1;
2343 dceip->lines_interleaved_into_lb = 2;
2344 dceip->chunk_width = 256;
2345 dceip->number_of_graphics_pipes = 5;
2346 dceip->number_of_underlay_pipes = 0;
2347 dceip->low_power_tiling_mode = 0;
2348 dceip->display_write_back_supported = false;
2349 dceip->argb_compression_support = true;
2350 dceip->underlay_vscaler_efficiency6_bit_per_component =
2351 bw_frc_to_fixed(35556, 10000);
2352 dceip->underlay_vscaler_efficiency8_bit_per_component =
2353 bw_frc_to_fixed(34286, 10000);
2354 dceip->underlay_vscaler_efficiency10_bit_per_component =
2355 bw_frc_to_fixed(32, 10);
2356 dceip->underlay_vscaler_efficiency12_bit_per_component =
2357 bw_int_to_fixed(3);
2358 dceip->graphics_vscaler_efficiency6_bit_per_component =
2359 bw_frc_to_fixed(35, 10);
2360 dceip->graphics_vscaler_efficiency8_bit_per_component =
2361 bw_frc_to_fixed(34286, 10000);
2362 dceip->graphics_vscaler_efficiency10_bit_per_component =
2363 bw_frc_to_fixed(32, 10);
2364 dceip->graphics_vscaler_efficiency12_bit_per_component =
2365 bw_int_to_fixed(3);
2366 dceip->alpha_vscaler_efficiency = bw_int_to_fixed(3);
2367 dceip->max_dmif_buffer_allocated = 4;
2368 dceip->graphics_dmif_size = 12288;
2369 dceip->underlay_luma_dmif_size = 19456;
2370 dceip->underlay_chroma_dmif_size = 23552;
2371 dceip->pre_downscaler_enabled = true;
2372 dceip->underlay_downscale_prefetch_enabled = true;
2373 dceip->lb_write_pixels_per_dispclk = bw_int_to_fixed(1);
2374 dceip->lb_size_per_component444 = bw_int_to_fixed(245952);
2375 dceip->graphics_lb_nodownscaling_multi_line_prefetching = true;
2376 dceip->stutter_and_dram_clock_state_change_gated_before_cursor =
2377 bw_int_to_fixed(1);
2378 dceip->underlay420_luma_lb_size_per_component = bw_int_to_fixed(
2379 82176);
2380 dceip->underlay420_chroma_lb_size_per_component =
2381 bw_int_to_fixed(164352);
2382 dceip->underlay422_lb_size_per_component = bw_int_to_fixed(
2383 82176);
2384 dceip->cursor_chunk_width = bw_int_to_fixed(64);
2385 dceip->cursor_dcp_buffer_lines = bw_int_to_fixed(4);
2386 dceip->underlay_maximum_width_efficient_for_tiling =
2387 bw_int_to_fixed(1920);
2388 dceip->underlay_maximum_height_efficient_for_tiling =
2389 bw_int_to_fixed(1080);
2390 dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display =
2391 bw_frc_to_fixed(3, 10);
2392 dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation =
2393 bw_int_to_fixed(25);
2394 dceip->minimum_outstanding_pte_request_limit = bw_int_to_fixed(
2395 2);
2396 dceip->maximum_total_outstanding_pte_requests_allowed_by_saw =
2397 bw_int_to_fixed(128);
2398 dceip->limit_excessive_outstanding_dmif_requests = true;
2399 dceip->linear_mode_line_request_alternation_slice =
2400 bw_int_to_fixed(64);
2401 dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode =
2402 32;
2403 dceip->display_write_back420_luma_mcifwr_buffer_size = 12288;
2404 dceip->display_write_back420_chroma_mcifwr_buffer_size = 8192;
2405 dceip->request_efficiency = bw_frc_to_fixed(8, 10);
2406 dceip->dispclk_per_request = bw_int_to_fixed(2);
2407 dceip->dispclk_ramping_factor = bw_frc_to_fixed(105, 100);
2408 dceip->display_pipe_throughput_factor = bw_frc_to_fixed(105, 100);
2409 dceip->scatter_gather_pte_request_rows_in_tiling_mode = 2;
2410 dceip->mcifwr_all_surfaces_burst_time = bw_int_to_fixed(0);
2411 break;
2412 case BW_CALCS_VERSION_POLARIS12:
2413 vbios->memory_type = bw_def_gddr5;
2414 vbios->dram_channel_width_in_bits = 32;
2415 vbios->number_of_dram_channels = asic_id.vram_width / vbios->dram_channel_width_in_bits;
2416 vbios->number_of_dram_banks = 8;
2417 vbios->high_yclk = bw_int_to_fixed(6000);
2418 vbios->mid_yclk = bw_int_to_fixed(3200);
2419 vbios->low_yclk = bw_int_to_fixed(1000);
2420 vbios->low_sclk = bw_int_to_fixed(678);
2421 vbios->mid1_sclk = bw_int_to_fixed(864);
2422 vbios->mid2_sclk = bw_int_to_fixed(900);
2423 vbios->mid3_sclk = bw_int_to_fixed(920);
2424 vbios->mid4_sclk = bw_int_to_fixed(940);
2425 vbios->mid5_sclk = bw_int_to_fixed(960);
2426 vbios->mid6_sclk = bw_int_to_fixed(980);
2427 vbios->high_sclk = bw_int_to_fixed(1049);
2428 vbios->low_voltage_max_dispclk = bw_int_to_fixed(459);
2429 vbios->mid_voltage_max_dispclk = bw_int_to_fixed(654);
2430 vbios->high_voltage_max_dispclk = bw_int_to_fixed(1108);
2431 vbios->low_voltage_max_phyclk = bw_int_to_fixed(540);
2432 vbios->mid_voltage_max_phyclk = bw_int_to_fixed(810);
2433 vbios->high_voltage_max_phyclk = bw_int_to_fixed(810);
2434 vbios->data_return_bus_width = bw_int_to_fixed(32);
2435 vbios->trc = bw_int_to_fixed(48);
2436 if (vbios->number_of_dram_channels == 2)
2437 vbios->dmifmc_urgent_latency = bw_int_to_fixed(4);
2438 else
2439 vbios->dmifmc_urgent_latency = bw_int_to_fixed(3);
2440 vbios->stutter_self_refresh_exit_latency = bw_int_to_fixed(5);
2441 vbios->stutter_self_refresh_entry_latency = bw_int_to_fixed(0);
2442 vbios->nbp_state_change_latency = bw_int_to_fixed(250);
2443 vbios->mcifwrmc_urgent_latency = bw_int_to_fixed(10);
2444 vbios->scatter_gather_enable = false;
2445 vbios->down_spread_percentage = bw_frc_to_fixed(5, 10);
2446 vbios->cursor_width = 32;
2447 vbios->average_compression_rate = 4;
2448 vbios->number_of_request_slots_gmc_reserves_for_dmif_per_channel = 256;
2449 vbios->blackout_duration = bw_int_to_fixed(0);
2450 vbios->maximum_blackout_recovery_time = bw_int_to_fixed(0);
2451
2452 dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation = 100;
2453 dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation = 100;
2454 dceip->percent_of_ideal_port_bw_received_after_urgent_latency = 100;
2455 dceip->large_cursor = false;
2456 dceip->dmif_request_buffer_size = bw_int_to_fixed(768);
2457 dceip->dmif_pipe_en_fbc_chunk_tracker = false;
2458 dceip->cursor_max_outstanding_group_num = 1;
2459 dceip->lines_interleaved_into_lb = 2;
2460 dceip->chunk_width = 256;
2461 dceip->number_of_graphics_pipes = 5;
2462 dceip->number_of_underlay_pipes = 0;
2463 dceip->low_power_tiling_mode = 0;
2464 dceip->display_write_back_supported = true;
2465 dceip->argb_compression_support = true;
2466 dceip->underlay_vscaler_efficiency6_bit_per_component =
2467 bw_frc_to_fixed(35556, 10000);
2468 dceip->underlay_vscaler_efficiency8_bit_per_component =
2469 bw_frc_to_fixed(34286, 10000);
2470 dceip->underlay_vscaler_efficiency10_bit_per_component =
2471 bw_frc_to_fixed(32, 10);
2472 dceip->underlay_vscaler_efficiency12_bit_per_component =
2473 bw_int_to_fixed(3);
2474 dceip->graphics_vscaler_efficiency6_bit_per_component =
2475 bw_frc_to_fixed(35, 10);
2476 dceip->graphics_vscaler_efficiency8_bit_per_component =
2477 bw_frc_to_fixed(34286, 10000);
2478 dceip->graphics_vscaler_efficiency10_bit_per_component =
2479 bw_frc_to_fixed(32, 10);
2480 dceip->graphics_vscaler_efficiency12_bit_per_component =
2481 bw_int_to_fixed(3);
2482 dceip->alpha_vscaler_efficiency = bw_int_to_fixed(3);
2483 dceip->max_dmif_buffer_allocated = 4;
2484 dceip->graphics_dmif_size = 12288;
2485 dceip->underlay_luma_dmif_size = 19456;
2486 dceip->underlay_chroma_dmif_size = 23552;
2487 dceip->pre_downscaler_enabled = true;
2488 dceip->underlay_downscale_prefetch_enabled = true;
2489 dceip->lb_write_pixels_per_dispclk = bw_int_to_fixed(1);
2490 dceip->lb_size_per_component444 = bw_int_to_fixed(245952);
2491 dceip->graphics_lb_nodownscaling_multi_line_prefetching = true;
2492 dceip->stutter_and_dram_clock_state_change_gated_before_cursor =
2493 bw_int_to_fixed(1);
2494 dceip->underlay420_luma_lb_size_per_component = bw_int_to_fixed(
2495 82176);
2496 dceip->underlay420_chroma_lb_size_per_component =
2497 bw_int_to_fixed(164352);
2498 dceip->underlay422_lb_size_per_component = bw_int_to_fixed(
2499 82176);
2500 dceip->cursor_chunk_width = bw_int_to_fixed(64);
2501 dceip->cursor_dcp_buffer_lines = bw_int_to_fixed(4);
2502 dceip->underlay_maximum_width_efficient_for_tiling =
2503 bw_int_to_fixed(1920);
2504 dceip->underlay_maximum_height_efficient_for_tiling =
2505 bw_int_to_fixed(1080);
2506 dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display =
2507 bw_frc_to_fixed(3, 10);
2508 dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation =
2509 bw_int_to_fixed(25);
2510 dceip->minimum_outstanding_pte_request_limit = bw_int_to_fixed(
2511 2);
2512 dceip->maximum_total_outstanding_pte_requests_allowed_by_saw =
2513 bw_int_to_fixed(128);
2514 dceip->limit_excessive_outstanding_dmif_requests = true;
2515 dceip->linear_mode_line_request_alternation_slice =
2516 bw_int_to_fixed(64);
2517 dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode =
2518 32;
2519 dceip->display_write_back420_luma_mcifwr_buffer_size = 12288;
2520 dceip->display_write_back420_chroma_mcifwr_buffer_size = 8192;
2521 dceip->request_efficiency = bw_frc_to_fixed(8, 10);
2522 dceip->dispclk_per_request = bw_int_to_fixed(2);
2523 dceip->dispclk_ramping_factor = bw_frc_to_fixed(105, 100);
2524 dceip->display_pipe_throughput_factor = bw_frc_to_fixed(105, 100);
2525 dceip->scatter_gather_pte_request_rows_in_tiling_mode = 2;
2526 dceip->mcifwr_all_surfaces_burst_time = bw_int_to_fixed(0);
2527 break;
2528 case BW_CALCS_VERSION_STONEY:
2529 vbios->memory_type = bw_def_gddr5;
2530 vbios->dram_channel_width_in_bits = 64;
2531 vbios->number_of_dram_channels = asic_id.vram_width / vbios->dram_channel_width_in_bits;
2532 vbios->number_of_dram_banks = 8;
2533 vbios->high_yclk = bw_int_to_fixed(1866);
2534 vbios->mid_yclk = bw_int_to_fixed(1866);
2535 vbios->low_yclk = bw_int_to_fixed(1333);
2536 vbios->low_sclk = bw_int_to_fixed(200);
2537 vbios->mid1_sclk = bw_int_to_fixed(600);
2538 vbios->mid2_sclk = bw_int_to_fixed(600);
2539 vbios->mid3_sclk = bw_int_to_fixed(600);
2540 vbios->mid4_sclk = bw_int_to_fixed(600);
2541 vbios->mid5_sclk = bw_int_to_fixed(600);
2542 vbios->mid6_sclk = bw_int_to_fixed(600);
2543 vbios->high_sclk = bw_int_to_fixed(800);
2544 vbios->low_voltage_max_dispclk = bw_int_to_fixed(352);
2545 vbios->mid_voltage_max_dispclk = bw_int_to_fixed(467);
2546 vbios->high_voltage_max_dispclk = bw_int_to_fixed(643);
2547 vbios->low_voltage_max_phyclk = bw_int_to_fixed(540);
2548 vbios->mid_voltage_max_phyclk = bw_int_to_fixed(810);
2549 vbios->high_voltage_max_phyclk = bw_int_to_fixed(810);
2550 vbios->data_return_bus_width = bw_int_to_fixed(32);
2551 vbios->trc = bw_int_to_fixed(50);
2552 vbios->dmifmc_urgent_latency = bw_int_to_fixed(4);
2553 vbios->stutter_self_refresh_exit_latency = bw_frc_to_fixed(158, 10);
2554 vbios->stutter_self_refresh_entry_latency = bw_int_to_fixed(0);
2555 vbios->nbp_state_change_latency = bw_frc_to_fixed(2008, 100);
2556 vbios->mcifwrmc_urgent_latency = bw_int_to_fixed(10);
2557 vbios->scatter_gather_enable = true;
2558 vbios->down_spread_percentage = bw_frc_to_fixed(5, 10);
2559 vbios->cursor_width = 32;
2560 vbios->average_compression_rate = 4;
2561 vbios->number_of_request_slots_gmc_reserves_for_dmif_per_channel = 256;
2562 vbios->blackout_duration = bw_int_to_fixed(0);
2563 vbios->maximum_blackout_recovery_time = bw_int_to_fixed(0);
2564
2565 dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation = 100;
2566 dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation = 100;
2567 dceip->percent_of_ideal_port_bw_received_after_urgent_latency = 100;
2568 dceip->large_cursor = false;
2569 dceip->dmif_request_buffer_size = bw_int_to_fixed(768);
2570 dceip->dmif_pipe_en_fbc_chunk_tracker = false;
2571 dceip->cursor_max_outstanding_group_num = 1;
2572 dceip->lines_interleaved_into_lb = 2;
2573 dceip->chunk_width = 256;
2574 dceip->number_of_graphics_pipes = 2;
2575 dceip->number_of_underlay_pipes = 1;
2576 dceip->low_power_tiling_mode = 0;
2577 dceip->display_write_back_supported = false;
2578 dceip->argb_compression_support = true;
2579 dceip->underlay_vscaler_efficiency6_bit_per_component =
2580 bw_frc_to_fixed(35556, 10000);
2581 dceip->underlay_vscaler_efficiency8_bit_per_component =
2582 bw_frc_to_fixed(34286, 10000);
2583 dceip->underlay_vscaler_efficiency10_bit_per_component =
2584 bw_frc_to_fixed(32, 10);
2585 dceip->underlay_vscaler_efficiency12_bit_per_component =
2586 bw_int_to_fixed(3);
2587 dceip->graphics_vscaler_efficiency6_bit_per_component =
2588 bw_frc_to_fixed(35, 10);
2589 dceip->graphics_vscaler_efficiency8_bit_per_component =
2590 bw_frc_to_fixed(34286, 10000);
2591 dceip->graphics_vscaler_efficiency10_bit_per_component =
2592 bw_frc_to_fixed(32, 10);
2593 dceip->graphics_vscaler_efficiency12_bit_per_component =
2594 bw_int_to_fixed(3);
2595 dceip->alpha_vscaler_efficiency = bw_int_to_fixed(3);
2596 dceip->max_dmif_buffer_allocated = 2;
2597 dceip->graphics_dmif_size = 12288;
2598 dceip->underlay_luma_dmif_size = 19456;
2599 dceip->underlay_chroma_dmif_size = 23552;
2600 dceip->pre_downscaler_enabled = true;
2601 dceip->underlay_downscale_prefetch_enabled = true;
2602 dceip->lb_write_pixels_per_dispclk = bw_int_to_fixed(1);
2603 dceip->lb_size_per_component444 = bw_int_to_fixed(82176);
2604 dceip->graphics_lb_nodownscaling_multi_line_prefetching = false;
2605 dceip->stutter_and_dram_clock_state_change_gated_before_cursor =
2606 bw_int_to_fixed(0);
2607 dceip->underlay420_luma_lb_size_per_component = bw_int_to_fixed(
2608 82176);
2609 dceip->underlay420_chroma_lb_size_per_component =
2610 bw_int_to_fixed(164352);
2611 dceip->underlay422_lb_size_per_component = bw_int_to_fixed(
2612 82176);
2613 dceip->cursor_chunk_width = bw_int_to_fixed(64);
2614 dceip->cursor_dcp_buffer_lines = bw_int_to_fixed(4);
2615 dceip->underlay_maximum_width_efficient_for_tiling =
2616 bw_int_to_fixed(1920);
2617 dceip->underlay_maximum_height_efficient_for_tiling =
2618 bw_int_to_fixed(1080);
2619 dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display =
2620 bw_frc_to_fixed(3, 10);
2621 dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation =
2622 bw_int_to_fixed(25);
2623 dceip->minimum_outstanding_pte_request_limit = bw_int_to_fixed(
2624 2);
2625 dceip->maximum_total_outstanding_pte_requests_allowed_by_saw =
2626 bw_int_to_fixed(128);
2627 dceip->limit_excessive_outstanding_dmif_requests = true;
2628 dceip->linear_mode_line_request_alternation_slice =
2629 bw_int_to_fixed(64);
2630 dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode =
2631 32;
2632 dceip->display_write_back420_luma_mcifwr_buffer_size = 12288;
2633 dceip->display_write_back420_chroma_mcifwr_buffer_size = 8192;
2634 dceip->request_efficiency = bw_frc_to_fixed(8, 10);
2635 dceip->dispclk_per_request = bw_int_to_fixed(2);
2636 dceip->dispclk_ramping_factor = bw_frc_to_fixed(105, 100);
2637 dceip->display_pipe_throughput_factor = bw_frc_to_fixed(105, 100);
2638 dceip->scatter_gather_pte_request_rows_in_tiling_mode = 2;
2639 dceip->mcifwr_all_surfaces_burst_time = bw_int_to_fixed(0);
2640 break;
2641 case BW_CALCS_VERSION_VEGA10:
2642 vbios->memory_type = bw_def_hbm;
2643 vbios->dram_channel_width_in_bits = 128;
2644 vbios->number_of_dram_channels = asic_id.vram_width / vbios->dram_channel_width_in_bits;
2645 vbios->number_of_dram_banks = 16;
2646 vbios->high_yclk = bw_int_to_fixed(2400);
2647 vbios->mid_yclk = bw_int_to_fixed(1700);
2648 vbios->low_yclk = bw_int_to_fixed(1000);
2649 vbios->low_sclk = bw_int_to_fixed(300);
2650 vbios->mid1_sclk = bw_int_to_fixed(350);
2651 vbios->mid2_sclk = bw_int_to_fixed(400);
2652 vbios->mid3_sclk = bw_int_to_fixed(500);
2653 vbios->mid4_sclk = bw_int_to_fixed(600);
2654 vbios->mid5_sclk = bw_int_to_fixed(700);
2655 vbios->mid6_sclk = bw_int_to_fixed(760);
2656 vbios->high_sclk = bw_int_to_fixed(776);
2657 vbios->low_voltage_max_dispclk = bw_int_to_fixed(460);
2658 vbios->mid_voltage_max_dispclk = bw_int_to_fixed(670);
2659 vbios->high_voltage_max_dispclk = bw_int_to_fixed(1133);
2660 vbios->low_voltage_max_phyclk = bw_int_to_fixed(540);
2661 vbios->mid_voltage_max_phyclk = bw_int_to_fixed(810);
2662 vbios->high_voltage_max_phyclk = bw_int_to_fixed(810);
2663 vbios->data_return_bus_width = bw_int_to_fixed(32);
2664 vbios->trc = bw_int_to_fixed(48);
2665 vbios->dmifmc_urgent_latency = bw_int_to_fixed(3);
2666 vbios->stutter_self_refresh_exit_latency = bw_frc_to_fixed(75, 10);
2667 vbios->stutter_self_refresh_entry_latency = bw_frc_to_fixed(19, 10);
2668 vbios->nbp_state_change_latency = bw_int_to_fixed(39);
2669 vbios->mcifwrmc_urgent_latency = bw_int_to_fixed(10);
2670 vbios->scatter_gather_enable = false;
2671 vbios->down_spread_percentage = bw_frc_to_fixed(5, 10);
2672 vbios->cursor_width = 32;
2673 vbios->average_compression_rate = 4;
2674 vbios->number_of_request_slots_gmc_reserves_for_dmif_per_channel = 8;
2675 vbios->blackout_duration = bw_int_to_fixed(0);
2676 vbios->maximum_blackout_recovery_time = bw_int_to_fixed(0);
2677
2678 dceip->max_average_percent_of_ideal_port_bw_display_can_use_in_normal_system_operation = 100;
2679 dceip->max_average_percent_of_ideal_drambw_display_can_use_in_normal_system_operation = 100;
2680 dceip->percent_of_ideal_port_bw_received_after_urgent_latency = 100;
2681 dceip->large_cursor = false;
2682 dceip->dmif_request_buffer_size = bw_int_to_fixed(2304);
2683 dceip->dmif_pipe_en_fbc_chunk_tracker = true;
2684 dceip->cursor_max_outstanding_group_num = 1;
2685 dceip->lines_interleaved_into_lb = 2;
2686 dceip->chunk_width = 256;
2687 dceip->number_of_graphics_pipes = 6;
2688 dceip->number_of_underlay_pipes = 0;
2689 dceip->low_power_tiling_mode = 0;
2690 dceip->display_write_back_supported = true;
2691 dceip->argb_compression_support = true;
2692 dceip->underlay_vscaler_efficiency6_bit_per_component =
2693 bw_frc_to_fixed(35556, 10000);
2694 dceip->underlay_vscaler_efficiency8_bit_per_component =
2695 bw_frc_to_fixed(34286, 10000);
2696 dceip->underlay_vscaler_efficiency10_bit_per_component =
2697 bw_frc_to_fixed(32, 10);
2698 dceip->underlay_vscaler_efficiency12_bit_per_component =
2699 bw_int_to_fixed(3);
2700 dceip->graphics_vscaler_efficiency6_bit_per_component =
2701 bw_frc_to_fixed(35, 10);
2702 dceip->graphics_vscaler_efficiency8_bit_per_component =
2703 bw_frc_to_fixed(34286, 10000);
2704 dceip->graphics_vscaler_efficiency10_bit_per_component =
2705 bw_frc_to_fixed(32, 10);
2706 dceip->graphics_vscaler_efficiency12_bit_per_component =
2707 bw_int_to_fixed(3);
2708 dceip->alpha_vscaler_efficiency = bw_int_to_fixed(3);
2709 dceip->max_dmif_buffer_allocated = 4;
2710 dceip->graphics_dmif_size = 24576;
2711 dceip->underlay_luma_dmif_size = 19456;
2712 dceip->underlay_chroma_dmif_size = 23552;
2713 dceip->pre_downscaler_enabled = true;
2714 dceip->underlay_downscale_prefetch_enabled = false;
2715 dceip->lb_write_pixels_per_dispclk = bw_int_to_fixed(1);
2716 dceip->lb_size_per_component444 = bw_int_to_fixed(245952);
2717 dceip->graphics_lb_nodownscaling_multi_line_prefetching = true;
2718 dceip->stutter_and_dram_clock_state_change_gated_before_cursor =
2719 bw_int_to_fixed(1);
2720 dceip->underlay420_luma_lb_size_per_component = bw_int_to_fixed(
2721 82176);
2722 dceip->underlay420_chroma_lb_size_per_component =
2723 bw_int_to_fixed(164352);
2724 dceip->underlay422_lb_size_per_component = bw_int_to_fixed(
2725 82176);
2726 dceip->cursor_chunk_width = bw_int_to_fixed(64);
2727 dceip->cursor_dcp_buffer_lines = bw_int_to_fixed(4);
2728 dceip->underlay_maximum_width_efficient_for_tiling =
2729 bw_int_to_fixed(1920);
2730 dceip->underlay_maximum_height_efficient_for_tiling =
2731 bw_int_to_fixed(1080);
2732 dceip->peak_pte_request_to_eviction_ratio_limiting_multiple_displays_or_single_rotated_display =
2733 bw_frc_to_fixed(3, 10);
2734 dceip->peak_pte_request_to_eviction_ratio_limiting_single_display_no_rotation =
2735 bw_int_to_fixed(25);
2736 dceip->minimum_outstanding_pte_request_limit = bw_int_to_fixed(
2737 2);
2738 dceip->maximum_total_outstanding_pte_requests_allowed_by_saw =
2739 bw_int_to_fixed(128);
2740 dceip->limit_excessive_outstanding_dmif_requests = true;
2741 dceip->linear_mode_line_request_alternation_slice =
2742 bw_int_to_fixed(64);
2743 dceip->scatter_gather_lines_of_pte_prefetching_in_linear_mode =
2744 32;
2745 dceip->display_write_back420_luma_mcifwr_buffer_size = 12288;
2746 dceip->display_write_back420_chroma_mcifwr_buffer_size = 8192;
2747 dceip->request_efficiency = bw_frc_to_fixed(8, 10);
2748 dceip->dispclk_per_request = bw_int_to_fixed(2);
2749 dceip->dispclk_ramping_factor = bw_frc_to_fixed(105, 100);
2750 dceip->display_pipe_throughput_factor = bw_frc_to_fixed(105, 100);
2751 dceip->scatter_gather_pte_request_rows_in_tiling_mode = 2;
2752 dceip->mcifwr_all_surfaces_burst_time = bw_int_to_fixed(0);
2753 break;
2754 default:
2755 break;
2756 }
2757 *bw_dceip = *dceip;
2758 *bw_vbios = *vbios;
2759
2760 kfree(dceip);
2761 kfree(vbios);
2762 }
2763
2764
2765
2766
2767
2768 static bool is_display_configuration_supported(
2769 const struct bw_calcs_vbios *vbios,
2770 const struct dce_bw_output *calcs_output)
2771 {
2772 uint32_t int_max_clk;
2773
2774 int_max_clk = bw_fixed_to_int(vbios->high_voltage_max_dispclk);
2775 int_max_clk *= 1000;
2776 if (calcs_output->dispclk_khz > int_max_clk)
2777 return false;
2778
2779 int_max_clk = bw_fixed_to_int(vbios->high_sclk);
2780 int_max_clk *= 1000;
2781 if (calcs_output->sclk_khz > int_max_clk)
2782 return false;
2783
2784 return true;
2785 }
2786
2787 static void populate_initial_data(
2788 const struct pipe_ctx pipe[], int pipe_count, struct bw_calcs_data *data)
2789 {
2790 int i, j;
2791 int num_displays = 0;
2792
2793 data->underlay_surface_type = bw_def_420;
2794 data->panning_and_bezel_adjustment = bw_def_none;
2795 data->graphics_lb_bpc = 10;
2796 data->underlay_lb_bpc = 8;
2797 data->underlay_tiling_mode = bw_def_tiled;
2798 data->graphics_tiling_mode = bw_def_tiled;
2799 data->underlay_micro_tile_mode = bw_def_display_micro_tiling;
2800 data->graphics_micro_tile_mode = bw_def_display_micro_tiling;
2801 data->increase_voltage_to_support_mclk_switch = true;
2802
2803
2804 for (i = 0; i < pipe_count; i++) {
2805 if (!pipe[i].stream || !pipe[i].bottom_pipe)
2806 continue;
2807
2808 ASSERT(pipe[i].plane_state);
2809
2810 if (num_displays == 0) {
2811 if (!pipe[i].plane_state->visible)
2812 data->d0_underlay_mode = bw_def_underlay_only;
2813 else
2814 data->d0_underlay_mode = bw_def_blend;
2815 } else {
2816 if (!pipe[i].plane_state->visible)
2817 data->d1_underlay_mode = bw_def_underlay_only;
2818 else
2819 data->d1_underlay_mode = bw_def_blend;
2820 }
2821
2822 data->fbc_en[num_displays + 4] = false;
2823 data->lpt_en[num_displays + 4] = false;
2824 data->h_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.h_total);
2825 data->v_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.v_total);
2826 data->pixel_rate[num_displays + 4] = bw_frc_to_fixed(pipe[i].stream->timing.pix_clk_100hz, 10000);
2827 data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.width);
2828 data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4];
2829 data->src_height[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.height);
2830 data->h_taps[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.taps.h_taps);
2831 data->v_taps[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.taps.v_taps);
2832 data->h_scale_ratio[num_displays + 4] = fixed31_32_to_bw_fixed(pipe[i].plane_res.scl_data.ratios.horz.value);
2833 data->v_scale_ratio[num_displays + 4] = fixed31_32_to_bw_fixed(pipe[i].plane_res.scl_data.ratios.vert.value);
2834 switch (pipe[i].plane_state->rotation) {
2835 case ROTATION_ANGLE_0:
2836 data->rotation_angle[num_displays + 4] = bw_int_to_fixed(0);
2837 break;
2838 case ROTATION_ANGLE_90:
2839 data->rotation_angle[num_displays + 4] = bw_int_to_fixed(90);
2840 break;
2841 case ROTATION_ANGLE_180:
2842 data->rotation_angle[num_displays + 4] = bw_int_to_fixed(180);
2843 break;
2844 case ROTATION_ANGLE_270:
2845 data->rotation_angle[num_displays + 4] = bw_int_to_fixed(270);
2846 break;
2847 default:
2848 break;
2849 }
2850 switch (pipe[i].plane_state->format) {
2851 case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr:
2852 case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555:
2853 case SURFACE_PIXEL_FORMAT_GRPH_RGB565:
2854 data->bytes_per_pixel[num_displays + 4] = 2;
2855 break;
2856 case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888:
2857 case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888:
2858 case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010:
2859 case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010:
2860 case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS:
2861 case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr:
2862 case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb:
2863 data->bytes_per_pixel[num_displays + 4] = 4;
2864 break;
2865 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616:
2866 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616:
2867 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F:
2868 data->bytes_per_pixel[num_displays + 4] = 8;
2869 break;
2870 default:
2871 data->bytes_per_pixel[num_displays + 4] = 4;
2872 break;
2873 }
2874 data->interlace_mode[num_displays + 4] = false;
2875 data->stereo_mode[num_displays + 4] = bw_def_mono;
2876
2877
2878 for (j = 0; j < 2; j++) {
2879 data->fbc_en[num_displays * 2 + j] = false;
2880 data->lpt_en[num_displays * 2 + j] = false;
2881
2882 data->src_height[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.viewport.height);
2883 data->src_width[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.viewport.width);
2884 data->pitch_in_pixels[num_displays * 2 + j] = bw_int_to_fixed(
2885 pipe[i].bottom_pipe->plane_state->plane_size.surface_pitch);
2886 data->h_taps[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.taps.h_taps);
2887 data->v_taps[num_displays * 2 + j] = bw_int_to_fixed(pipe[i].bottom_pipe->plane_res.scl_data.taps.v_taps);
2888 data->h_scale_ratio[num_displays * 2 + j] = fixed31_32_to_bw_fixed(
2889 pipe[i].bottom_pipe->plane_res.scl_data.ratios.horz.value);
2890 data->v_scale_ratio[num_displays * 2 + j] = fixed31_32_to_bw_fixed(
2891 pipe[i].bottom_pipe->plane_res.scl_data.ratios.vert.value);
2892 switch (pipe[i].bottom_pipe->plane_state->rotation) {
2893 case ROTATION_ANGLE_0:
2894 data->rotation_angle[num_displays * 2 + j] = bw_int_to_fixed(0);
2895 break;
2896 case ROTATION_ANGLE_90:
2897 data->rotation_angle[num_displays * 2 + j] = bw_int_to_fixed(90);
2898 break;
2899 case ROTATION_ANGLE_180:
2900 data->rotation_angle[num_displays * 2 + j] = bw_int_to_fixed(180);
2901 break;
2902 case ROTATION_ANGLE_270:
2903 data->rotation_angle[num_displays * 2 + j] = bw_int_to_fixed(270);
2904 break;
2905 default:
2906 break;
2907 }
2908 data->stereo_mode[num_displays * 2 + j] = bw_def_mono;
2909 }
2910
2911 num_displays++;
2912 }
2913
2914
2915 for (i = 0; i < pipe_count; i++) {
2916 unsigned int pixel_clock_100hz;
2917 if (!pipe[i].stream || pipe[i].bottom_pipe)
2918 continue;
2919
2920
2921 data->fbc_en[num_displays + 4] = false;
2922 data->lpt_en[num_displays + 4] = false;
2923 data->h_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.h_total);
2924 data->v_total[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.v_total);
2925 pixel_clock_100hz = pipe[i].stream->timing.pix_clk_100hz;
2926 if (pipe[i].stream->timing.timing_3d_format == TIMING_3D_FORMAT_HW_FRAME_PACKING)
2927 pixel_clock_100hz *= 2;
2928 data->pixel_rate[num_displays + 4] = bw_frc_to_fixed(pixel_clock_100hz, 10000);
2929 if (pipe[i].plane_state) {
2930 data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.width);
2931 data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4];
2932 data->src_height[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.viewport.height);
2933 data->h_taps[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.taps.h_taps);
2934 data->v_taps[num_displays + 4] = bw_int_to_fixed(pipe[i].plane_res.scl_data.taps.v_taps);
2935 data->h_scale_ratio[num_displays + 4] = fixed31_32_to_bw_fixed(pipe[i].plane_res.scl_data.ratios.horz.value);
2936 data->v_scale_ratio[num_displays + 4] = fixed31_32_to_bw_fixed(pipe[i].plane_res.scl_data.ratios.vert.value);
2937 switch (pipe[i].plane_state->rotation) {
2938 case ROTATION_ANGLE_0:
2939 data->rotation_angle[num_displays + 4] = bw_int_to_fixed(0);
2940 break;
2941 case ROTATION_ANGLE_90:
2942 data->rotation_angle[num_displays + 4] = bw_int_to_fixed(90);
2943 break;
2944 case ROTATION_ANGLE_180:
2945 data->rotation_angle[num_displays + 4] = bw_int_to_fixed(180);
2946 break;
2947 case ROTATION_ANGLE_270:
2948 data->rotation_angle[num_displays + 4] = bw_int_to_fixed(270);
2949 break;
2950 default:
2951 break;
2952 }
2953 switch (pipe[i].plane_state->format) {
2954 case SURFACE_PIXEL_FORMAT_VIDEO_420_YCbCr:
2955 case SURFACE_PIXEL_FORMAT_VIDEO_420_YCrCb:
2956 case SURFACE_PIXEL_FORMAT_GRPH_ARGB1555:
2957 case SURFACE_PIXEL_FORMAT_GRPH_RGB565:
2958 data->bytes_per_pixel[num_displays + 4] = 2;
2959 break;
2960 case SURFACE_PIXEL_FORMAT_GRPH_ARGB8888:
2961 case SURFACE_PIXEL_FORMAT_GRPH_ABGR8888:
2962 case SURFACE_PIXEL_FORMAT_GRPH_ARGB2101010:
2963 case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010:
2964 case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS:
2965 case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCbCr:
2966 case SURFACE_PIXEL_FORMAT_VIDEO_420_10bpc_YCrCb:
2967 data->bytes_per_pixel[num_displays + 4] = 4;
2968 break;
2969 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616:
2970 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616:
2971 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F:
2972 data->bytes_per_pixel[num_displays + 4] = 8;
2973 break;
2974 default:
2975 data->bytes_per_pixel[num_displays + 4] = 4;
2976 break;
2977 }
2978 } else if (pipe[i].stream->dst.width != 0 &&
2979 pipe[i].stream->dst.height != 0 &&
2980 pipe[i].stream->src.width != 0 &&
2981 pipe[i].stream->src.height != 0) {
2982 data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->src.width);
2983 data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4];
2984 data->src_height[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->src.height);
2985 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);
2986 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);
2987 data->h_scale_ratio[num_displays + 4] = bw_frc_to_fixed(pipe[i].stream->src.width, pipe[i].stream->dst.width);
2988 data->v_scale_ratio[num_displays + 4] = bw_frc_to_fixed(pipe[i].stream->src.height, pipe[i].stream->dst.height);
2989 data->rotation_angle[num_displays + 4] = bw_int_to_fixed(0);
2990 data->bytes_per_pixel[num_displays + 4] = 4;
2991 } else {
2992 data->src_width[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.h_addressable);
2993 data->pitch_in_pixels[num_displays + 4] = data->src_width[num_displays + 4];
2994 data->src_height[num_displays + 4] = bw_int_to_fixed(pipe[i].stream->timing.v_addressable);
2995 data->h_taps[num_displays + 4] = bw_int_to_fixed(1);
2996 data->v_taps[num_displays + 4] = bw_int_to_fixed(1);
2997 data->h_scale_ratio[num_displays + 4] = bw_int_to_fixed(1);
2998 data->v_scale_ratio[num_displays + 4] = bw_int_to_fixed(1);
2999 data->rotation_angle[num_displays + 4] = bw_int_to_fixed(0);
3000 data->bytes_per_pixel[num_displays + 4] = 4;
3001 }
3002
3003 data->interlace_mode[num_displays + 4] = false;
3004 data->stereo_mode[num_displays + 4] = bw_def_mono;
3005 num_displays++;
3006 }
3007
3008 data->number_of_displays = num_displays;
3009 }
3010
3011 static bool all_displays_in_sync(const struct pipe_ctx pipe[],
3012 int pipe_count)
3013 {
3014 const struct pipe_ctx *active_pipes[MAX_PIPES];
3015 int i, num_active_pipes = 0;
3016
3017 for (i = 0; i < pipe_count; i++) {
3018 if (!pipe[i].stream || pipe[i].top_pipe)
3019 continue;
3020
3021 active_pipes[num_active_pipes++] = &pipe[i];
3022 }
3023
3024 if (!num_active_pipes)
3025 return false;
3026
3027 for (i = 1; i < num_active_pipes; ++i) {
3028 if (!resource_are_streams_timing_synchronizable(
3029 active_pipes[0]->stream, active_pipes[i]->stream)) {
3030 return false;
3031 }
3032 }
3033
3034 return true;
3035 }
3036
3037
3038
3039
3040
3041
3042
3043 bool bw_calcs(struct dc_context *ctx,
3044 const struct bw_calcs_dceip *dceip,
3045 const struct bw_calcs_vbios *vbios,
3046 const struct pipe_ctx pipe[],
3047 int pipe_count,
3048 struct dce_bw_output *calcs_output)
3049 {
3050 struct bw_calcs_data *data = kzalloc(sizeof(struct bw_calcs_data),
3051 GFP_KERNEL);
3052 if (!data)
3053 return false;
3054
3055 populate_initial_data(pipe, pipe_count, data);
3056
3057 if (ctx->dc->config.multi_mon_pp_mclk_switch)
3058 calcs_output->all_displays_in_sync = all_displays_in_sync(pipe, pipe_count);
3059 else
3060 calcs_output->all_displays_in_sync = false;
3061
3062 if (data->number_of_displays != 0) {
3063 uint8_t yclk_lvl;
3064 struct bw_fixed high_sclk = vbios->high_sclk;
3065 struct bw_fixed mid1_sclk = vbios->mid1_sclk;
3066 struct bw_fixed mid2_sclk = vbios->mid2_sclk;
3067 struct bw_fixed mid3_sclk = vbios->mid3_sclk;
3068 struct bw_fixed mid4_sclk = vbios->mid4_sclk;
3069 struct bw_fixed mid5_sclk = vbios->mid5_sclk;
3070 struct bw_fixed mid6_sclk = vbios->mid6_sclk;
3071 struct bw_fixed low_sclk = vbios->low_sclk;
3072 struct bw_fixed high_yclk = vbios->high_yclk;
3073 struct bw_fixed mid_yclk = vbios->mid_yclk;
3074 struct bw_fixed low_yclk = vbios->low_yclk;
3075
3076 if (ctx->dc->debug.bandwidth_calcs_trace) {
3077 print_bw_calcs_dceip(ctx, dceip);
3078 print_bw_calcs_vbios(ctx, vbios);
3079 print_bw_calcs_data(ctx, data);
3080 }
3081 calculate_bandwidth(dceip, vbios, data);
3082
3083 yclk_lvl = data->y_clk_level;
3084
3085 calcs_output->nbp_state_change_enable =
3086 data->nbp_state_change_enable;
3087 calcs_output->cpuc_state_change_enable =
3088 data->cpuc_state_change_enable;
3089 calcs_output->cpup_state_change_enable =
3090 data->cpup_state_change_enable;
3091 calcs_output->stutter_mode_enable =
3092 data->stutter_mode_enable;
3093 calcs_output->dispclk_khz =
3094 bw_fixed_to_int(bw_mul(data->dispclk,
3095 bw_int_to_fixed(1000)));
3096 calcs_output->blackout_recovery_time_us =
3097 bw_fixed_to_int(data->blackout_recovery_time);
3098 calcs_output->sclk_khz =
3099 bw_fixed_to_int(bw_mul(data->required_sclk,
3100 bw_int_to_fixed(1000)));
3101 calcs_output->sclk_deep_sleep_khz =
3102 bw_fixed_to_int(bw_mul(data->sclk_deep_sleep,
3103 bw_int_to_fixed(1000)));
3104 if (yclk_lvl == 0)
3105 calcs_output->yclk_khz = bw_fixed_to_int(
3106 bw_mul(low_yclk, bw_int_to_fixed(1000)));
3107 else if (yclk_lvl == 1)
3108 calcs_output->yclk_khz = bw_fixed_to_int(
3109 bw_mul(mid_yclk, bw_int_to_fixed(1000)));
3110 else
3111 calcs_output->yclk_khz = bw_fixed_to_int(
3112 bw_mul(high_yclk, bw_int_to_fixed(1000)));
3113
3114
3115
3116 calcs_output->nbp_state_change_wm_ns[0].a_mark =
3117 bw_fixed_to_int(bw_mul(data->
3118 nbp_state_change_watermark[4], bw_int_to_fixed(1000)));
3119 calcs_output->nbp_state_change_wm_ns[1].a_mark =
3120 bw_fixed_to_int(bw_mul(data->
3121 nbp_state_change_watermark[5], bw_int_to_fixed(1000)));
3122 calcs_output->nbp_state_change_wm_ns[2].a_mark =
3123 bw_fixed_to_int(bw_mul(data->
3124 nbp_state_change_watermark[6], bw_int_to_fixed(1000)));
3125
3126 if (ctx->dc->caps.max_slave_planes) {
3127 calcs_output->nbp_state_change_wm_ns[3].a_mark =
3128 bw_fixed_to_int(bw_mul(data->
3129 nbp_state_change_watermark[0], bw_int_to_fixed(1000)));
3130 calcs_output->nbp_state_change_wm_ns[4].a_mark =
3131 bw_fixed_to_int(bw_mul(data->
3132 nbp_state_change_watermark[1], bw_int_to_fixed(1000)));
3133 } else {
3134 calcs_output->nbp_state_change_wm_ns[3].a_mark =
3135 bw_fixed_to_int(bw_mul(data->
3136 nbp_state_change_watermark[7], bw_int_to_fixed(1000)));
3137 calcs_output->nbp_state_change_wm_ns[4].a_mark =
3138 bw_fixed_to_int(bw_mul(data->
3139 nbp_state_change_watermark[8], bw_int_to_fixed(1000)));
3140 }
3141 calcs_output->nbp_state_change_wm_ns[5].a_mark =
3142 bw_fixed_to_int(bw_mul(data->
3143 nbp_state_change_watermark[9], bw_int_to_fixed(1000)));
3144
3145
3146
3147 calcs_output->stutter_exit_wm_ns[0].a_mark =
3148 bw_fixed_to_int(bw_mul(data->
3149 stutter_exit_watermark[4], bw_int_to_fixed(1000)));
3150 calcs_output->stutter_exit_wm_ns[1].a_mark =
3151 bw_fixed_to_int(bw_mul(data->
3152 stutter_exit_watermark[5], bw_int_to_fixed(1000)));
3153 calcs_output->stutter_exit_wm_ns[2].a_mark =
3154 bw_fixed_to_int(bw_mul(data->
3155 stutter_exit_watermark[6], bw_int_to_fixed(1000)));
3156 if (ctx->dc->caps.max_slave_planes) {
3157 calcs_output->stutter_exit_wm_ns[3].a_mark =
3158 bw_fixed_to_int(bw_mul(data->
3159 stutter_exit_watermark[0], bw_int_to_fixed(1000)));
3160 calcs_output->stutter_exit_wm_ns[4].a_mark =
3161 bw_fixed_to_int(bw_mul(data->
3162 stutter_exit_watermark[1], bw_int_to_fixed(1000)));
3163 } else {
3164 calcs_output->stutter_exit_wm_ns[3].a_mark =
3165 bw_fixed_to_int(bw_mul(data->
3166 stutter_exit_watermark[7], bw_int_to_fixed(1000)));
3167 calcs_output->stutter_exit_wm_ns[4].a_mark =
3168 bw_fixed_to_int(bw_mul(data->
3169 stutter_exit_watermark[8], bw_int_to_fixed(1000)));
3170 }
3171 calcs_output->stutter_exit_wm_ns[5].a_mark =
3172 bw_fixed_to_int(bw_mul(data->
3173 stutter_exit_watermark[9], bw_int_to_fixed(1000)));
3174
3175 calcs_output->stutter_entry_wm_ns[0].a_mark =
3176 bw_fixed_to_int(bw_mul(data->
3177 stutter_entry_watermark[4], bw_int_to_fixed(1000)));
3178 calcs_output->stutter_entry_wm_ns[1].a_mark =
3179 bw_fixed_to_int(bw_mul(data->
3180 stutter_entry_watermark[5], bw_int_to_fixed(1000)));
3181 calcs_output->stutter_entry_wm_ns[2].a_mark =
3182 bw_fixed_to_int(bw_mul(data->
3183 stutter_entry_watermark[6], bw_int_to_fixed(1000)));
3184 if (ctx->dc->caps.max_slave_planes) {
3185 calcs_output->stutter_entry_wm_ns[3].a_mark =
3186 bw_fixed_to_int(bw_mul(data->
3187 stutter_entry_watermark[0], bw_int_to_fixed(1000)));
3188 calcs_output->stutter_entry_wm_ns[4].a_mark =
3189 bw_fixed_to_int(bw_mul(data->
3190 stutter_entry_watermark[1], bw_int_to_fixed(1000)));
3191 } else {
3192 calcs_output->stutter_entry_wm_ns[3].a_mark =
3193 bw_fixed_to_int(bw_mul(data->
3194 stutter_entry_watermark[7], bw_int_to_fixed(1000)));
3195 calcs_output->stutter_entry_wm_ns[4].a_mark =
3196 bw_fixed_to_int(bw_mul(data->
3197 stutter_entry_watermark[8], bw_int_to_fixed(1000)));
3198 }
3199 calcs_output->stutter_entry_wm_ns[5].a_mark =
3200 bw_fixed_to_int(bw_mul(data->
3201 stutter_entry_watermark[9], bw_int_to_fixed(1000)));
3202
3203 calcs_output->urgent_wm_ns[0].a_mark =
3204 bw_fixed_to_int(bw_mul(data->
3205 urgent_watermark[4], bw_int_to_fixed(1000)));
3206 calcs_output->urgent_wm_ns[1].a_mark =
3207 bw_fixed_to_int(bw_mul(data->
3208 urgent_watermark[5], bw_int_to_fixed(1000)));
3209 calcs_output->urgent_wm_ns[2].a_mark =
3210 bw_fixed_to_int(bw_mul(data->
3211 urgent_watermark[6], bw_int_to_fixed(1000)));
3212 if (ctx->dc->caps.max_slave_planes) {
3213 calcs_output->urgent_wm_ns[3].a_mark =
3214 bw_fixed_to_int(bw_mul(data->
3215 urgent_watermark[0], bw_int_to_fixed(1000)));
3216 calcs_output->urgent_wm_ns[4].a_mark =
3217 bw_fixed_to_int(bw_mul(data->
3218 urgent_watermark[1], bw_int_to_fixed(1000)));
3219 } else {
3220 calcs_output->urgent_wm_ns[3].a_mark =
3221 bw_fixed_to_int(bw_mul(data->
3222 urgent_watermark[7], bw_int_to_fixed(1000)));
3223 calcs_output->urgent_wm_ns[4].a_mark =
3224 bw_fixed_to_int(bw_mul(data->
3225 urgent_watermark[8], bw_int_to_fixed(1000)));
3226 }
3227 calcs_output->urgent_wm_ns[5].a_mark =
3228 bw_fixed_to_int(bw_mul(data->
3229 urgent_watermark[9], bw_int_to_fixed(1000)));
3230
3231 if (dceip->version != BW_CALCS_VERSION_CARRIZO) {
3232 ((struct bw_calcs_vbios *)vbios)->low_sclk = mid3_sclk;
3233 ((struct bw_calcs_vbios *)vbios)->mid1_sclk = mid3_sclk;
3234 ((struct bw_calcs_vbios *)vbios)->mid2_sclk = mid3_sclk;
3235 calculate_bandwidth(dceip, vbios, data);
3236
3237 calcs_output->nbp_state_change_wm_ns[0].b_mark =
3238 bw_fixed_to_int(bw_mul(data->
3239 nbp_state_change_watermark[4],bw_int_to_fixed(1000)));
3240 calcs_output->nbp_state_change_wm_ns[1].b_mark =
3241 bw_fixed_to_int(bw_mul(data->
3242 nbp_state_change_watermark[5], bw_int_to_fixed(1000)));
3243 calcs_output->nbp_state_change_wm_ns[2].b_mark =
3244 bw_fixed_to_int(bw_mul(data->
3245 nbp_state_change_watermark[6], bw_int_to_fixed(1000)));
3246
3247 if (ctx->dc->caps.max_slave_planes) {
3248 calcs_output->nbp_state_change_wm_ns[3].b_mark =
3249 bw_fixed_to_int(bw_mul(data->
3250 nbp_state_change_watermark[0], bw_int_to_fixed(1000)));
3251 calcs_output->nbp_state_change_wm_ns[4].b_mark =
3252 bw_fixed_to_int(bw_mul(data->
3253 nbp_state_change_watermark[1], bw_int_to_fixed(1000)));
3254 } else {
3255 calcs_output->nbp_state_change_wm_ns[3].b_mark =
3256 bw_fixed_to_int(bw_mul(data->
3257 nbp_state_change_watermark[7], bw_int_to_fixed(1000)));
3258 calcs_output->nbp_state_change_wm_ns[4].b_mark =
3259 bw_fixed_to_int(bw_mul(data->
3260 nbp_state_change_watermark[8], bw_int_to_fixed(1000)));
3261 }
3262 calcs_output->nbp_state_change_wm_ns[5].b_mark =
3263 bw_fixed_to_int(bw_mul(data->
3264 nbp_state_change_watermark[9], bw_int_to_fixed(1000)));
3265
3266
3267
3268 calcs_output->stutter_exit_wm_ns[0].b_mark =
3269 bw_fixed_to_int(bw_mul(data->
3270 stutter_exit_watermark[4], bw_int_to_fixed(1000)));
3271 calcs_output->stutter_exit_wm_ns[1].b_mark =
3272 bw_fixed_to_int(bw_mul(data->
3273 stutter_exit_watermark[5], bw_int_to_fixed(1000)));
3274 calcs_output->stutter_exit_wm_ns[2].b_mark =
3275 bw_fixed_to_int(bw_mul(data->
3276 stutter_exit_watermark[6], bw_int_to_fixed(1000)));
3277 if (ctx->dc->caps.max_slave_planes) {
3278 calcs_output->stutter_exit_wm_ns[3].b_mark =
3279 bw_fixed_to_int(bw_mul(data->
3280 stutter_exit_watermark[0], bw_int_to_fixed(1000)));
3281 calcs_output->stutter_exit_wm_ns[4].b_mark =
3282 bw_fixed_to_int(bw_mul(data->
3283 stutter_exit_watermark[1], bw_int_to_fixed(1000)));
3284 } else {
3285 calcs_output->stutter_exit_wm_ns[3].b_mark =
3286 bw_fixed_to_int(bw_mul(data->
3287 stutter_exit_watermark[7], bw_int_to_fixed(1000)));
3288 calcs_output->stutter_exit_wm_ns[4].b_mark =
3289 bw_fixed_to_int(bw_mul(data->
3290 stutter_exit_watermark[8], bw_int_to_fixed(1000)));
3291 }
3292 calcs_output->stutter_exit_wm_ns[5].b_mark =
3293 bw_fixed_to_int(bw_mul(data->
3294 stutter_exit_watermark[9], bw_int_to_fixed(1000)));
3295
3296 calcs_output->stutter_entry_wm_ns[0].b_mark =
3297 bw_fixed_to_int(bw_mul(data->
3298 stutter_entry_watermark[4], bw_int_to_fixed(1000)));
3299 calcs_output->stutter_entry_wm_ns[1].b_mark =
3300 bw_fixed_to_int(bw_mul(data->
3301 stutter_entry_watermark[5], bw_int_to_fixed(1000)));
3302 calcs_output->stutter_entry_wm_ns[2].b_mark =
3303 bw_fixed_to_int(bw_mul(data->
3304 stutter_entry_watermark[6], bw_int_to_fixed(1000)));
3305 if (ctx->dc->caps.max_slave_planes) {
3306 calcs_output->stutter_entry_wm_ns[3].b_mark =
3307 bw_fixed_to_int(bw_mul(data->
3308 stutter_entry_watermark[0], bw_int_to_fixed(1000)));
3309 calcs_output->stutter_entry_wm_ns[4].b_mark =
3310 bw_fixed_to_int(bw_mul(data->
3311 stutter_entry_watermark[1], bw_int_to_fixed(1000)));
3312 } else {
3313 calcs_output->stutter_entry_wm_ns[3].b_mark =
3314 bw_fixed_to_int(bw_mul(data->
3315 stutter_entry_watermark[7], bw_int_to_fixed(1000)));
3316 calcs_output->stutter_entry_wm_ns[4].b_mark =
3317 bw_fixed_to_int(bw_mul(data->
3318 stutter_entry_watermark[8], bw_int_to_fixed(1000)));
3319 }
3320 calcs_output->stutter_entry_wm_ns[5].b_mark =
3321 bw_fixed_to_int(bw_mul(data->
3322 stutter_entry_watermark[9], bw_int_to_fixed(1000)));
3323
3324 calcs_output->urgent_wm_ns[0].b_mark =
3325 bw_fixed_to_int(bw_mul(data->
3326 urgent_watermark[4], bw_int_to_fixed(1000)));
3327 calcs_output->urgent_wm_ns[1].b_mark =
3328 bw_fixed_to_int(bw_mul(data->
3329 urgent_watermark[5], bw_int_to_fixed(1000)));
3330 calcs_output->urgent_wm_ns[2].b_mark =
3331 bw_fixed_to_int(bw_mul(data->
3332 urgent_watermark[6], bw_int_to_fixed(1000)));
3333 if (ctx->dc->caps.max_slave_planes) {
3334 calcs_output->urgent_wm_ns[3].b_mark =
3335 bw_fixed_to_int(bw_mul(data->
3336 urgent_watermark[0], bw_int_to_fixed(1000)));
3337 calcs_output->urgent_wm_ns[4].b_mark =
3338 bw_fixed_to_int(bw_mul(data->
3339 urgent_watermark[1], bw_int_to_fixed(1000)));
3340 } else {
3341 calcs_output->urgent_wm_ns[3].b_mark =
3342 bw_fixed_to_int(bw_mul(data->
3343 urgent_watermark[7], bw_int_to_fixed(1000)));
3344 calcs_output->urgent_wm_ns[4].b_mark =
3345 bw_fixed_to_int(bw_mul(data->
3346 urgent_watermark[8], bw_int_to_fixed(1000)));
3347 }
3348 calcs_output->urgent_wm_ns[5].b_mark =
3349 bw_fixed_to_int(bw_mul(data->
3350 urgent_watermark[9], bw_int_to_fixed(1000)));
3351
3352 ((struct bw_calcs_vbios *)vbios)->low_sclk = low_sclk;
3353 ((struct bw_calcs_vbios *)vbios)->mid1_sclk = mid1_sclk;
3354 ((struct bw_calcs_vbios *)vbios)->mid2_sclk = mid2_sclk;
3355 ((struct bw_calcs_vbios *)vbios)->low_yclk = mid_yclk;
3356 calculate_bandwidth(dceip, vbios, data);
3357
3358 calcs_output->nbp_state_change_wm_ns[0].c_mark =
3359 bw_fixed_to_int(bw_mul(data->
3360 nbp_state_change_watermark[4], bw_int_to_fixed(1000)));
3361 calcs_output->nbp_state_change_wm_ns[1].c_mark =
3362 bw_fixed_to_int(bw_mul(data->
3363 nbp_state_change_watermark[5], bw_int_to_fixed(1000)));
3364 calcs_output->nbp_state_change_wm_ns[2].c_mark =
3365 bw_fixed_to_int(bw_mul(data->
3366 nbp_state_change_watermark[6], bw_int_to_fixed(1000)));
3367 if (ctx->dc->caps.max_slave_planes) {
3368 calcs_output->nbp_state_change_wm_ns[3].c_mark =
3369 bw_fixed_to_int(bw_mul(data->
3370 nbp_state_change_watermark[0], bw_int_to_fixed(1000)));
3371 calcs_output->nbp_state_change_wm_ns[4].c_mark =
3372 bw_fixed_to_int(bw_mul(data->
3373 nbp_state_change_watermark[1], bw_int_to_fixed(1000)));
3374 } else {
3375 calcs_output->nbp_state_change_wm_ns[3].c_mark =
3376 bw_fixed_to_int(bw_mul(data->
3377 nbp_state_change_watermark[7], bw_int_to_fixed(1000)));
3378 calcs_output->nbp_state_change_wm_ns[4].c_mark =
3379 bw_fixed_to_int(bw_mul(data->
3380 nbp_state_change_watermark[8], bw_int_to_fixed(1000)));
3381 }
3382 calcs_output->nbp_state_change_wm_ns[5].c_mark =
3383 bw_fixed_to_int(bw_mul(data->
3384 nbp_state_change_watermark[9], bw_int_to_fixed(1000)));
3385
3386
3387 calcs_output->stutter_exit_wm_ns[0].c_mark =
3388 bw_fixed_to_int(bw_mul(data->
3389 stutter_exit_watermark[4], bw_int_to_fixed(1000)));
3390 calcs_output->stutter_exit_wm_ns[1].c_mark =
3391 bw_fixed_to_int(bw_mul(data->
3392 stutter_exit_watermark[5], bw_int_to_fixed(1000)));
3393 calcs_output->stutter_exit_wm_ns[2].c_mark =
3394 bw_fixed_to_int(bw_mul(data->
3395 stutter_exit_watermark[6], bw_int_to_fixed(1000)));
3396 if (ctx->dc->caps.max_slave_planes) {
3397 calcs_output->stutter_exit_wm_ns[3].c_mark =
3398 bw_fixed_to_int(bw_mul(data->
3399 stutter_exit_watermark[0], bw_int_to_fixed(1000)));
3400 calcs_output->stutter_exit_wm_ns[4].c_mark =
3401 bw_fixed_to_int(bw_mul(data->
3402 stutter_exit_watermark[1], bw_int_to_fixed(1000)));
3403 } else {
3404 calcs_output->stutter_exit_wm_ns[3].c_mark =
3405 bw_fixed_to_int(bw_mul(data->
3406 stutter_exit_watermark[7], bw_int_to_fixed(1000)));
3407 calcs_output->stutter_exit_wm_ns[4].c_mark =
3408 bw_fixed_to_int(bw_mul(data->
3409 stutter_exit_watermark[8], bw_int_to_fixed(1000)));
3410 }
3411 calcs_output->stutter_exit_wm_ns[5].c_mark =
3412 bw_fixed_to_int(bw_mul(data->
3413 stutter_exit_watermark[9], bw_int_to_fixed(1000)));
3414 calcs_output->stutter_entry_wm_ns[0].c_mark =
3415 bw_fixed_to_int(bw_mul(data->
3416 stutter_entry_watermark[4], bw_int_to_fixed(1000)));
3417 calcs_output->stutter_entry_wm_ns[1].c_mark =
3418 bw_fixed_to_int(bw_mul(data->
3419 stutter_entry_watermark[5], bw_int_to_fixed(1000)));
3420 calcs_output->stutter_entry_wm_ns[2].c_mark =
3421 bw_fixed_to_int(bw_mul(data->
3422 stutter_entry_watermark[6], bw_int_to_fixed(1000)));
3423 if (ctx->dc->caps.max_slave_planes) {
3424 calcs_output->stutter_entry_wm_ns[3].c_mark =
3425 bw_fixed_to_int(bw_mul(data->stutter_entry_watermark[0],
3426 bw_int_to_fixed(1000)));
3427 calcs_output->stutter_entry_wm_ns[4].c_mark =
3428 bw_fixed_to_int(bw_mul(data->stutter_entry_watermark[1],
3429 bw_int_to_fixed(1000)));
3430 } else {
3431 calcs_output->stutter_entry_wm_ns[3].c_mark =
3432 bw_fixed_to_int(bw_mul(data->stutter_entry_watermark[7],
3433 bw_int_to_fixed(1000)));
3434 calcs_output->stutter_entry_wm_ns[4].c_mark =
3435 bw_fixed_to_int(bw_mul(data->stutter_entry_watermark[8],
3436 bw_int_to_fixed(1000)));
3437 }
3438 calcs_output->stutter_entry_wm_ns[5].c_mark =
3439 bw_fixed_to_int(bw_mul(data->
3440 stutter_entry_watermark[9], bw_int_to_fixed(1000)));
3441 calcs_output->urgent_wm_ns[0].c_mark =
3442 bw_fixed_to_int(bw_mul(data->
3443 urgent_watermark[4], bw_int_to_fixed(1000)));
3444 calcs_output->urgent_wm_ns[1].c_mark =
3445 bw_fixed_to_int(bw_mul(data->
3446 urgent_watermark[5], bw_int_to_fixed(1000)));
3447 calcs_output->urgent_wm_ns[2].c_mark =
3448 bw_fixed_to_int(bw_mul(data->
3449 urgent_watermark[6], bw_int_to_fixed(1000)));
3450 if (ctx->dc->caps.max_slave_planes) {
3451 calcs_output->urgent_wm_ns[3].c_mark =
3452 bw_fixed_to_int(bw_mul(data->
3453 urgent_watermark[0], bw_int_to_fixed(1000)));
3454 calcs_output->urgent_wm_ns[4].c_mark =
3455 bw_fixed_to_int(bw_mul(data->
3456 urgent_watermark[1], bw_int_to_fixed(1000)));
3457 } else {
3458 calcs_output->urgent_wm_ns[3].c_mark =
3459 bw_fixed_to_int(bw_mul(data->
3460 urgent_watermark[7], bw_int_to_fixed(1000)));
3461 calcs_output->urgent_wm_ns[4].c_mark =
3462 bw_fixed_to_int(bw_mul(data->
3463 urgent_watermark[8], bw_int_to_fixed(1000)));
3464 }
3465 calcs_output->urgent_wm_ns[5].c_mark =
3466 bw_fixed_to_int(bw_mul(data->
3467 urgent_watermark[9], bw_int_to_fixed(1000)));
3468 }
3469
3470 if (dceip->version == BW_CALCS_VERSION_CARRIZO) {
3471 ((struct bw_calcs_vbios *)vbios)->low_yclk = high_yclk;
3472 ((struct bw_calcs_vbios *)vbios)->mid_yclk = high_yclk;
3473 ((struct bw_calcs_vbios *)vbios)->low_sclk = high_sclk;
3474 ((struct bw_calcs_vbios *)vbios)->mid1_sclk = high_sclk;
3475 ((struct bw_calcs_vbios *)vbios)->mid2_sclk = high_sclk;
3476 ((struct bw_calcs_vbios *)vbios)->mid3_sclk = high_sclk;
3477 ((struct bw_calcs_vbios *)vbios)->mid4_sclk = high_sclk;
3478 ((struct bw_calcs_vbios *)vbios)->mid5_sclk = high_sclk;
3479 ((struct bw_calcs_vbios *)vbios)->mid6_sclk = high_sclk;
3480 } else {
3481 ((struct bw_calcs_vbios *)vbios)->low_yclk = mid_yclk;
3482 ((struct bw_calcs_vbios *)vbios)->low_sclk = mid3_sclk;
3483 ((struct bw_calcs_vbios *)vbios)->mid1_sclk = mid3_sclk;
3484 ((struct bw_calcs_vbios *)vbios)->mid2_sclk = mid3_sclk;
3485 }
3486
3487 calculate_bandwidth(dceip, vbios, data);
3488
3489 calcs_output->nbp_state_change_wm_ns[0].d_mark =
3490 bw_fixed_to_int(bw_mul(data->
3491 nbp_state_change_watermark[4], bw_int_to_fixed(1000)));
3492 calcs_output->nbp_state_change_wm_ns[1].d_mark =
3493 bw_fixed_to_int(bw_mul(data->
3494 nbp_state_change_watermark[5], bw_int_to_fixed(1000)));
3495 calcs_output->nbp_state_change_wm_ns[2].d_mark =
3496 bw_fixed_to_int(bw_mul(data->
3497 nbp_state_change_watermark[6], bw_int_to_fixed(1000)));
3498 if (ctx->dc->caps.max_slave_planes) {
3499 calcs_output->nbp_state_change_wm_ns[3].d_mark =
3500 bw_fixed_to_int(bw_mul(data->
3501 nbp_state_change_watermark[0], bw_int_to_fixed(1000)));
3502 calcs_output->nbp_state_change_wm_ns[4].d_mark =
3503 bw_fixed_to_int(bw_mul(data->
3504 nbp_state_change_watermark[1], bw_int_to_fixed(1000)));
3505 } else {
3506 calcs_output->nbp_state_change_wm_ns[3].d_mark =
3507 bw_fixed_to_int(bw_mul(data->
3508 nbp_state_change_watermark[7], bw_int_to_fixed(1000)));
3509 calcs_output->nbp_state_change_wm_ns[4].d_mark =
3510 bw_fixed_to_int(bw_mul(data->
3511 nbp_state_change_watermark[8], bw_int_to_fixed(1000)));
3512 }
3513 calcs_output->nbp_state_change_wm_ns[5].d_mark =
3514 bw_fixed_to_int(bw_mul(data->
3515 nbp_state_change_watermark[9], bw_int_to_fixed(1000)));
3516
3517 calcs_output->stutter_exit_wm_ns[0].d_mark =
3518 bw_fixed_to_int(bw_mul(data->
3519 stutter_exit_watermark[4], bw_int_to_fixed(1000)));
3520 calcs_output->stutter_exit_wm_ns[1].d_mark =
3521 bw_fixed_to_int(bw_mul(data->
3522 stutter_exit_watermark[5], bw_int_to_fixed(1000)));
3523 calcs_output->stutter_exit_wm_ns[2].d_mark =
3524 bw_fixed_to_int(bw_mul(data->
3525 stutter_exit_watermark[6], bw_int_to_fixed(1000)));
3526 if (ctx->dc->caps.max_slave_planes) {
3527 calcs_output->stutter_exit_wm_ns[3].d_mark =
3528 bw_fixed_to_int(bw_mul(data->
3529 stutter_exit_watermark[0], bw_int_to_fixed(1000)));
3530 calcs_output->stutter_exit_wm_ns[4].d_mark =
3531 bw_fixed_to_int(bw_mul(data->
3532 stutter_exit_watermark[1], bw_int_to_fixed(1000)));
3533 } else {
3534 calcs_output->stutter_exit_wm_ns[3].d_mark =
3535 bw_fixed_to_int(bw_mul(data->
3536 stutter_exit_watermark[7], bw_int_to_fixed(1000)));
3537 calcs_output->stutter_exit_wm_ns[4].d_mark =
3538 bw_fixed_to_int(bw_mul(data->
3539 stutter_exit_watermark[8], bw_int_to_fixed(1000)));
3540 }
3541 calcs_output->stutter_exit_wm_ns[5].d_mark =
3542 bw_fixed_to_int(bw_mul(data->
3543 stutter_exit_watermark[9], bw_int_to_fixed(1000)));
3544
3545 calcs_output->stutter_entry_wm_ns[0].d_mark =
3546 bw_fixed_to_int(bw_mul(data->
3547 stutter_entry_watermark[4], bw_int_to_fixed(1000)));
3548 calcs_output->stutter_entry_wm_ns[1].d_mark =
3549 bw_fixed_to_int(bw_mul(data->
3550 stutter_entry_watermark[5], bw_int_to_fixed(1000)));
3551 calcs_output->stutter_entry_wm_ns[2].d_mark =
3552 bw_fixed_to_int(bw_mul(data->
3553 stutter_entry_watermark[6], bw_int_to_fixed(1000)));
3554 if (ctx->dc->caps.max_slave_planes) {
3555 calcs_output->stutter_entry_wm_ns[3].d_mark =
3556 bw_fixed_to_int(bw_mul(data->
3557 stutter_entry_watermark[0], bw_int_to_fixed(1000)));
3558 calcs_output->stutter_entry_wm_ns[4].d_mark =
3559 bw_fixed_to_int(bw_mul(data->
3560 stutter_entry_watermark[1], bw_int_to_fixed(1000)));
3561 } else {
3562 calcs_output->stutter_entry_wm_ns[3].d_mark =
3563 bw_fixed_to_int(bw_mul(data->
3564 stutter_entry_watermark[7], bw_int_to_fixed(1000)));
3565 calcs_output->stutter_entry_wm_ns[4].d_mark =
3566 bw_fixed_to_int(bw_mul(data->
3567 stutter_entry_watermark[8], bw_int_to_fixed(1000)));
3568 }
3569 calcs_output->stutter_entry_wm_ns[5].d_mark =
3570 bw_fixed_to_int(bw_mul(data->
3571 stutter_entry_watermark[9], bw_int_to_fixed(1000)));
3572
3573 calcs_output->urgent_wm_ns[0].d_mark =
3574 bw_fixed_to_int(bw_mul(data->
3575 urgent_watermark[4], bw_int_to_fixed(1000)));
3576 calcs_output->urgent_wm_ns[1].d_mark =
3577 bw_fixed_to_int(bw_mul(data->
3578 urgent_watermark[5], bw_int_to_fixed(1000)));
3579 calcs_output->urgent_wm_ns[2].d_mark =
3580 bw_fixed_to_int(bw_mul(data->
3581 urgent_watermark[6], bw_int_to_fixed(1000)));
3582 if (ctx->dc->caps.max_slave_planes) {
3583 calcs_output->urgent_wm_ns[3].d_mark =
3584 bw_fixed_to_int(bw_mul(data->
3585 urgent_watermark[0], bw_int_to_fixed(1000)));
3586 calcs_output->urgent_wm_ns[4].d_mark =
3587 bw_fixed_to_int(bw_mul(data->
3588 urgent_watermark[1], bw_int_to_fixed(1000)));
3589 } else {
3590 calcs_output->urgent_wm_ns[3].d_mark =
3591 bw_fixed_to_int(bw_mul(data->
3592 urgent_watermark[7], bw_int_to_fixed(1000)));
3593 calcs_output->urgent_wm_ns[4].d_mark =
3594 bw_fixed_to_int(bw_mul(data->
3595 urgent_watermark[8], bw_int_to_fixed(1000)));
3596 }
3597 calcs_output->urgent_wm_ns[5].d_mark =
3598 bw_fixed_to_int(bw_mul(data->
3599 urgent_watermark[9], bw_int_to_fixed(1000)));
3600
3601 ((struct bw_calcs_vbios *)vbios)->low_yclk = low_yclk;
3602 ((struct bw_calcs_vbios *)vbios)->mid_yclk = mid_yclk;
3603 ((struct bw_calcs_vbios *)vbios)->low_sclk = low_sclk;
3604 ((struct bw_calcs_vbios *)vbios)->mid1_sclk = mid1_sclk;
3605 ((struct bw_calcs_vbios *)vbios)->mid2_sclk = mid2_sclk;
3606 ((struct bw_calcs_vbios *)vbios)->mid3_sclk = mid3_sclk;
3607 ((struct bw_calcs_vbios *)vbios)->mid4_sclk = mid4_sclk;
3608 ((struct bw_calcs_vbios *)vbios)->mid5_sclk = mid5_sclk;
3609 ((struct bw_calcs_vbios *)vbios)->mid6_sclk = mid6_sclk;
3610 ((struct bw_calcs_vbios *)vbios)->high_sclk = high_sclk;
3611 } else {
3612 calcs_output->nbp_state_change_enable = true;
3613 calcs_output->cpuc_state_change_enable = true;
3614 calcs_output->cpup_state_change_enable = true;
3615 calcs_output->stutter_mode_enable = true;
3616 calcs_output->dispclk_khz = 0;
3617 calcs_output->sclk_khz = 0;
3618 }
3619
3620 kfree(data);
3621
3622 return is_display_configuration_supported(vbios, calcs_output);
3623 }