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