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