1 // SPDX-License-Identifier: MIT 2 /* 3 * Copyright © 2020 Intel Corporation 4 * 5 */ 6 7 #include <drm/drm_print.h> 8 9 #include "intel_alpm.h" 10 #include "intel_cmtg.h" 11 #include "intel_crtc.h" 12 #include "intel_de.h" 13 #include "intel_display_limits.h" 14 #include "intel_display_regs.h" 15 #include "intel_display_types.h" 16 #include "intel_dmc.h" 17 #include "intel_dmc_regs.h" 18 #include "intel_dp.h" 19 #include "intel_psr.h" 20 #include "intel_vrr.h" 21 #include "intel_vrr_regs.h" 22 #include "skl_prefill.h" 23 #include "skl_watermark.h" 24 25 #define FIXED_POINT_PRECISION 100 26 #define CMRR_PRECISION_TOLERANCE 10 27 28 /* 29 * Tunable parameters for DC Balance correction. 30 * These are captured based on experimentations. 31 */ 32 #define DCB_CORRECTION_SENSITIVITY 30 33 #define DCB_CORRECTION_AGGRESSIVENESS 1000 /* ms × 100; 10 ms */ 34 #define DCB_BLANK_TARGET 50 35 36 bool intel_vrr_is_capable(struct intel_connector *connector) 37 { 38 struct intel_display *display = to_intel_display(connector); 39 const struct drm_display_info *info = &connector->base.display_info; 40 struct intel_dp *intel_dp; 41 42 if (!HAS_VRR(display)) 43 return false; 44 45 /* 46 * DP Sink is capable of VRR video timings if 47 * Ignore MSA bit is set in DPCD. 48 * EDID monitor range also should be atleast 10 for reasonable 49 * Adaptive Sync or Variable Refresh Rate end user experience. 50 */ 51 switch (connector->base.connector_type) { 52 case DRM_MODE_CONNECTOR_eDP: 53 if (!connector->panel.vbt.vrr) 54 return false; 55 fallthrough; 56 case DRM_MODE_CONNECTOR_DisplayPort: 57 if (connector->mst.dp) 58 return false; 59 intel_dp = intel_attached_dp(connector); 60 /* 61 * Among non-MST DP branch devices, only an HDMI 2.1 sink connected 62 * via a PCON could support VRR. However, supporting VRR through a 63 * PCON requires non-trivial changes that are not implemented yet. 64 * Until that support exists, avoid VRR on all DP branch devices. 65 * 66 * TODO: Add support for VRR for DP->HDMI 2.1 PCON. 67 */ 68 if (drm_dp_is_branch(intel_dp->dpcd)) 69 return false; 70 71 if (!drm_dp_sink_can_do_video_without_timing_msa(intel_dp->dpcd)) 72 return false; 73 74 break; 75 default: 76 return false; 77 } 78 79 if (!info->monitor_range.min_vfreq || !info->monitor_range.max_vfreq || 80 info->monitor_range.min_vfreq > info->monitor_range.max_vfreq) 81 return false; 82 83 return info->monitor_range.max_vfreq - info->monitor_range.min_vfreq > 10; 84 } 85 86 bool intel_vrr_is_in_range(struct intel_connector *connector, int vrefresh) 87 { 88 const struct drm_display_info *info = &connector->base.display_info; 89 90 return intel_vrr_is_capable(connector) && 91 vrefresh >= info->monitor_range.min_vfreq && 92 vrefresh <= info->monitor_range.max_vfreq; 93 } 94 95 bool intel_vrr_possible(const struct intel_crtc_state *crtc_state) 96 { 97 return crtc_state->vrr.flipline; 98 } 99 100 void 101 intel_vrr_check_modeset(struct intel_atomic_state *state) 102 { 103 struct intel_crtc_state *old_crtc_state, *new_crtc_state; 104 struct intel_crtc *crtc; 105 106 for_each_oldnew_intel_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state) { 107 if (new_crtc_state->uapi.vrr_enabled != 108 old_crtc_state->uapi.vrr_enabled) 109 new_crtc_state->uapi.mode_changed = true; 110 } 111 } 112 113 static int intel_vrr_extra_vblank_delay(struct intel_display *display) 114 { 115 /* 116 * On ICL/TGL VRR hardware inserts one extra scanline 117 * just after vactive, which pushes the vmin decision 118 * boundary ahead accordingly, and thus reduces the 119 * max guardband length by one scanline. 120 */ 121 return DISPLAY_VER(display) < 13 ? 1 : 0; 122 } 123 124 static int intel_vrr_vmin_flipline_offset(struct intel_display *display) 125 { 126 /* 127 * ICL/TGL hardware imposes flipline>=vmin+1 128 * 129 * We reduce the vmin value to compensate when programming the 130 * hardware. This approach allows flipline to remain set at the 131 * original value, and thus the frame will have the desired 132 * minimum vtotal. 133 */ 134 return DISPLAY_VER(display) < 13 ? 1 : 0; 135 } 136 137 static int intel_vrr_guardband_to_pipeline_full(const struct intel_crtc_state *crtc_state, 138 int guardband) 139 { 140 /* hardware imposes one extra scanline somewhere */ 141 return guardband - crtc_state->framestart_delay - 1; 142 } 143 144 static int intel_vrr_pipeline_full_to_guardband(const struct intel_crtc_state *crtc_state, 145 int pipeline_full) 146 { 147 /* hardware imposes one extra scanline somewhere */ 148 return pipeline_full + crtc_state->framestart_delay + 1; 149 } 150 151 /* 152 * Without VRR registers get latched at: 153 * vblank_start 154 * 155 * With VRR the earliest registers can get latched is: 156 * intel_vrr_vmin_vblank_start(), which if we want to maintain 157 * the correct min vtotal is >=vblank_start+1 158 * 159 * The latest point registers can get latched is the vmax decision boundary: 160 * intel_vrr_vmax_vblank_start() 161 * 162 * Between those two points the vblank exit starts (and hence registers get 163 * latched) ASAP after a push is sent. 164 * 165 * framestart_delay is programmable 1-4. 166 */ 167 168 int intel_vrr_vmin_vtotal(const struct intel_crtc_state *crtc_state) 169 { 170 /* Min vblank actually determined by flipline */ 171 return crtc_state->vrr.vmin; 172 } 173 174 int intel_vrr_vmax_vtotal(const struct intel_crtc_state *crtc_state) 175 { 176 return crtc_state->vrr.vmax; 177 } 178 179 int intel_vrr_vmin_vblank_start(const struct intel_crtc_state *crtc_state) 180 { 181 return intel_vrr_vmin_vtotal(crtc_state) - crtc_state->vrr.guardband; 182 } 183 184 int intel_vrr_vmax_vblank_start(const struct intel_crtc_state *crtc_state) 185 { 186 return intel_vrr_vmax_vtotal(crtc_state) - crtc_state->vrr.guardband; 187 } 188 189 static bool 190 is_cmrr_frac_required(struct intel_crtc_state *crtc_state) 191 { 192 struct intel_display *display = to_intel_display(crtc_state); 193 int calculated_refresh_k, actual_refresh_k, pixel_clock_per_line; 194 struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; 195 196 /* Avoid CMRR for now till we have VRR with fixed timings working */ 197 if (!HAS_CMRR(display) || true) 198 return false; 199 200 actual_refresh_k = 201 drm_mode_vrefresh(adjusted_mode) * FIXED_POINT_PRECISION; 202 pixel_clock_per_line = 203 adjusted_mode->crtc_clock * 1000 / adjusted_mode->crtc_htotal; 204 calculated_refresh_k = 205 pixel_clock_per_line * FIXED_POINT_PRECISION / adjusted_mode->crtc_vtotal; 206 207 if ((actual_refresh_k - calculated_refresh_k) < CMRR_PRECISION_TOLERANCE) 208 return false; 209 210 return true; 211 } 212 213 static unsigned int 214 cmrr_get_vtotal(struct intel_crtc_state *crtc_state, bool video_mode_required) 215 { 216 int multiplier_m = 1, multiplier_n = 1, vtotal, desired_refresh_rate; 217 u64 adjusted_pixel_rate; 218 struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; 219 220 desired_refresh_rate = drm_mode_vrefresh(adjusted_mode); 221 222 if (video_mode_required) { 223 multiplier_m = 1001; 224 multiplier_n = 1000; 225 } 226 227 crtc_state->cmrr.cmrr_n = mul_u32_u32(desired_refresh_rate * adjusted_mode->crtc_htotal, 228 multiplier_n); 229 vtotal = DIV_ROUND_UP_ULL(mul_u32_u32(adjusted_mode->crtc_clock * 1000, multiplier_n), 230 crtc_state->cmrr.cmrr_n); 231 adjusted_pixel_rate = mul_u32_u32(adjusted_mode->crtc_clock * 1000, multiplier_m); 232 crtc_state->cmrr.cmrr_m = do_div(adjusted_pixel_rate, crtc_state->cmrr.cmrr_n); 233 234 return vtotal; 235 } 236 237 static 238 void intel_vrr_compute_cmrr_timings(struct intel_crtc_state *crtc_state) 239 { 240 /* 241 * TODO: Compute precise target refresh rate to determine 242 * if video_mode_required should be true. Currently set to 243 * false due to uncertainty about the precise target 244 * refresh Rate. 245 */ 246 crtc_state->vrr.vmax = cmrr_get_vtotal(crtc_state, false); 247 crtc_state->vrr.vmin = crtc_state->vrr.vmax; 248 crtc_state->vrr.flipline = crtc_state->vrr.vmin; 249 250 crtc_state->cmrr.enable = true; 251 crtc_state->mode_flags |= I915_MODE_FLAG_VRR; 252 } 253 254 static 255 void intel_vrr_compute_vrr_timings(struct intel_crtc_state *crtc_state, 256 int vmin, int vmax) 257 { 258 crtc_state->vrr.vmax = vmax; 259 crtc_state->vrr.vmin = vmin; 260 crtc_state->vrr.flipline = crtc_state->vrr.vmin; 261 262 crtc_state->vrr.enable = true; 263 crtc_state->mode_flags |= I915_MODE_FLAG_VRR; 264 } 265 266 static 267 void intel_vrr_compute_fixed_rr_timings(struct intel_crtc_state *crtc_state) 268 { 269 /* For fixed rr, vmin = vmax = flipline */ 270 crtc_state->vrr.vmax = crtc_state->hw.adjusted_mode.crtc_vtotal; 271 crtc_state->vrr.vmin = crtc_state->vrr.vmax; 272 crtc_state->vrr.flipline = crtc_state->vrr.vmin; 273 } 274 275 static int intel_vrr_hw_value(const struct intel_crtc_state *crtc_state, 276 int value) 277 { 278 struct intel_display *display = to_intel_display(crtc_state); 279 280 /* 281 * On TGL vmin/vmax/flipline also need to be 282 * adjusted by the SCL to maintain correct vtotals. 283 */ 284 if (DISPLAY_VER(display) >= 13) 285 return value; 286 else 287 return value - crtc_state->set_context_latency; 288 } 289 290 static int intel_vrr_vblank_start(const struct intel_crtc_state *crtc_state, 291 int vmin_vmax) 292 { 293 return intel_vrr_hw_value(crtc_state, vmin_vmax) - crtc_state->vrr.guardband; 294 } 295 296 /* 297 * For fixed refresh rate mode Vmin, Vmax and Flipline all are set to 298 * Vtotal value. 299 */ 300 static 301 int intel_vrr_fixed_rr_hw_vtotal(const struct intel_crtc_state *crtc_state) 302 { 303 return intel_vrr_hw_value(crtc_state, crtc_state->hw.adjusted_mode.crtc_vtotal); 304 } 305 306 static 307 int intel_vrr_fixed_rr_hw_vmax(const struct intel_crtc_state *crtc_state) 308 { 309 return intel_vrr_fixed_rr_hw_vtotal(crtc_state); 310 } 311 312 static 313 int intel_vrr_fixed_rr_hw_vmin(const struct intel_crtc_state *crtc_state) 314 { 315 struct intel_display *display = to_intel_display(crtc_state); 316 317 return intel_vrr_fixed_rr_hw_vtotal(crtc_state) - 318 intel_vrr_vmin_flipline_offset(display); 319 } 320 321 static 322 int intel_vrr_fixed_rr_hw_flipline(const struct intel_crtc_state *crtc_state) 323 { 324 return intel_vrr_fixed_rr_hw_vtotal(crtc_state); 325 } 326 327 void intel_vrr_set_fixed_rr_timings(const struct intel_crtc_state *crtc_state, 328 enum transcoder transcoder) 329 { 330 struct intel_display *display = to_intel_display(crtc_state); 331 332 if (!intel_vrr_possible(crtc_state)) 333 return; 334 335 intel_de_write(display, TRANS_VRR_VMIN(display, transcoder), 336 intel_vrr_fixed_rr_hw_vmin(crtc_state) - 1); 337 intel_de_write(display, TRANS_VRR_VMAX(display, transcoder), 338 intel_vrr_fixed_rr_hw_vmax(crtc_state) - 1); 339 intel_de_write(display, TRANS_VRR_FLIPLINE(display, transcoder), 340 intel_vrr_fixed_rr_hw_flipline(crtc_state) - 1); 341 } 342 343 static 344 int intel_vrr_compute_vmin(struct intel_crtc_state *crtc_state) 345 { 346 /* 347 * To make fixed rr and vrr work seamless the guardband/pipeline full 348 * should be set such that it satisfies both the fixed and variable 349 * timings. 350 * For this set the vmin as crtc_vtotal. With this we never need to 351 * change anything to do with the guardband. 352 */ 353 return crtc_state->hw.adjusted_mode.crtc_vtotal; 354 } 355 356 static 357 int intel_vrr_compute_vmax(struct intel_connector *connector, 358 const struct drm_display_mode *adjusted_mode) 359 { 360 const struct drm_display_info *info = &connector->base.display_info; 361 int vmax; 362 363 vmax = adjusted_mode->crtc_clock * 1000 / 364 (adjusted_mode->crtc_htotal * info->monitor_range.min_vfreq); 365 vmax = max_t(int, vmax, adjusted_mode->crtc_vtotal); 366 367 return vmax; 368 } 369 370 static bool intel_vrr_dc_balance_possible(const struct intel_crtc_state *crtc_state) 371 { 372 struct intel_display *display = to_intel_display(crtc_state); 373 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 374 enum pipe pipe = crtc->pipe; 375 376 /* 377 * FIXME: Currently Firmware supports DC Balancing on PIPE A 378 * and PIPE B. Account those limitation while computing DC 379 * Balance parameters. 380 */ 381 return (HAS_VRR_DC_BALANCE(display) && 382 ((pipe == PIPE_A) || (pipe == PIPE_B))); 383 } 384 385 static void 386 intel_vrr_dc_balance_compute_config(struct intel_crtc_state *crtc_state) 387 { 388 int guardband_usec, adjustment_usec; 389 struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; 390 391 if (!intel_vrr_dc_balance_possible(crtc_state) || !crtc_state->vrr.enable) 392 return; 393 394 crtc_state->vrr.dc_balance.vmax = crtc_state->vrr.vmax; 395 crtc_state->vrr.dc_balance.vmin = crtc_state->vrr.vmin; 396 crtc_state->vrr.dc_balance.max_increase = 397 crtc_state->vrr.vmax - crtc_state->vrr.vmin; 398 crtc_state->vrr.dc_balance.max_decrease = 399 crtc_state->vrr.vmax - crtc_state->vrr.vmin; 400 crtc_state->vrr.dc_balance.guardband = 401 DIV_ROUND_UP(crtc_state->vrr.dc_balance.vmax * 402 DCB_CORRECTION_SENSITIVITY, 100); 403 guardband_usec = 404 intel_scanlines_to_usecs(adjusted_mode, 405 crtc_state->vrr.dc_balance.guardband); 406 /* 407 * The correction_aggressiveness/100 is the number of milliseconds to 408 * adjust by when the balance is at twice the guardband. 409 * guardband_slope = correction_aggressiveness / (guardband * 100) 410 */ 411 adjustment_usec = DCB_CORRECTION_AGGRESSIVENESS * 10; 412 crtc_state->vrr.dc_balance.slope = 413 DIV_ROUND_UP(adjustment_usec, guardband_usec); 414 crtc_state->vrr.dc_balance.vblank_target = 415 DIV_ROUND_UP((crtc_state->vrr.vmax - crtc_state->vrr.vmin) * 416 DCB_BLANK_TARGET, 100); 417 crtc_state->vrr.dc_balance.enable = true; 418 } 419 420 void 421 intel_vrr_compute_config(struct intel_crtc_state *crtc_state, 422 struct drm_connector_state *conn_state) 423 { 424 struct intel_display *display = to_intel_display(crtc_state); 425 struct intel_connector *connector = 426 to_intel_connector(conn_state->connector); 427 struct intel_dp *intel_dp = intel_attached_dp(connector); 428 bool is_edp = intel_dp_is_edp(intel_dp); 429 struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; 430 int vmin, vmax; 431 432 if (!HAS_VRR(display)) 433 return; 434 435 if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) 436 return; 437 438 crtc_state->vrr.in_range = 439 intel_vrr_is_in_range(connector, drm_mode_vrefresh(adjusted_mode)); 440 441 /* 442 * Allow fixed refresh rate with VRR Timing Generator. 443 * For now set the vrr.in_range to 0, to allow fixed_rr but skip actual 444 * VRR and LRR. 445 * #TODO For actual VRR with joiner, we need to figure out how to 446 * correctly sequence transcoder level stuff vs. pipe level stuff 447 * in the commit. 448 */ 449 if (crtc_state->joiner_pipes) 450 crtc_state->vrr.in_range = false; 451 452 vmin = intel_vrr_compute_vmin(crtc_state); 453 454 if (crtc_state->vrr.in_range) { 455 if (HAS_LRR(display)) 456 crtc_state->update_lrr = true; 457 vmax = intel_vrr_compute_vmax(connector, adjusted_mode); 458 } else { 459 vmax = vmin; 460 } 461 462 if (crtc_state->uapi.vrr_enabled && vmin < vmax) 463 intel_vrr_compute_vrr_timings(crtc_state, vmin, vmax); 464 else if (is_cmrr_frac_required(crtc_state) && is_edp) 465 intel_vrr_compute_cmrr_timings(crtc_state); 466 else 467 intel_vrr_compute_fixed_rr_timings(crtc_state); 468 469 if (HAS_AS_SDP(display)) { 470 crtc_state->vrr.vsync_start = 471 (crtc_state->hw.adjusted_mode.crtc_vtotal - 472 crtc_state->hw.adjusted_mode.crtc_vsync_start); 473 crtc_state->vrr.vsync_end = 474 (crtc_state->hw.adjusted_mode.crtc_vtotal - 475 crtc_state->hw.adjusted_mode.crtc_vsync_end); 476 } 477 478 intel_vrr_dc_balance_compute_config(crtc_state); 479 } 480 481 static int 482 intel_vrr_max_hw_guardband(const struct intel_crtc_state *crtc_state) 483 { 484 struct intel_display *display = to_intel_display(crtc_state); 485 int max_pipeline_full = REG_FIELD_MAX(VRR_CTL_PIPELINE_FULL_MASK); 486 487 if (DISPLAY_VER(display) >= 13) 488 return REG_FIELD_MAX(XELPD_VRR_CTL_VRR_GUARDBAND_MASK); 489 else 490 return intel_vrr_pipeline_full_to_guardband(crtc_state, 491 max_pipeline_full); 492 } 493 494 static int 495 intel_vrr_max_vblank_guardband(const struct intel_crtc_state *crtc_state) 496 { 497 struct intel_display *display = to_intel_display(crtc_state); 498 const struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; 499 500 return crtc_state->vrr.vmin - 501 adjusted_mode->crtc_vdisplay - 502 crtc_state->set_context_latency - 503 intel_vrr_extra_vblank_delay(display); 504 } 505 506 static int 507 intel_vrr_max_guardband(struct intel_crtc_state *crtc_state) 508 { 509 return min(intel_vrr_max_hw_guardband(crtc_state), 510 intel_vrr_max_vblank_guardband(crtc_state)); 511 } 512 513 static 514 int intel_vrr_compute_optimized_guardband(struct intel_crtc_state *crtc_state) 515 { 516 struct intel_display *display = to_intel_display(crtc_state); 517 struct skl_prefill_ctx prefill_ctx; 518 int prefill_latency_us; 519 int guardband = 0; 520 521 skl_prefill_init_worst(&prefill_ctx, crtc_state); 522 523 /* 524 * The SoC power controller runs SAGV mutually exclusive with package C states, 525 * so the max of package C and SAGV latencies is used to compute the min prefill guardband. 526 * PM delay = max(sagv_latency, pkgc_max_latency (highest enabled wm level 1 and up)) 527 */ 528 prefill_latency_us = max(display->sagv.block_time_us, 529 skl_watermark_max_latency(display, 1)); 530 531 guardband = skl_prefill_min_guardband(&prefill_ctx, 532 crtc_state, 533 prefill_latency_us); 534 535 if (intel_crtc_has_dp_encoder(crtc_state)) { 536 guardband = max(guardband, intel_psr_min_guardband(crtc_state)); 537 guardband = max(guardband, intel_dp_sdp_min_guardband(crtc_state, true)); 538 guardband = max(guardband, intel_alpm_lobf_min_guardband(crtc_state)); 539 } 540 541 return guardband; 542 } 543 544 static bool intel_vrr_use_optimized_guardband(const struct intel_crtc_state *crtc_state) 545 { 546 /* 547 * #TODO: Enable optimized guardband for HDMI 548 * For HDMI lot of infoframes are transmitted a line or two after vsync. 549 * Since with optimized guardband the double bufferring point is at delayed vblank, 550 * we need to ensure that vsync happens after delayed vblank for the HDMI case. 551 */ 552 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 553 return false; 554 555 return true; 556 } 557 558 void intel_vrr_compute_guardband(struct intel_crtc_state *crtc_state) 559 { 560 struct intel_display *display = to_intel_display(crtc_state); 561 struct drm_display_mode *adjusted_mode = &crtc_state->hw.adjusted_mode; 562 struct drm_display_mode *pipe_mode = &crtc_state->hw.pipe_mode; 563 int guardband; 564 565 if (!intel_vrr_possible(crtc_state)) 566 return; 567 568 if (intel_vrr_use_optimized_guardband(crtc_state)) 569 guardband = intel_vrr_compute_optimized_guardband(crtc_state); 570 else 571 guardband = crtc_state->vrr.vmin - adjusted_mode->crtc_vdisplay; 572 573 crtc_state->vrr.guardband = min(guardband, intel_vrr_max_guardband(crtc_state)); 574 575 if (intel_vrr_always_use_vrr_tg(display)) { 576 adjusted_mode->crtc_vblank_start = 577 adjusted_mode->crtc_vtotal - crtc_state->vrr.guardband; 578 /* 579 * pipe_mode has already been derived from the 580 * original adjusted_mode, keep the two in sync. 581 */ 582 pipe_mode->crtc_vblank_start = 583 adjusted_mode->crtc_vblank_start; 584 } 585 586 if (DISPLAY_VER(display) < 13) 587 crtc_state->vrr.pipeline_full = 588 intel_vrr_guardband_to_pipeline_full(crtc_state, 589 crtc_state->vrr.guardband); 590 } 591 592 static u32 trans_vrr_ctl(const struct intel_crtc_state *crtc_state) 593 { 594 struct intel_display *display = to_intel_display(crtc_state); 595 596 if (DISPLAY_VER(display) >= 14) 597 return VRR_CTL_FLIP_LINE_EN | 598 XELPD_VRR_CTL_VRR_GUARDBAND(crtc_state->vrr.guardband); 599 else if (DISPLAY_VER(display) >= 13) 600 return VRR_CTL_IGN_MAX_SHIFT | VRR_CTL_FLIP_LINE_EN | 601 XELPD_VRR_CTL_VRR_GUARDBAND(crtc_state->vrr.guardband); 602 else 603 return VRR_CTL_IGN_MAX_SHIFT | VRR_CTL_FLIP_LINE_EN | 604 VRR_CTL_PIPELINE_FULL(crtc_state->vrr.pipeline_full) | 605 VRR_CTL_PIPELINE_FULL_OVERRIDE; 606 } 607 608 void intel_vrr_set_transcoder_timings(const struct intel_crtc_state *crtc_state) 609 { 610 struct intel_display *display = to_intel_display(crtc_state); 611 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 612 613 if (!HAS_VRR(display)) 614 return; 615 616 /* 617 * Bspec says: 618 * "(note: VRR needs to be programmed after 619 * TRANS_DDI_FUNC_CTL and before TRANS_CONF)." 620 * 621 * In practice it turns out that ICL can hang if 622 * TRANS_VRR_VMAX/FLIPLINE are written before 623 * enabling TRANS_DDI_FUNC_CTL. 624 */ 625 drm_WARN_ON(display->drm, 626 !(intel_de_read(display, TRANS_DDI_FUNC_CTL(display, cpu_transcoder)) & TRANS_DDI_FUNC_ENABLE)); 627 628 /* 629 * This bit seems to have two meanings depending on the platform: 630 * TGL: generate VRR "safe window" for DSB vblank waits 631 * ADL/DG2: make TRANS_SET_CONTEXT_LATENCY effective with VRR 632 */ 633 if (IS_DISPLAY_VER(display, 12, 13)) 634 intel_de_rmw(display, CHICKEN_TRANS(display, cpu_transcoder), 635 0, PIPE_VBLANK_WITH_DELAY); 636 637 if (!intel_vrr_possible(crtc_state)) { 638 intel_de_write(display, 639 TRANS_VRR_CTL(display, cpu_transcoder), 0); 640 return; 641 } 642 643 if (crtc_state->cmrr.enable) { 644 intel_de_write(display, TRANS_CMRR_M_HI(display, cpu_transcoder), 645 upper_32_bits(crtc_state->cmrr.cmrr_m)); 646 intel_de_write(display, TRANS_CMRR_M_LO(display, cpu_transcoder), 647 lower_32_bits(crtc_state->cmrr.cmrr_m)); 648 intel_de_write(display, TRANS_CMRR_N_HI(display, cpu_transcoder), 649 upper_32_bits(crtc_state->cmrr.cmrr_n)); 650 intel_de_write(display, TRANS_CMRR_N_LO(display, cpu_transcoder), 651 lower_32_bits(crtc_state->cmrr.cmrr_n)); 652 } 653 654 intel_vrr_set_fixed_rr_timings(crtc_state, cpu_transcoder); 655 intel_cmtg_set_vrr_timings(crtc_state); 656 657 if (!intel_vrr_always_use_vrr_tg(display)) 658 intel_de_write(display, TRANS_VRR_CTL(display, cpu_transcoder), 659 trans_vrr_ctl(crtc_state)); 660 661 if (HAS_AS_SDP(display)) 662 intel_de_write(display, 663 TRANS_VRR_VSYNC(display, cpu_transcoder), 664 VRR_VSYNC_END(crtc_state->vrr.vsync_end) | 665 VRR_VSYNC_START(crtc_state->vrr.vsync_start)); 666 667 /* 668 * For BMG and LNL+ onwards the EMP_AS_SDP_TL is used for programming 669 * double buffering point and transmission line for VRR packets for 670 * HDMI2.1/DP/eDP/DP->HDMI2.1 PCON. 671 * Since currently we support VRR only for DP/eDP, so this is programmed 672 * to for Adaptive Sync SDP to Vsync start. 673 */ 674 if (DISPLAY_VERx100(display) == 1401 || DISPLAY_VER(display) >= 20) 675 intel_de_write(display, 676 EMP_AS_SDP_TL(display, cpu_transcoder), 677 EMP_AS_SDP_DB_TL(crtc_state->vrr.vsync_start)); 678 } 679 680 void 681 intel_vrr_dcb_increment_flip_count(struct intel_crtc_state *crtc_state, 682 struct intel_crtc *crtc) 683 { 684 struct intel_display *display = to_intel_display(crtc_state); 685 enum pipe pipe = crtc->pipe; 686 687 if (!crtc_state->vrr.dc_balance.enable) 688 return; 689 690 intel_de_write(display, PIPEDMC_DCB_FLIP_COUNT(pipe), 691 ++crtc->dc_balance.flip_count); 692 } 693 694 void 695 intel_vrr_dcb_reset(const struct intel_crtc_state *old_crtc_state, 696 struct intel_crtc *crtc) 697 { 698 struct intel_display *display = to_intel_display(old_crtc_state); 699 enum pipe pipe = crtc->pipe; 700 701 if (!old_crtc_state->vrr.dc_balance.enable) 702 return; 703 704 intel_de_write(display, PIPEDMC_DCB_FLIP_COUNT(pipe), 0); 705 intel_de_write(display, PIPEDMC_DCB_BALANCE_RESET(pipe), 0); 706 } 707 708 static u32 trans_vrr_push(const struct intel_crtc_state *crtc_state, 709 bool send_push) 710 { 711 struct intel_display *display = to_intel_display(crtc_state); 712 u32 trans_vrr_push = 0; 713 714 if (intel_vrr_always_use_vrr_tg(display) || 715 crtc_state->vrr.enable) 716 trans_vrr_push |= TRANS_PUSH_EN; 717 718 if (send_push) 719 trans_vrr_push |= TRANS_PUSH_SEND; 720 721 if (HAS_PSR_TRANS_PUSH_FRAME_CHANGE(display)) 722 trans_vrr_push |= LNL_TRANS_PUSH_PSR_PR_EN; 723 724 return trans_vrr_push; 725 } 726 727 void intel_vrr_send_push(struct intel_dsb *dsb, 728 const struct intel_crtc_state *crtc_state) 729 { 730 struct intel_display *display = to_intel_display(crtc_state); 731 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 732 733 if (!crtc_state->vrr.enable && !intel_psr_use_trans_push(crtc_state)) 734 return; 735 736 if (dsb) 737 intel_dsb_nonpost_start(dsb); 738 739 intel_de_write_dsb(display, dsb, 740 TRANS_PUSH(display, cpu_transcoder), 741 trans_vrr_push(crtc_state, true)); 742 if (dsb) 743 intel_dsb_nonpost_end(dsb); 744 } 745 746 void intel_vrr_check_push_sent(struct intel_dsb *dsb, 747 const struct intel_crtc_state *crtc_state) 748 { 749 struct intel_display *display = to_intel_display(crtc_state); 750 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 751 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 752 753 if (!crtc_state->vrr.enable) 754 return; 755 756 /* 757 * Make sure the push send bit has cleared. This should 758 * already be the case as long as the caller makes sure 759 * this is called after the delayed vblank has occurred. 760 */ 761 if (dsb) { 762 int wait_us, count; 763 764 wait_us = 2; 765 count = 1; 766 767 /* 768 * If the bit hasn't cleared the DSB will 769 * raise the poll error interrupt. 770 */ 771 intel_dsb_poll(dsb, TRANS_PUSH(display, cpu_transcoder), 772 TRANS_PUSH_SEND, 0, wait_us, count); 773 } else { 774 if (intel_vrr_is_push_sent(crtc_state)) 775 drm_err(display->drm, "[CRTC:%d:%s] VRR push send still pending\n", 776 crtc->base.base.id, crtc->base.name); 777 } 778 } 779 780 bool intel_vrr_is_push_sent(const struct intel_crtc_state *crtc_state) 781 { 782 struct intel_display *display = to_intel_display(crtc_state); 783 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 784 785 if (!crtc_state->vrr.enable) 786 return false; 787 788 return intel_de_read(display, TRANS_PUSH(display, cpu_transcoder)) & TRANS_PUSH_SEND; 789 } 790 791 bool intel_vrr_always_use_vrr_tg(struct intel_display *display) 792 { 793 if (!HAS_VRR(display)) 794 return false; 795 796 if (DISPLAY_VER(display) >= 30) 797 return true; 798 799 return false; 800 } 801 802 static int intel_vrr_hw_vmin(const struct intel_crtc_state *crtc_state) 803 { 804 struct intel_display *display = to_intel_display(crtc_state); 805 806 return intel_vrr_hw_value(crtc_state, crtc_state->vrr.vmin) - 807 intel_vrr_vmin_flipline_offset(display); 808 } 809 810 static int intel_vrr_hw_vmax(const struct intel_crtc_state *crtc_state) 811 { 812 return intel_vrr_hw_value(crtc_state, crtc_state->vrr.vmax); 813 } 814 815 static int intel_vrr_hw_flipline(const struct intel_crtc_state *crtc_state) 816 { 817 return intel_vrr_hw_value(crtc_state, crtc_state->vrr.flipline); 818 } 819 820 static void intel_vrr_set_vrr_timings(const struct intel_crtc_state *crtc_state) 821 { 822 struct intel_display *display = to_intel_display(crtc_state); 823 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 824 825 intel_de_write(display, TRANS_VRR_VMIN(display, cpu_transcoder), 826 intel_vrr_hw_vmin(crtc_state) - 1); 827 intel_de_write(display, TRANS_VRR_VMAX(display, cpu_transcoder), 828 intel_vrr_hw_vmax(crtc_state) - 1); 829 intel_de_write(display, TRANS_VRR_FLIPLINE(display, cpu_transcoder), 830 intel_vrr_hw_flipline(crtc_state) - 1); 831 } 832 833 static void 834 intel_vrr_enable_dc_balancing(const struct intel_crtc_state *crtc_state) 835 { 836 struct intel_display *display = to_intel_display(crtc_state); 837 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 838 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 839 enum pipe pipe = crtc->pipe; 840 u32 vrr_ctl = intel_de_read(display, TRANS_VRR_CTL(display, cpu_transcoder)); 841 842 if (!crtc_state->vrr.dc_balance.enable) 843 return; 844 845 intel_de_write(display, TRANS_VRR_DCB_ADJ_VMAX_CFG(cpu_transcoder), 846 VRR_DCB_ADJ_VMAX(crtc_state->vrr.vmax - 1)); 847 intel_de_write(display, TRANS_VRR_DCB_ADJ_VMAX_CFG_LIVE(cpu_transcoder), 848 VRR_DCB_ADJ_VMAX(crtc_state->vrr.vmax - 1)); 849 intel_de_write(display, TRANS_VRR_DCB_VMAX(cpu_transcoder), 850 VRR_DCB_VMAX(crtc_state->vrr.vmax - 1)); 851 intel_de_write(display, TRANS_VRR_DCB_VMAX_LIVE(cpu_transcoder), 852 VRR_DCB_VMAX(crtc_state->vrr.vmax - 1)); 853 intel_de_write(display, TRANS_VRR_DCB_FLIPLINE(cpu_transcoder), 854 VRR_DCB_FLIPLINE(crtc_state->vrr.flipline - 1)); 855 intel_de_write(display, TRANS_VRR_DCB_FLIPLINE_LIVE(cpu_transcoder), 856 VRR_DCB_FLIPLINE(crtc_state->vrr.flipline - 1)); 857 intel_de_write(display, TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_LIVE(cpu_transcoder), 858 VRR_DCB_ADJ_FLIPLINE(crtc_state->vrr.flipline - 1)); 859 intel_de_write(display, TRANS_VRR_DCB_ADJ_FLIPLINE_CFG(cpu_transcoder), 860 VRR_DCB_ADJ_FLIPLINE(crtc_state->vrr.flipline - 1)); 861 intel_de_write(display, PIPEDMC_DCB_VMIN(pipe), 862 crtc_state->vrr.dc_balance.vmin - 1); 863 intel_de_write(display, PIPEDMC_DCB_VMAX(pipe), 864 crtc_state->vrr.dc_balance.vmax - 1); 865 intel_de_write(display, PIPEDMC_DCB_MAX_INCREASE(pipe), 866 crtc_state->vrr.dc_balance.max_increase); 867 intel_de_write(display, PIPEDMC_DCB_MAX_DECREASE(pipe), 868 crtc_state->vrr.dc_balance.max_decrease); 869 intel_de_write(display, PIPEDMC_DCB_GUARDBAND(pipe), 870 crtc_state->vrr.dc_balance.guardband); 871 intel_de_write(display, PIPEDMC_DCB_SLOPE(pipe), 872 crtc_state->vrr.dc_balance.slope); 873 intel_de_write(display, PIPEDMC_DCB_VBLANK(pipe), 874 crtc_state->vrr.dc_balance.vblank_target); 875 intel_dmc_configure_dc_balance_event(display, pipe, true); 876 intel_de_write(display, TRANS_ADAPTIVE_SYNC_DCB_CTL(cpu_transcoder), 877 ADAPTIVE_SYNC_COUNTER_EN); 878 intel_pipedmc_dcb_enable(NULL, crtc); 879 880 vrr_ctl |= VRR_CTL_DCB_ADJ_ENABLE; 881 intel_de_write(display, TRANS_VRR_CTL(display, cpu_transcoder), vrr_ctl); 882 } 883 884 static void 885 intel_vrr_disable_dc_balancing(const struct intel_crtc_state *old_crtc_state) 886 { 887 struct intel_display *display = to_intel_display(old_crtc_state); 888 enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder; 889 struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc); 890 enum pipe pipe = crtc->pipe; 891 u32 vrr_ctl = intel_de_read(display, TRANS_VRR_CTL(display, cpu_transcoder)); 892 893 if (!old_crtc_state->vrr.dc_balance.enable) 894 return; 895 896 intel_pipedmc_dcb_disable(NULL, crtc); 897 intel_dmc_configure_dc_balance_event(display, pipe, false); 898 intel_de_write(display, TRANS_ADAPTIVE_SYNC_DCB_CTL(cpu_transcoder), 0); 899 intel_de_write(display, PIPEDMC_DCB_VMIN(pipe), 0); 900 intel_de_write(display, PIPEDMC_DCB_VMAX(pipe), 0); 901 intel_de_write(display, PIPEDMC_DCB_MAX_INCREASE(pipe), 0); 902 intel_de_write(display, PIPEDMC_DCB_MAX_DECREASE(pipe), 0); 903 intel_de_write(display, PIPEDMC_DCB_GUARDBAND(pipe), 0); 904 intel_de_write(display, PIPEDMC_DCB_SLOPE(pipe), 0); 905 intel_de_write(display, PIPEDMC_DCB_VBLANK(pipe), 0); 906 intel_de_write(display, TRANS_VRR_DCB_ADJ_VMAX_CFG_LIVE(cpu_transcoder), 0); 907 intel_de_write(display, TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_LIVE(cpu_transcoder), 0); 908 intel_de_write(display, TRANS_VRR_DCB_VMAX_LIVE(cpu_transcoder), 0); 909 intel_de_write(display, TRANS_VRR_DCB_FLIPLINE_LIVE(cpu_transcoder), 0); 910 intel_de_write(display, TRANS_VRR_DCB_ADJ_VMAX_CFG(cpu_transcoder), 0); 911 intel_de_write(display, TRANS_VRR_DCB_ADJ_FLIPLINE_CFG(cpu_transcoder), 0); 912 intel_de_write(display, TRANS_VRR_DCB_VMAX(cpu_transcoder), 0); 913 intel_de_write(display, TRANS_VRR_DCB_FLIPLINE(cpu_transcoder), 0); 914 915 vrr_ctl &= ~VRR_CTL_DCB_ADJ_ENABLE; 916 intel_de_write(display, TRANS_VRR_CTL(display, cpu_transcoder), vrr_ctl); 917 } 918 919 static void intel_vrr_tg_enable(const struct intel_crtc_state *crtc_state, 920 bool cmrr_enable) 921 { 922 struct intel_display *display = to_intel_display(crtc_state); 923 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 924 u32 vrr_ctl; 925 926 intel_de_write(display, TRANS_PUSH(display, cpu_transcoder), 927 trans_vrr_push(crtc_state, false)); 928 929 vrr_ctl = VRR_CTL_VRR_ENABLE | trans_vrr_ctl(crtc_state); 930 931 /* 932 * FIXME this might be broken as bspec seems to imply that 933 * even VRR_CTL_CMRR_ENABLE is armed by TRANS_CMRR_N_HI 934 * when enabling CMRR (but not when disabling CMRR?). 935 */ 936 if (cmrr_enable) 937 vrr_ctl |= VRR_CTL_CMRR_ENABLE; 938 939 intel_de_write(display, TRANS_VRR_CTL(display, cpu_transcoder), vrr_ctl); 940 941 intel_cmtg_set_vrr_ctl(crtc_state); 942 } 943 944 static void intel_vrr_tg_disable(const struct intel_crtc_state *old_crtc_state) 945 { 946 struct intel_display *display = to_intel_display(old_crtc_state); 947 enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder; 948 949 intel_de_write(display, TRANS_VRR_CTL(display, cpu_transcoder), 950 trans_vrr_ctl(old_crtc_state)); 951 952 if (intel_de_wait_for_clear_ms(display, 953 TRANS_VRR_STATUS(display, cpu_transcoder), 954 VRR_STATUS_VRR_EN_LIVE, 1000)) 955 drm_err(display->drm, "Timed out waiting for VRR live status to clear\n"); 956 957 intel_de_rmw(display, TRANS_PUSH(display, cpu_transcoder), 958 TRANS_PUSH_EN, 0); 959 } 960 961 void intel_vrr_enable(const struct intel_crtc_state *crtc_state) 962 { 963 struct intel_display *display = to_intel_display(crtc_state); 964 965 if (!crtc_state->vrr.enable) 966 return; 967 968 intel_vrr_set_vrr_timings(crtc_state); 969 intel_vrr_enable_dc_balancing(crtc_state); 970 971 if (!intel_vrr_always_use_vrr_tg(display)) 972 intel_vrr_tg_enable(crtc_state, crtc_state->cmrr.enable); 973 } 974 975 void intel_vrr_disable(const struct intel_crtc_state *old_crtc_state) 976 { 977 struct intel_display *display = to_intel_display(old_crtc_state); 978 979 if (!old_crtc_state->vrr.enable) 980 return; 981 982 if (!intel_vrr_always_use_vrr_tg(display)) 983 intel_vrr_tg_disable(old_crtc_state); 984 985 intel_vrr_disable_dc_balancing(old_crtc_state); 986 intel_vrr_set_fixed_rr_timings(old_crtc_state, old_crtc_state->cpu_transcoder); 987 } 988 989 void intel_vrr_transcoder_enable(const struct intel_crtc_state *crtc_state) 990 { 991 struct intel_display *display = to_intel_display(crtc_state); 992 993 intel_vrr_set_transcoder_timings(crtc_state); 994 995 if (!intel_vrr_possible(crtc_state)) 996 return; 997 998 if (intel_vrr_always_use_vrr_tg(display)) 999 intel_vrr_tg_enable(crtc_state, false); 1000 } 1001 1002 void intel_vrr_transcoder_disable(const struct intel_crtc_state *old_crtc_state) 1003 { 1004 struct intel_display *display = to_intel_display(old_crtc_state); 1005 1006 if (!intel_vrr_possible(old_crtc_state)) 1007 return; 1008 1009 if (intel_vrr_always_use_vrr_tg(display)) 1010 intel_vrr_tg_disable(old_crtc_state); 1011 } 1012 1013 void intel_vrr_psr_frame_change_enable(const struct intel_crtc_state *crtc_state) 1014 { 1015 struct intel_display *display = to_intel_display(crtc_state); 1016 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 1017 1018 intel_de_write(display, TRANS_PUSH(display, cpu_transcoder), 1019 trans_vrr_push(crtc_state, false)); 1020 } 1021 1022 bool intel_vrr_is_fixed_rr(const struct intel_crtc_state *crtc_state) 1023 { 1024 return crtc_state->vrr.flipline && 1025 crtc_state->vrr.flipline == crtc_state->vrr.vmax && 1026 crtc_state->vrr.flipline == crtc_state->vrr.vmin; 1027 } 1028 1029 static 1030 void intel_vrr_get_dc_balance_config(struct intel_crtc_state *crtc_state) 1031 { 1032 u32 reg_val; 1033 struct intel_display *display = to_intel_display(crtc_state); 1034 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 1035 enum pipe pipe = crtc->pipe; 1036 1037 if (!intel_vrr_dc_balance_possible(crtc_state)) 1038 return; 1039 1040 reg_val = intel_de_read(display, PIPEDMC_DCB_VMIN(pipe)); 1041 crtc_state->vrr.dc_balance.vmin = reg_val ? reg_val + 1 : 0; 1042 1043 reg_val = intel_de_read(display, PIPEDMC_DCB_VMAX(pipe)); 1044 crtc_state->vrr.dc_balance.vmax = reg_val ? reg_val + 1 : 0; 1045 1046 crtc_state->vrr.dc_balance.guardband = 1047 intel_de_read(display, PIPEDMC_DCB_GUARDBAND(pipe)); 1048 crtc_state->vrr.dc_balance.max_increase = 1049 intel_de_read(display, PIPEDMC_DCB_MAX_INCREASE(pipe)); 1050 crtc_state->vrr.dc_balance.max_decrease = 1051 intel_de_read(display, PIPEDMC_DCB_MAX_DECREASE(pipe)); 1052 crtc_state->vrr.dc_balance.slope = 1053 intel_de_read(display, PIPEDMC_DCB_SLOPE(pipe)); 1054 crtc_state->vrr.dc_balance.vblank_target = 1055 intel_de_read(display, PIPEDMC_DCB_VBLANK(pipe)); 1056 } 1057 1058 void intel_vrr_get_config(struct intel_crtc_state *crtc_state) 1059 { 1060 struct intel_display *display = to_intel_display(crtc_state); 1061 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 1062 u32 trans_vrr_ctl, trans_vrr_vsync; 1063 bool vrr_enable; 1064 1065 trans_vrr_ctl = intel_de_read(display, 1066 TRANS_VRR_CTL(display, cpu_transcoder)); 1067 1068 if (HAS_CMRR(display)) 1069 crtc_state->cmrr.enable = (trans_vrr_ctl & VRR_CTL_CMRR_ENABLE); 1070 1071 if (crtc_state->cmrr.enable) { 1072 crtc_state->cmrr.cmrr_n = 1073 intel_de_read64_2x32(display, TRANS_CMRR_N_LO(display, cpu_transcoder)); 1074 crtc_state->cmrr.cmrr_m = 1075 intel_de_read64_2x32(display, TRANS_CMRR_M_LO(display, cpu_transcoder)); 1076 } 1077 1078 if (DISPLAY_VER(display) >= 13) { 1079 crtc_state->vrr.guardband = 1080 REG_FIELD_GET(XELPD_VRR_CTL_VRR_GUARDBAND_MASK, trans_vrr_ctl); 1081 } else { 1082 if (trans_vrr_ctl & VRR_CTL_PIPELINE_FULL_OVERRIDE) { 1083 crtc_state->vrr.pipeline_full = 1084 REG_FIELD_GET(VRR_CTL_PIPELINE_FULL_MASK, trans_vrr_ctl); 1085 1086 crtc_state->vrr.guardband = 1087 intel_vrr_pipeline_full_to_guardband(crtc_state, 1088 crtc_state->vrr.pipeline_full); 1089 } 1090 } 1091 1092 if (trans_vrr_ctl & VRR_CTL_FLIP_LINE_EN) { 1093 crtc_state->vrr.flipline = intel_de_read(display, 1094 TRANS_VRR_FLIPLINE(display, cpu_transcoder)) + 1; 1095 crtc_state->vrr.vmax = intel_de_read(display, 1096 TRANS_VRR_VMAX(display, cpu_transcoder)) + 1; 1097 crtc_state->vrr.vmin = intel_de_read(display, 1098 TRANS_VRR_VMIN(display, cpu_transcoder)) + 1; 1099 1100 if (DISPLAY_VER(display) < 13) { 1101 /* undo what intel_vrr_hw_value() does when writing the values */ 1102 crtc_state->vrr.flipline += crtc_state->set_context_latency; 1103 crtc_state->vrr.vmax += crtc_state->set_context_latency; 1104 crtc_state->vrr.vmin += crtc_state->set_context_latency; 1105 1106 crtc_state->vrr.vmin += intel_vrr_vmin_flipline_offset(display); 1107 } 1108 1109 if (HAS_AS_SDP(display)) { 1110 trans_vrr_vsync = 1111 intel_de_read(display, 1112 TRANS_VRR_VSYNC(display, cpu_transcoder)); 1113 crtc_state->vrr.vsync_start = 1114 REG_FIELD_GET(VRR_VSYNC_START_MASK, trans_vrr_vsync); 1115 crtc_state->vrr.vsync_end = 1116 REG_FIELD_GET(VRR_VSYNC_END_MASK, trans_vrr_vsync); 1117 } 1118 } 1119 1120 vrr_enable = trans_vrr_ctl & VRR_CTL_VRR_ENABLE; 1121 1122 if (intel_vrr_always_use_vrr_tg(display)) 1123 crtc_state->vrr.enable = vrr_enable && !intel_vrr_is_fixed_rr(crtc_state); 1124 else 1125 crtc_state->vrr.enable = vrr_enable; 1126 1127 intel_vrr_get_dc_balance_config(crtc_state); 1128 1129 /* 1130 * #TODO: For Both VRR and CMRR the flag I915_MODE_FLAG_VRR is set for mode_flags. 1131 * Since CMRR is currently disabled, set this flag for VRR for now. 1132 * Need to keep this in mind while re-enabling CMRR. 1133 */ 1134 if (crtc_state->vrr.enable) 1135 crtc_state->mode_flags |= I915_MODE_FLAG_VRR; 1136 1137 /* 1138 * For platforms that always use the VRR timing generator, we overwrite 1139 * crtc_vblank_start with vtotal - guardband to reflect the delayed 1140 * vblank start. This works for both default and optimized guardband values. 1141 * On other platforms, we keep the original value from 1142 * intel_get_transcoder_timings() and apply adjustments only in VRR-specific 1143 * paths as needed. 1144 */ 1145 if (intel_vrr_always_use_vrr_tg(display)) 1146 crtc_state->hw.adjusted_mode.crtc_vblank_start = 1147 crtc_state->hw.adjusted_mode.crtc_vtotal - 1148 crtc_state->vrr.guardband; 1149 } 1150 1151 int intel_vrr_safe_window_start(const struct intel_crtc_state *crtc_state) 1152 { 1153 struct intel_display *display = to_intel_display(crtc_state); 1154 1155 if (DISPLAY_VER(display) >= 30) 1156 return crtc_state->hw.adjusted_mode.crtc_vdisplay - 1157 crtc_state->set_context_latency; 1158 else 1159 return crtc_state->hw.adjusted_mode.crtc_vdisplay; 1160 } 1161 1162 static int 1163 intel_vrr_dcb_vmin_vblank_start(const struct intel_crtc_state *crtc_state) 1164 { 1165 return (intel_vrr_dcb_vmin_vblank_start_next(crtc_state) < 0) ? 1166 intel_vrr_dcb_vmin_vblank_start_final(crtc_state) : 1167 intel_vrr_dcb_vmin_vblank_start_next(crtc_state); 1168 } 1169 1170 int intel_vrr_vmin_safe_window_end(const struct intel_crtc_state *crtc_state) 1171 { 1172 int vmin_vblank_start = crtc_state->vrr.dc_balance.enable ? 1173 intel_vrr_dcb_vmin_vblank_start(crtc_state) : 1174 intel_vrr_vmin_vblank_start(crtc_state); 1175 1176 return vmin_vblank_start - crtc_state->set_context_latency; 1177 } 1178 1179 int intel_vrr_dcb_vmin_vblank_start_next(const struct intel_crtc_state *crtc_state) 1180 { 1181 struct intel_display *display = to_intel_display(crtc_state); 1182 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 1183 u32 tmp = 0; 1184 1185 tmp = intel_de_read(display, TRANS_VRR_DCB_ADJ_FLIPLINE_CFG_LIVE(cpu_transcoder)); 1186 1187 if (REG_FIELD_GET(VRR_DCB_ADJ_FLIPLINE_CNT_MASK, tmp) == 0) 1188 return -EINVAL; 1189 1190 return intel_vrr_vblank_start(crtc_state, VRR_DCB_ADJ_FLIPLINE(tmp) + 1); 1191 } 1192 1193 int intel_vrr_dcb_vmax_vblank_start_next(const struct intel_crtc_state *crtc_state) 1194 { 1195 struct intel_display *display = to_intel_display(crtc_state); 1196 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 1197 u32 tmp = 0; 1198 1199 tmp = intel_de_read(display, TRANS_VRR_DCB_ADJ_VMAX_CFG_LIVE(cpu_transcoder)); 1200 1201 if (REG_FIELD_GET(VRR_DCB_ADJ_VMAX_CNT_MASK, tmp) == 0) 1202 return -EINVAL; 1203 1204 return intel_vrr_vblank_start(crtc_state, VRR_DCB_ADJ_VMAX(tmp) + 1); 1205 } 1206 1207 int intel_vrr_dcb_vmin_vblank_start_final(const struct intel_crtc_state *crtc_state) 1208 { 1209 struct intel_display *display = to_intel_display(crtc_state); 1210 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 1211 u32 tmp = 0; 1212 1213 tmp = intel_de_read(display, TRANS_VRR_DCB_FLIPLINE_LIVE(cpu_transcoder)); 1214 1215 return intel_vrr_vblank_start(crtc_state, VRR_DCB_FLIPLINE(tmp) + 1); 1216 } 1217 1218 int intel_vrr_dcb_vmax_vblank_start_final(const struct intel_crtc_state *crtc_state) 1219 { 1220 struct intel_display *display = to_intel_display(crtc_state); 1221 enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; 1222 u32 tmp = 0; 1223 1224 tmp = intel_de_read(display, TRANS_VRR_DCB_VMAX_LIVE(cpu_transcoder)); 1225 1226 return intel_vrr_vblank_start(crtc_state, VRR_DCB_VMAX(tmp) + 1); 1227 } 1228