1/* 2 * Copyright 2022 Advanced Micro Devices, Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * Authors: AMD 23 * 24 */ 25 26/* FILE POLICY AND INTENDED USAGE: 27 * This file implements retrieval and configuration of eDP panel features such 28 * as PSR and ABM and it also manages specs defined eDP panel power sequences. 29 */ 30 31#include "link_edp_panel_control.h" 32#include "link_dpcd.h" 33#include "link_dp_capability.h" 34#include "dm_helpers.h" 35#include "dal_asic_id.h" 36#include "link_dp_phy.h" 37#include "dce/dmub_psr.h" 38#include "dc/dc_dmub_srv.h" 39#include "dce/dmub_replay.h" 40#include "abm.h" 41#define DC_LOGGER_INIT(logger) 42 43#define DP_SINK_PR_ENABLE_AND_CONFIGURATION 0x37B 44 45/* Travis */ 46static const uint8_t DP_VGA_LVDS_CONVERTER_ID_2[] = "sivarT"; 47/* Nutmeg */ 48static const uint8_t DP_VGA_LVDS_CONVERTER_ID_3[] = "dnomlA"; 49 50void dp_set_panel_mode(struct dc_link *link, enum dp_panel_mode panel_mode) 51{ 52 union dpcd_edp_config edp_config_set; 53 bool panel_mode_edp = false; 54 enum dc_status result; 55 56 memset(&edp_config_set, '\0', sizeof(union dpcd_edp_config)); 57 58 switch (panel_mode) { 59 case DP_PANEL_MODE_EDP: 60 case DP_PANEL_MODE_SPECIAL: 61 panel_mode_edp = true; 62 break; 63 64 default: 65 break; 66 } 67 68 /*set edp panel mode in receiver*/ 69 result = core_link_read_dpcd( 70 link, 71 DP_EDP_CONFIGURATION_SET, 72 &edp_config_set.raw, 73 sizeof(edp_config_set.raw)); 74 75 if (result == DC_OK && 76 edp_config_set.bits.PANEL_MODE_EDP 77 != panel_mode_edp) { 78 79 edp_config_set.bits.PANEL_MODE_EDP = 80 panel_mode_edp; 81 result = core_link_write_dpcd( 82 link, 83 DP_EDP_CONFIGURATION_SET, 84 &edp_config_set.raw, 85 sizeof(edp_config_set.raw)); 86 87 ASSERT(result == DC_OK); 88 } 89 90 link->panel_mode = panel_mode; 91 DC_LOG_DETECTION_DP_CAPS("Link: %d eDP panel mode supported: %d " 92 "eDP panel mode enabled: %d \n", 93 link->link_index, 94 link->dpcd_caps.panel_mode_edp, 95 panel_mode_edp); 96} 97 98enum dp_panel_mode dp_get_panel_mode(struct dc_link *link) 99{ 100 /* We need to explicitly check that connector 101 * is not DP. Some Travis_VGA get reported 102 * by video bios as DP. 103 */ 104 if (link->connector_signal != SIGNAL_TYPE_DISPLAY_PORT) { 105 106 switch (link->dpcd_caps.branch_dev_id) { 107 case DP_BRANCH_DEVICE_ID_0022B9: 108 /* alternate scrambler reset is required for Travis 109 * for the case when external chip does not 110 * provide sink device id, alternate scrambler 111 * scheme will be overriden later by querying 112 * Encoder features 113 */ 114 if (strncmp( 115 link->dpcd_caps.branch_dev_name, 116 DP_VGA_LVDS_CONVERTER_ID_2, 117 sizeof( 118 link->dpcd_caps. 119 branch_dev_name)) == 0) { 120 return DP_PANEL_MODE_SPECIAL; 121 } 122 break; 123 case DP_BRANCH_DEVICE_ID_00001A: 124 /* alternate scrambler reset is required for Travis 125 * for the case when external chip does not provide 126 * sink device id, alternate scrambler scheme will 127 * be overriden later by querying Encoder feature 128 */ 129 if (strncmp(link->dpcd_caps.branch_dev_name, 130 DP_VGA_LVDS_CONVERTER_ID_3, 131 sizeof( 132 link->dpcd_caps. 133 branch_dev_name)) == 0) { 134 return DP_PANEL_MODE_SPECIAL; 135 } 136 break; 137 default: 138 break; 139 } 140 } 141 142 if (link->dpcd_caps.panel_mode_edp && 143 (link->connector_signal == SIGNAL_TYPE_EDP || 144 (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT && 145 link->is_internal_display))) { 146 return DP_PANEL_MODE_EDP; 147 } 148 149 return DP_PANEL_MODE_DEFAULT; 150} 151 152bool edp_set_backlight_level_nits(struct dc_link *link, 153 bool isHDR, 154 uint32_t backlight_millinits, 155 uint32_t transition_time_in_ms) 156{ 157 struct dpcd_source_backlight_set dpcd_backlight_set; 158 uint8_t backlight_control = isHDR ? 1 : 0; 159 160 if (!link || (link->connector_signal != SIGNAL_TYPE_EDP && 161 link->connector_signal != SIGNAL_TYPE_DISPLAY_PORT)) 162 return false; 163 164 // OLEDs have no PWM, they can only use AUX 165 if (link->dpcd_sink_ext_caps.bits.oled == 1) 166 backlight_control = 1; 167 168 *(uint32_t *)&dpcd_backlight_set.backlight_level_millinits = backlight_millinits; 169 *(uint16_t *)&dpcd_backlight_set.backlight_transition_time_ms = (uint16_t)transition_time_in_ms; 170 171 172 if (!link->dpcd_caps.panel_luminance_control) { 173 if (core_link_write_dpcd(link, DP_SOURCE_BACKLIGHT_LEVEL, 174 (uint8_t *)(&dpcd_backlight_set), 175 sizeof(dpcd_backlight_set)) != DC_OK) 176 return false; 177 178 if (core_link_write_dpcd(link, DP_SOURCE_BACKLIGHT_CONTROL, 179 &backlight_control, 1) != DC_OK) 180 return false; 181 } else { 182 const uint8_t backlight_enable = DP_EDP_PANEL_LUMINANCE_CONTROL_ENABLE; 183 struct target_luminance_value *target_luminance = NULL; 184 185 //if target luminance value is greater than 24 bits, clip the value to 24 bits 186 if (backlight_millinits > 0xFFFFFF) 187 backlight_millinits = 0xFFFFFF; 188 189 target_luminance = (struct target_luminance_value *)&backlight_millinits; 190 191 if (core_link_write_dpcd(link, DP_EDP_BACKLIGHT_MODE_SET_REGISTER, 192 &backlight_enable, 193 sizeof(backlight_enable)) != DC_OK) 194 return false; 195 196 if (core_link_write_dpcd(link, DP_EDP_PANEL_TARGET_LUMINANCE_VALUE, 197 (uint8_t *)(target_luminance), 198 sizeof(struct target_luminance_value)) != DC_OK) 199 return false; 200 } 201 202 return true; 203} 204 205bool edp_get_backlight_level_nits(struct dc_link *link, 206 uint32_t *backlight_millinits_avg, 207 uint32_t *backlight_millinits_peak) 208{ 209 union dpcd_source_backlight_get dpcd_backlight_get; 210 211 memset(&dpcd_backlight_get, 0, sizeof(union dpcd_source_backlight_get)); 212 213 if (!link || (link->connector_signal != SIGNAL_TYPE_EDP && 214 link->connector_signal != SIGNAL_TYPE_DISPLAY_PORT)) 215 return false; 216 217 if (!core_link_read_dpcd(link, DP_SOURCE_BACKLIGHT_CURRENT_PEAK, 218 dpcd_backlight_get.raw, 219 sizeof(union dpcd_source_backlight_get))) 220 return false; 221 222 *backlight_millinits_avg = 223 dpcd_backlight_get.bytes.backlight_millinits_avg; 224 *backlight_millinits_peak = 225 dpcd_backlight_get.bytes.backlight_millinits_peak; 226 227 /* On non-supported panels dpcd_read usually succeeds with 0 returned */ 228 if (*backlight_millinits_avg == 0 || 229 *backlight_millinits_avg > *backlight_millinits_peak) 230 return false; 231 232 return true; 233} 234 235bool edp_backlight_enable_aux(struct dc_link *link, bool enable) 236{ 237 uint8_t backlight_enable = enable ? 1 : 0; 238 239 if (!link || (link->connector_signal != SIGNAL_TYPE_EDP && 240 link->connector_signal != SIGNAL_TYPE_DISPLAY_PORT)) 241 return false; 242 243 if (core_link_write_dpcd(link, DP_SOURCE_BACKLIGHT_ENABLE, 244 &backlight_enable, 1) != DC_OK) 245 return false; 246 247 return true; 248} 249 250// we read default from 0x320 because we expect BIOS wrote it there 251// regular get_backlight_nit reads from panel set at 0x326 252static bool read_default_bl_aux(struct dc_link *link, uint32_t *backlight_millinits) 253{ 254 if (!link || (link->connector_signal != SIGNAL_TYPE_EDP && 255 link->connector_signal != SIGNAL_TYPE_DISPLAY_PORT)) 256 return false; 257 258 if (!link->dpcd_caps.panel_luminance_control) { 259 if (!core_link_read_dpcd(link, DP_SOURCE_BACKLIGHT_LEVEL, 260 (uint8_t *)backlight_millinits, 261 sizeof(uint32_t))) 262 return false; 263 } else { 264 //setting to 0 as a precaution, since target_luminance_value is 3 bytes 265 memset(backlight_millinits, 0, sizeof(uint32_t)); 266 267 if (!core_link_read_dpcd(link, DP_EDP_PANEL_TARGET_LUMINANCE_VALUE, 268 (uint8_t *)backlight_millinits, 269 sizeof(struct target_luminance_value))) 270 return false; 271 } 272 273 return true; 274} 275 276bool set_default_brightness_aux(struct dc_link *link) 277{ 278 uint32_t default_backlight; 279 280 if (link && link->dpcd_sink_ext_caps.bits.oled == 1) { 281 if (!read_default_bl_aux(link, &default_backlight)) 282 default_backlight = 150000; 283 // if < 1 nits or > 5000, it might be wrong readback 284 if (default_backlight < 1000 || default_backlight > 5000000) 285 default_backlight = 150000; 286 287 return edp_set_backlight_level_nits(link, true, 288 default_backlight, 0); 289 } 290 return false; 291} 292 293bool edp_is_ilr_optimization_enabled(struct dc_link *link) 294{ 295 if (link->dpcd_caps.edp_supported_link_rates_count == 0 || !link->panel_config.ilr.optimize_edp_link_rate) 296 return false; 297 return true; 298} 299 300enum dc_link_rate get_max_link_rate_from_ilr_table(struct dc_link *link) 301{ 302 enum dc_link_rate link_rate = link->reported_link_cap.link_rate; 303 304 for (int i = 0; i < link->dpcd_caps.edp_supported_link_rates_count; i++) { 305 if (link_rate < link->dpcd_caps.edp_supported_link_rates[i]) 306 link_rate = link->dpcd_caps.edp_supported_link_rates[i]; 307 } 308 309 return link_rate; 310} 311 312bool edp_is_ilr_optimization_required(struct dc_link *link, 313 struct dc_crtc_timing *crtc_timing) 314{ 315 struct dc_link_settings link_setting; 316 uint8_t link_bw_set; 317 uint8_t link_rate_set; 318 uint32_t req_bw; 319 union lane_count_set lane_count_set = {0}; 320 321 ASSERT(link || crtc_timing); // invalid input 322 323 if (!edp_is_ilr_optimization_enabled(link)) 324 return false; 325 326 327 // Read DPCD 00100h to find if standard link rates are set 328 core_link_read_dpcd(link, DP_LINK_BW_SET, 329 &link_bw_set, sizeof(link_bw_set)); 330 331 if (link_bw_set) { 332 DC_LOG_EVENT_LINK_TRAINING("eDP ILR: Optimization required, VBIOS used link_bw_set\n"); 333 return true; 334 } 335 336 // Read DPCD 00115h to find the edp link rate set used 337 core_link_read_dpcd(link, DP_LINK_RATE_SET, 338 &link_rate_set, sizeof(link_rate_set)); 339 340 // Read DPCD 00101h to find out the number of lanes currently set 341 core_link_read_dpcd(link, DP_LANE_COUNT_SET, 342 &lane_count_set.raw, sizeof(lane_count_set)); 343 344 req_bw = dc_bandwidth_in_kbps_from_timing(crtc_timing, dc_link_get_highest_encoding_format(link)); 345 346 if (!crtc_timing->flags.DSC) 347 edp_decide_link_settings(link, &link_setting, req_bw); 348 else 349 decide_edp_link_settings_with_dsc(link, &link_setting, req_bw, LINK_RATE_UNKNOWN); 350 351 if (link->dpcd_caps.edp_supported_link_rates[link_rate_set] != link_setting.link_rate || 352 lane_count_set.bits.LANE_COUNT_SET != link_setting.lane_count) { 353 DC_LOG_EVENT_LINK_TRAINING("eDP ILR: Optimization required, VBIOS link_rate_set not optimal\n"); 354 return true; 355 } 356 357 DC_LOG_EVENT_LINK_TRAINING("eDP ILR: No optimization required, VBIOS set optimal link_rate_set\n"); 358 return false; 359} 360 361void edp_panel_backlight_power_on(struct dc_link *link, bool wait_for_hpd) 362{ 363 if (link->connector_signal != SIGNAL_TYPE_EDP) 364 return; 365 366 link->dc->hwss.edp_power_control(link, true); 367 if (wait_for_hpd) 368 link->dc->hwss.edp_wait_for_hpd_ready(link, true); 369 if (link->dc->hwss.edp_backlight_control) 370 link->dc->hwss.edp_backlight_control(link, true); 371} 372 373void edp_set_panel_power(struct dc_link *link, bool powerOn) 374{ 375 if (powerOn) { 376 // 1. panel VDD on 377 if (!link->dc->config.edp_no_power_sequencing) 378 link->dc->hwss.edp_power_control(link, true); 379 link->dc->hwss.edp_wait_for_hpd_ready(link, true); 380 381 // 2. panel BL on 382 if (link->dc->hwss.edp_backlight_control) 383 link->dc->hwss.edp_backlight_control(link, true); 384 385 // 3. Rx power on 386 dpcd_write_rx_power_ctrl(link, true); 387 } else { 388 // 3. Rx power off 389 dpcd_write_rx_power_ctrl(link, false); 390 391 // 2. panel BL off 392 if (link->dc->hwss.edp_backlight_control) 393 link->dc->hwss.edp_backlight_control(link, false); 394 395 // 1. panel VDD off 396 if (!link->dc->config.edp_no_power_sequencing) 397 link->dc->hwss.edp_power_control(link, false); 398 } 399} 400 401bool edp_wait_for_t12(struct dc_link *link) 402{ 403 if (link->connector_signal == SIGNAL_TYPE_EDP && link->dc->hwss.edp_wait_for_T12) { 404 link->dc->hwss.edp_wait_for_T12(link); 405 406 return true; 407 } 408 409 return false; 410} 411 412void edp_add_delay_for_T9(struct dc_link *link) 413{ 414 if (link && link->panel_config.pps.extra_delay_backlight_off > 0) 415 fsleep(link->panel_config.pps.extra_delay_backlight_off * 1000); 416} 417 418bool edp_receiver_ready_T9(struct dc_link *link) 419{ 420 unsigned int tries = 0; 421 unsigned char sinkstatus = 0; 422 unsigned char edpRev = 0; 423 enum dc_status result = DC_OK; 424 425 result = core_link_read_dpcd(link, DP_EDP_DPCD_REV, &edpRev, sizeof(edpRev)); 426 427 /* start from eDP version 1.2, SINK_STAUS indicate the sink is ready.*/ 428 if (result == DC_OK && edpRev >= DP_EDP_12) { 429 do { 430 sinkstatus = 1; 431 result = core_link_read_dpcd(link, DP_SINK_STATUS, &sinkstatus, sizeof(sinkstatus)); 432 if (sinkstatus == 0) 433 break; 434 if (result != DC_OK) 435 break; 436 udelay(100); //MAx T9 437 } while (++tries < 50); 438 } 439 440 return result; 441} 442 443bool edp_receiver_ready_T7(struct dc_link *link) 444{ 445 unsigned char sinkstatus = 0; 446 unsigned char edpRev = 0; 447 enum dc_status result = DC_OK; 448 449 /* use absolute time stamp to constrain max T7*/ 450 unsigned long long enter_timestamp = 0; 451 unsigned long long finish_timestamp = 0; 452 unsigned long long time_taken_in_ns = 0; 453 454 result = core_link_read_dpcd(link, DP_EDP_DPCD_REV, &edpRev, sizeof(edpRev)); 455 456 if (result == DC_OK && edpRev >= DP_EDP_12) { 457 /* start from eDP version 1.2, SINK_STAUS indicate the sink is ready.*/ 458 enter_timestamp = dm_get_timestamp(link->ctx); 459 do { 460 sinkstatus = 0; 461 result = core_link_read_dpcd(link, DP_SINK_STATUS, &sinkstatus, sizeof(sinkstatus)); 462 if (sinkstatus == 1) 463 break; 464 if (result != DC_OK) 465 break; 466 udelay(25); 467 finish_timestamp = dm_get_timestamp(link->ctx); 468 time_taken_in_ns = dm_get_elapse_time_in_ns(link->ctx, finish_timestamp, enter_timestamp); 469 } while (time_taken_in_ns < 50 * 1000000); //MAx T7 is 50ms 470 } 471 472 if (link && link->panel_config.pps.extra_t7_ms > 0) 473 fsleep(link->panel_config.pps.extra_t7_ms * 1000); 474 475 return result; 476} 477 478bool edp_power_alpm_dpcd_enable(struct dc_link *link, bool enable) 479{ 480 bool ret = false; 481 union dpcd_alpm_configuration alpm_config; 482 483 if (link->psr_settings.psr_version == DC_PSR_VERSION_SU_1) { 484 memset(&alpm_config, 0, sizeof(alpm_config)); 485 486 alpm_config.bits.ENABLE = (enable ? true : false); 487 ret = dm_helpers_dp_write_dpcd(link->ctx, link, 488 DP_RECEIVER_ALPM_CONFIG, &alpm_config.raw, 489 sizeof(alpm_config.raw)); 490 } 491 return ret; 492} 493 494static struct pipe_ctx *get_pipe_from_link(const struct dc_link *link) 495{ 496 int i; 497 struct dc *dc = link->ctx->dc; 498 struct pipe_ctx *pipe_ctx = NULL; 499 500 for (i = 0; i < MAX_PIPES; i++) { 501 if (dc->current_state->res_ctx.pipe_ctx[i].stream) { 502 if (dc->current_state->res_ctx.pipe_ctx[i].stream->link == link) { 503 pipe_ctx = &dc->current_state->res_ctx.pipe_ctx[i]; 504 break; 505 } 506 } 507 } 508 509 return pipe_ctx; 510} 511 512bool edp_set_backlight_level(const struct dc_link *link, 513 uint32_t backlight_pwm_u16_16, 514 uint32_t frame_ramp) 515{ 516 struct dc *dc = link->ctx->dc; 517 518 DC_LOGGER_INIT(link->ctx->logger); 519 DC_LOG_BACKLIGHT("New Backlight level: %d (0x%X)\n", 520 backlight_pwm_u16_16, backlight_pwm_u16_16); 521 522 if (dc_is_embedded_signal(link->connector_signal)) { 523 struct pipe_ctx *pipe_ctx = get_pipe_from_link(link); 524 525 if (pipe_ctx) { 526 /* Disable brightness ramping when the display is blanked 527 * as it can hang the DMCU 528 */ 529 if (pipe_ctx->plane_state == NULL) 530 frame_ramp = 0; 531 } else { 532 return false; 533 } 534 535 dc->hwss.set_backlight_level( 536 pipe_ctx, 537 backlight_pwm_u16_16, 538 frame_ramp); 539 } 540 return true; 541} 542 543bool edp_set_psr_allow_active(struct dc_link *link, const bool *allow_active, 544 bool wait, bool force_static, const unsigned int *power_opts) 545{ 546 struct dc *dc = link->ctx->dc; 547 struct dmcu *dmcu = dc->res_pool->dmcu; 548 struct dmub_psr *psr = dc->res_pool->psr; 549 unsigned int panel_inst; 550 551 if (psr == NULL && force_static) 552 return false; 553 554 if (!dc_get_edp_link_panel_inst(dc, link, &panel_inst)) 555 return false; 556 557 if ((allow_active != NULL) && (*allow_active == true) && (link->type == dc_connection_none)) { 558 // Don't enter PSR if panel is not connected 559 return false; 560 } 561 562 /* Set power optimization flag */ 563 if (power_opts && link->psr_settings.psr_power_opt != *power_opts) { 564 link->psr_settings.psr_power_opt = *power_opts; 565 566 if (psr != NULL && link->psr_settings.psr_feature_enabled && psr->funcs->psr_set_power_opt) 567 psr->funcs->psr_set_power_opt(psr, link->psr_settings.psr_power_opt, panel_inst); 568 } 569 570 if (psr != NULL && link->psr_settings.psr_feature_enabled && 571 force_static && psr->funcs->psr_force_static) 572 psr->funcs->psr_force_static(psr, panel_inst); 573 574 /* Enable or Disable PSR */ 575 if (allow_active && link->psr_settings.psr_allow_active != *allow_active) { 576 link->psr_settings.psr_allow_active = *allow_active; 577 578 if (!link->psr_settings.psr_allow_active) 579 dc_z10_restore(dc); 580 581 if (psr != NULL && link->psr_settings.psr_feature_enabled) { 582 psr->funcs->psr_enable(psr, link->psr_settings.psr_allow_active, wait, panel_inst); 583 } else if ((dmcu != NULL && dmcu->funcs->is_dmcu_initialized(dmcu)) && 584 link->psr_settings.psr_feature_enabled) 585 dmcu->funcs->set_psr_enable(dmcu, link->psr_settings.psr_allow_active, wait); 586 else 587 return false; 588 } 589 return true; 590} 591 592bool edp_get_psr_state(const struct dc_link *link, enum dc_psr_state *state) 593{ 594 struct dc *dc = link->ctx->dc; 595 struct dmcu *dmcu = dc->res_pool->dmcu; 596 struct dmub_psr *psr = dc->res_pool->psr; 597 unsigned int panel_inst; 598 599 if (!dc_get_edp_link_panel_inst(dc, link, &panel_inst)) 600 return false; 601 602 if (psr != NULL && link->psr_settings.psr_feature_enabled) 603 psr->funcs->psr_get_state(psr, state, panel_inst); 604 else if (dmcu != NULL && link->psr_settings.psr_feature_enabled) 605 dmcu->funcs->get_psr_state(dmcu, state); 606 607 return true; 608} 609 610static inline enum physical_phy_id 611transmitter_to_phy_id(struct dc_link *link) 612{ 613 struct dc_context *dc_ctx = link->ctx; 614 enum transmitter transmitter_value = link->link_enc->transmitter; 615 616 switch (transmitter_value) { 617 case TRANSMITTER_UNIPHY_A: 618 return PHYLD_0; 619 case TRANSMITTER_UNIPHY_B: 620 return PHYLD_1; 621 case TRANSMITTER_UNIPHY_C: 622 return PHYLD_2; 623 case TRANSMITTER_UNIPHY_D: 624 return PHYLD_3; 625 case TRANSMITTER_UNIPHY_E: 626 return PHYLD_4; 627 case TRANSMITTER_UNIPHY_F: 628 return PHYLD_5; 629 case TRANSMITTER_NUTMEG_CRT: 630 return PHYLD_6; 631 case TRANSMITTER_TRAVIS_CRT: 632 return PHYLD_7; 633 case TRANSMITTER_TRAVIS_LCD: 634 return PHYLD_8; 635 case TRANSMITTER_UNIPHY_G: 636 return PHYLD_9; 637 case TRANSMITTER_COUNT: 638 return PHYLD_COUNT; 639 case TRANSMITTER_UNKNOWN: 640 return PHYLD_UNKNOWN; 641 default: 642 DC_ERROR("Unknown transmitter value %d\n", transmitter_value); 643 return PHYLD_UNKNOWN; 644 } 645} 646 647bool edp_setup_psr(struct dc_link *link, 648 const struct dc_stream_state *stream, struct psr_config *psr_config, 649 struct psr_context *psr_context) 650{ 651 struct dc *dc; 652 struct dmcu *dmcu; 653 struct dmub_psr *psr; 654 int i; 655 unsigned int panel_inst; 656 /* updateSinkPsrDpcdConfig*/ 657 union dpcd_psr_configuration psr_configuration; 658 union dpcd_sink_active_vtotal_control_mode vtotal_control = {0}; 659 660 psr_context->controllerId = CONTROLLER_ID_UNDEFINED; 661 662 if (!link) 663 return false; 664 665 dc = link->ctx->dc; 666 dmcu = dc->res_pool->dmcu; 667 psr = dc->res_pool->psr; 668 669 if (!dmcu && !psr) 670 return false; 671 672 if (!dc_get_edp_link_panel_inst(dc, link, &panel_inst)) 673 return false; 674 675 676 memset(&psr_configuration, 0, sizeof(psr_configuration)); 677 678 psr_configuration.bits.ENABLE = 1; 679 psr_configuration.bits.CRC_VERIFICATION = 1; 680 psr_configuration.bits.FRAME_CAPTURE_INDICATION = 681 psr_config->psr_frame_capture_indication_req; 682 683 /* Check for PSR v2*/ 684 if (link->psr_settings.psr_version == DC_PSR_VERSION_SU_1) { 685 /* For PSR v2 selective update. 686 * Indicates whether sink should start capturing 687 * immediately following active scan line, 688 * or starting with the 2nd active scan line. 689 */ 690 psr_configuration.bits.LINE_CAPTURE_INDICATION = 0; 691 /*For PSR v2, determines whether Sink should generate 692 * IRQ_HPD when CRC mismatch is detected. 693 */ 694 psr_configuration.bits.IRQ_HPD_WITH_CRC_ERROR = 1; 695 /* For PSR v2, set the bit when the Source device will 696 * be enabling PSR2 operation. 697 */ 698 psr_configuration.bits.ENABLE_PSR2 = 1; 699 /* For PSR v2, the Sink device must be able to receive 700 * SU region updates early in the frame time. 701 */ 702 psr_configuration.bits.EARLY_TRANSPORT_ENABLE = 1; 703 } 704 705 dm_helpers_dp_write_dpcd( 706 link->ctx, 707 link, 708 368, 709 &psr_configuration.raw, 710 sizeof(psr_configuration.raw)); 711 712 if (link->psr_settings.psr_version == DC_PSR_VERSION_SU_1) { 713 edp_power_alpm_dpcd_enable(link, true); 714 psr_context->su_granularity_required = 715 psr_config->su_granularity_required; 716 psr_context->su_y_granularity = 717 psr_config->su_y_granularity; 718 psr_context->line_time_in_us = psr_config->line_time_in_us; 719 720 /* linux must be able to expose AMD Source DPCD definition 721 * in order to support FreeSync PSR 722 */ 723 if (link->psr_settings.psr_vtotal_control_support) { 724 psr_context->rate_control_caps = psr_config->rate_control_caps; 725 vtotal_control.bits.ENABLE = true; 726 core_link_write_dpcd(link, DP_SINK_PSR_ACTIVE_VTOTAL_CONTROL_MODE, 727 &vtotal_control.raw, sizeof(vtotal_control.raw)); 728 } 729 } 730 731 psr_context->channel = link->ddc->ddc_pin->hw_info.ddc_channel; 732 psr_context->transmitterId = link->link_enc->transmitter; 733 psr_context->engineId = link->link_enc->preferred_engine; 734 735 for (i = 0; i < MAX_PIPES; i++) { 736 if (dc->current_state->res_ctx.pipe_ctx[i].stream 737 == stream) { 738 /* dmcu -1 for all controller id values, 739 * therefore +1 here 740 */ 741 psr_context->controllerId = 742 dc->current_state->res_ctx. 743 pipe_ctx[i].stream_res.tg->inst + 1; 744 break; 745 } 746 } 747 748 /* Hardcoded for now. Can be Pcie or Uniphy (or Unknown)*/ 749 psr_context->phyType = PHY_TYPE_UNIPHY; 750 /*PhyId is associated with the transmitter id*/ 751 psr_context->smuPhyId = transmitter_to_phy_id(link); 752 753 psr_context->crtcTimingVerticalTotal = stream->timing.v_total; 754 psr_context->vsync_rate_hz = div64_u64(div64_u64((stream-> 755 timing.pix_clk_100hz * 100), 756 stream->timing.v_total), 757 stream->timing.h_total); 758 759 psr_context->psrSupportedDisplayConfig = true; 760 psr_context->psrExitLinkTrainingRequired = 761 psr_config->psr_exit_link_training_required; 762 psr_context->sdpTransmitLineNumDeadline = 763 psr_config->psr_sdp_transmit_line_num_deadline; 764 psr_context->psrFrameCaptureIndicationReq = 765 psr_config->psr_frame_capture_indication_req; 766 767 psr_context->skipPsrWaitForPllLock = 0; /* only = 1 in KV */ 768 769 psr_context->numberOfControllers = 770 link->dc->res_pool->timing_generator_count; 771 772 psr_context->rfb_update_auto_en = true; 773 774 /* 2 frames before enter PSR. */ 775 psr_context->timehyst_frames = 2; 776 /* half a frame 777 * (units in 100 lines, i.e. a value of 1 represents 100 lines) 778 */ 779 psr_context->hyst_lines = stream->timing.v_total / 2 / 100; 780 psr_context->aux_repeats = 10; 781 782 psr_context->psr_level.u32all = 0; 783 784 /*skip power down the single pipe since it blocks the cstate*/ 785 if (link->ctx->asic_id.chip_family >= FAMILY_RV) { 786 switch (link->ctx->asic_id.chip_family) { 787 case FAMILY_YELLOW_CARP: 788 case AMDGPU_FAMILY_GC_10_3_6: 789 case AMDGPU_FAMILY_GC_11_0_1: 790 if (dc->debug.disable_z10 || dc->debug.psr_skip_crtc_disable) 791 psr_context->psr_level.bits.SKIP_CRTC_DISABLE = true; 792 break; 793 default: 794 psr_context->psr_level.bits.SKIP_CRTC_DISABLE = true; 795 break; 796 } 797 } 798 799 /* SMU will perform additional powerdown sequence. 800 * For unsupported ASICs, set psr_level flag to skip PSR 801 * static screen notification to SMU. 802 * (Always set for DAL2, did not check ASIC) 803 */ 804 psr_context->allow_smu_optimizations = psr_config->allow_smu_optimizations; 805 psr_context->allow_multi_disp_optimizations = psr_config->allow_multi_disp_optimizations; 806 807 /* Complete PSR entry before aborting to prevent intermittent 808 * freezes on certain eDPs 809 */ 810 psr_context->psr_level.bits.DISABLE_PSR_ENTRY_ABORT = 1; 811 812 /* Disable ALPM first for compatible non-ALPM panel now */ 813 psr_context->psr_level.bits.DISABLE_ALPM = 0; 814 psr_context->psr_level.bits.ALPM_DEFAULT_PD_MODE = 1; 815 816 /* Controls additional delay after remote frame capture before 817 * continuing power down, default = 0 818 */ 819 psr_context->frame_delay = 0; 820 821 psr_context->dsc_slice_height = psr_config->dsc_slice_height; 822 823 if (psr) { 824 link->psr_settings.psr_feature_enabled = psr->funcs->psr_copy_settings(psr, 825 link, psr_context, panel_inst); 826 link->psr_settings.psr_power_opt = 0; 827 link->psr_settings.psr_allow_active = 0; 828 } else { 829 link->psr_settings.psr_feature_enabled = dmcu->funcs->setup_psr(dmcu, link, psr_context); 830 } 831 832 /* psr_enabled == 0 indicates setup_psr did not succeed, but this 833 * should not happen since firmware should be running at this point 834 */ 835 if (link->psr_settings.psr_feature_enabled == 0) 836 ASSERT(0); 837 838 return true; 839 840} 841 842void edp_get_psr_residency(const struct dc_link *link, uint32_t *residency) 843{ 844 struct dc *dc = link->ctx->dc; 845 struct dmub_psr *psr = dc->res_pool->psr; 846 unsigned int panel_inst; 847 848 if (!dc_get_edp_link_panel_inst(dc, link, &panel_inst)) 849 return; 850 851 // PSR residency measurements only supported on DMCUB 852 if (psr != NULL && link->psr_settings.psr_feature_enabled) 853 psr->funcs->psr_get_residency(psr, residency, panel_inst); 854 else 855 *residency = 0; 856} 857bool edp_set_sink_vtotal_in_psr_active(const struct dc_link *link, uint16_t psr_vtotal_idle, uint16_t psr_vtotal_su) 858{ 859 struct dc *dc = link->ctx->dc; 860 struct dmub_psr *psr = dc->res_pool->psr; 861 862 if (psr == NULL || !link->psr_settings.psr_feature_enabled || !link->psr_settings.psr_vtotal_control_support) 863 return false; 864 865 psr->funcs->psr_set_sink_vtotal_in_psr_active(psr, psr_vtotal_idle, psr_vtotal_su); 866 867 return true; 868} 869 870bool edp_set_replay_allow_active(struct dc_link *link, const bool *allow_active, 871 bool wait, bool force_static, const unsigned int *power_opts) 872{ 873 struct dc *dc = link->ctx->dc; 874 struct dmub_replay *replay = dc->res_pool->replay; 875 unsigned int panel_inst; 876 877 if (replay == NULL && force_static) 878 return false; 879 880 if (!dc_get_edp_link_panel_inst(dc, link, &panel_inst)) 881 return false; 882 883 /* Set power optimization flag */ 884 if (power_opts && link->replay_settings.replay_power_opt_active != *power_opts) { 885 if (replay != NULL && link->replay_settings.replay_feature_enabled && 886 replay->funcs->replay_set_power_opt) { 887 replay->funcs->replay_set_power_opt(replay, *power_opts, panel_inst); 888 link->replay_settings.replay_power_opt_active = *power_opts; 889 } 890 } 891 892 /* Activate or deactivate Replay */ 893 if (allow_active && link->replay_settings.replay_allow_active != *allow_active) { 894 // TODO: Handle mux change case if force_static is set 895 // If force_static is set, just change the replay_allow_active state directly 896 if (replay != NULL && link->replay_settings.replay_feature_enabled) 897 replay->funcs->replay_enable(replay, *allow_active, wait, panel_inst); 898 link->replay_settings.replay_allow_active = *allow_active; 899 } 900 901 return true; 902} 903 904bool edp_get_replay_state(const struct dc_link *link, uint64_t *state) 905{ 906 struct dc *dc = link->ctx->dc; 907 struct dmub_replay *replay = dc->res_pool->replay; 908 unsigned int panel_inst; 909 enum replay_state pr_state = REPLAY_STATE_0; 910 911 if (!dc_get_edp_link_panel_inst(dc, link, &panel_inst)) 912 return false; 913 914 if (replay != NULL && link->replay_settings.replay_feature_enabled) 915 replay->funcs->replay_get_state(replay, &pr_state, panel_inst); 916 *state = pr_state; 917 918 return true; 919} 920 921bool edp_setup_replay(struct dc_link *link, const struct dc_stream_state *stream) 922{ 923 /* To-do: Setup Replay */ 924 struct dc *dc; 925 struct dmub_replay *replay; 926 int i; 927 unsigned int panel_inst; 928 struct replay_context replay_context = { 0 }; 929 unsigned int lineTimeInNs = 0; 930 931 932 union replay_enable_and_configuration replay_config; 933 934 union dpcd_alpm_configuration alpm_config; 935 936 replay_context.controllerId = CONTROLLER_ID_UNDEFINED; 937 938 if (!link) 939 return false; 940 941 dc = link->ctx->dc; 942 943 replay = dc->res_pool->replay; 944 945 if (!replay) 946 return false; 947 948 if (!dc_get_edp_link_panel_inst(dc, link, &panel_inst)) 949 return false; 950 951 replay_context.aux_inst = link->ddc->ddc_pin->hw_info.ddc_channel; 952 replay_context.digbe_inst = link->link_enc->transmitter; 953 replay_context.digfe_inst = link->link_enc->preferred_engine; 954 955 for (i = 0; i < MAX_PIPES; i++) { 956 if (dc->current_state->res_ctx.pipe_ctx[i].stream 957 == stream) { 958 /* dmcu -1 for all controller id values, 959 * therefore +1 here 960 */ 961 replay_context.controllerId = 962 dc->current_state->res_ctx.pipe_ctx[i].stream_res.tg->inst + 1; 963 break; 964 } 965 } 966 967 lineTimeInNs = 968 ((stream->timing.h_total * 1000000) / 969 (stream->timing.pix_clk_100hz / 10)) + 1; 970 971 replay_context.line_time_in_ns = lineTimeInNs; 972 973 link->replay_settings.replay_feature_enabled = 974 replay->funcs->replay_copy_settings(replay, link, &replay_context, panel_inst); 975 if (link->replay_settings.replay_feature_enabled) { 976 977 replay_config.bits.FREESYNC_PANEL_REPLAY_MODE = 1; 978 replay_config.bits.TIMING_DESYNC_ERROR_VERIFICATION = 979 link->replay_settings.config.replay_timing_sync_supported; 980 replay_config.bits.STATE_TRANSITION_ERROR_DETECTION = 1; 981 dm_helpers_dp_write_dpcd(link->ctx, link, 982 DP_SINK_PR_ENABLE_AND_CONFIGURATION, 983 (uint8_t *)&(replay_config.raw), sizeof(uint8_t)); 984 985 memset(&alpm_config, 0, sizeof(alpm_config)); 986 alpm_config.bits.ENABLE = 1; 987 dm_helpers_dp_write_dpcd( 988 link->ctx, 989 link, 990 DP_RECEIVER_ALPM_CONFIG, 991 &alpm_config.raw, 992 sizeof(alpm_config.raw)); 993 } 994 return true; 995} 996 997bool edp_set_coasting_vtotal(struct dc_link *link, uint16_t coasting_vtotal) 998{ 999 struct dc *dc = link->ctx->dc; 1000 struct dmub_replay *replay = dc->res_pool->replay; 1001 unsigned int panel_inst; 1002 1003 if (!replay) 1004 return false; 1005 1006 if (!dc_get_edp_link_panel_inst(dc, link, &panel_inst)) 1007 return false; 1008 1009 if (coasting_vtotal && link->replay_settings.coasting_vtotal != coasting_vtotal) { 1010 replay->funcs->replay_set_coasting_vtotal(replay, coasting_vtotal, panel_inst); 1011 link->replay_settings.coasting_vtotal = coasting_vtotal; 1012 } 1013 1014 return true; 1015} 1016 1017bool edp_replay_residency(const struct dc_link *link, 1018 unsigned int *residency, const bool is_start, const bool is_alpm) 1019{ 1020 struct dc *dc = link->ctx->dc; 1021 struct dmub_replay *replay = dc->res_pool->replay; 1022 unsigned int panel_inst; 1023 1024 if (!dc_get_edp_link_panel_inst(dc, link, &panel_inst)) 1025 return false; 1026 1027 if (replay != NULL && link->replay_settings.replay_feature_enabled) 1028 replay->funcs->replay_residency(replay, panel_inst, residency, is_start, is_alpm); 1029 else 1030 *residency = 0; 1031 1032 return true; 1033} 1034 1035static struct abm *get_abm_from_stream_res(const struct dc_link *link) 1036{ 1037 int i; 1038 struct dc *dc = link->ctx->dc; 1039 struct abm *abm = NULL; 1040 1041 for (i = 0; i < MAX_PIPES; i++) { 1042 struct pipe_ctx pipe_ctx = dc->current_state->res_ctx.pipe_ctx[i]; 1043 struct dc_stream_state *stream = pipe_ctx.stream; 1044 1045 if (stream && stream->link == link) { 1046 abm = pipe_ctx.stream_res.abm; 1047 break; 1048 } 1049 } 1050 return abm; 1051} 1052 1053int edp_get_backlight_level(const struct dc_link *link) 1054{ 1055 struct abm *abm = get_abm_from_stream_res(link); 1056 struct panel_cntl *panel_cntl = link->panel_cntl; 1057 struct dc *dc = link->ctx->dc; 1058 struct dmcu *dmcu = dc->res_pool->dmcu; 1059 bool fw_set_brightness = true; 1060 1061 if (dmcu) 1062 fw_set_brightness = dmcu->funcs->is_dmcu_initialized(dmcu); 1063 1064 if (!fw_set_brightness && panel_cntl->funcs->get_current_backlight) 1065 return panel_cntl->funcs->get_current_backlight(panel_cntl); 1066 else if (abm != NULL && abm->funcs->get_current_backlight != NULL) 1067 return (int) abm->funcs->get_current_backlight(abm); 1068 else 1069 return DC_ERROR_UNEXPECTED; 1070} 1071 1072int edp_get_target_backlight_pwm(const struct dc_link *link) 1073{ 1074 struct abm *abm = get_abm_from_stream_res(link); 1075 1076 if (abm == NULL || abm->funcs->get_target_backlight == NULL) 1077 return DC_ERROR_UNEXPECTED; 1078 1079 return (int) abm->funcs->get_target_backlight(abm); 1080} 1081