Lines Matching +full:timing +full:- +full:adjustment
1 // SPDX-License-Identifier: MIT
3 * Copyright © 2022-2023 Intel Corporation
18 * This timing diagram depicts the video signal in and
34 * | may be shifted forward 1-3 extra lines via TRANSCONF
41 * ----va---> <-----------------vb--------------------> <--------va-------------
42 * | | <----vs-----> |
43 …* -vbs-----> <---vbs+1---> <---vbs+2---> <-----0-----> <-----1-----> <-----2--- (scanline counter …
44 …* -vbs-2---> <---vbs-1---> <---vbs-----> <---vbs+1---> <---vbs+2---> <-----0--- (scanline counter …
45 …* -vbs-2---> <---vbs-2---> <---vbs-1---> <---vbs-----> <---vbs+1---> <---vbs+2- (scanline counter …
60 * - most events happen at the start of horizontal sync
61 * - frame start happens at the start of horizontal blank, 1-4 lines
63 * - gen3/4 pixel and frame counter are synchronized with the start
72 struct intel_display *display = to_intel_display(crtc->dev); in i915_get_vblank_counter()
74 const struct drm_display_mode *mode = &vblank->hwmode; in i915_get_vblank_counter()
75 enum pipe pipe = to_intel_crtc(crtc)->pipe; in i915_get_vblank_counter()
86 * does not like us returning non-zero frame counter values in i915_get_vblank_counter()
88 * counter. Thus we must stop non-zero values leaking out. in i915_get_vblank_counter()
90 if (!vblank->max_vblank_count) in i915_get_vblank_counter()
93 htotal = mode->crtc_htotal; in i915_get_vblank_counter()
94 hsync_start = mode->crtc_hsync_start; in i915_get_vblank_counter()
101 vbl_start -= htotal - hsync_start; in i915_get_vblank_counter()
124 struct intel_display *display = to_intel_display(crtc->dev); in g4x_get_vblank_counter()
126 enum pipe pipe = to_intel_crtc(crtc)->pipe; in g4x_get_vblank_counter()
128 if (!vblank->max_vblank_count) in g4x_get_vblank_counter()
137 struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(&crtc->base); in intel_crtc_scanlines_since_frame_timestamp()
138 const struct drm_display_mode *mode = &vblank->hwmode; in intel_crtc_scanlines_since_frame_timestamp()
139 u32 htotal = mode->crtc_htotal; in intel_crtc_scanlines_since_frame_timestamp()
140 u32 clock = mode->crtc_clock; in intel_crtc_scanlines_since_frame_timestamp()
156 PIPE_FRMTMSTMP(crtc->pipe)); in intel_crtc_scanlines_since_frame_timestamp()
165 PIPE_FRMTMSTMP(crtc->pipe)); in intel_crtc_scanlines_since_frame_timestamp()
168 return div_u64(mul_u32_u32(scan_curr_time - scan_prev_time, in intel_crtc_scanlines_since_frame_timestamp()
182 struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(&crtc->base); in __intel_get_crtc_scanline_from_timestamp()
183 const struct drm_display_mode *mode = &vblank->hwmode; in __intel_get_crtc_scanline_from_timestamp()
184 u32 vblank_start = mode->crtc_vblank_start; in __intel_get_crtc_scanline_from_timestamp()
185 u32 vtotal = mode->crtc_vtotal; in __intel_get_crtc_scanline_from_timestamp()
189 scanline = min(scanline, vtotal - 1); in __intel_get_crtc_scanline_from_timestamp()
202 * On most platforms it starts counting from vtotal-1 on the in intel_crtc_scanline_offset()
206 * last active line), the scanline counter will read vblank_start-1. in intel_crtc_scanline_offset()
209 * of vtotal-1, so we have to subtract one. in intel_crtc_scanline_offset()
226 return -1; in intel_crtc_scanline_offset()
240 struct drm_vblank_crtc *vblank = drm_crtc_vblank_crtc(&crtc->base); in __intel_get_crtc_scanline()
241 const struct drm_display_mode *mode = &vblank->hwmode; in __intel_get_crtc_scanline()
242 enum pipe pipe = crtc->pipe; in __intel_get_crtc_scanline()
245 if (!crtc->active) in __intel_get_crtc_scanline()
248 if (crtc->mode_flags & I915_MODE_FLAG_GET_SCANLINE_FROM_TIMESTAMP) in __intel_get_crtc_scanline()
283 * scanline_offset adjustment. in __intel_get_crtc_scanline()
285 return (position + vtotal + crtc->scanline_offset) % vtotal; in __intel_get_crtc_scanline()
300 __acquires(i915->uncore.lock) in intel_vblank_section_enter()
302 struct drm_i915_private *i915 = to_i915(display->drm); in intel_vblank_section_enter()
303 spin_lock(&i915->uncore.lock); in intel_vblank_section_enter()
307 __releases(i915->uncore.lock) in intel_vblank_section_exit()
309 struct drm_i915_private *i915 = to_i915(display->drm); in intel_vblank_section_exit()
310 spin_unlock(&i915->uncore.lock); in intel_vblank_section_exit()
328 struct intel_display *display = to_intel_display(_crtc->dev); in i915_get_crtc_scanoutpos()
330 enum pipe pipe = crtc->pipe; in i915_get_crtc_scanoutpos()
335 display->platform.g4x || DISPLAY_VER(display) == 2 || in i915_get_crtc_scanoutpos()
336 crtc->mode_flags & I915_MODE_FLAG_USE_SCANLINE_COUNTER; in i915_get_crtc_scanoutpos()
338 if (drm_WARN_ON(display->drm, !mode->crtc_clock)) { in i915_get_crtc_scanoutpos()
339 drm_dbg(display->drm, in i915_get_crtc_scanoutpos()
345 htotal = mode->crtc_htotal; in i915_get_crtc_scanoutpos()
346 hsync_start = mode->crtc_hsync_start; in i915_get_crtc_scanoutpos()
353 * timing critical raw register reads, potentially with in i915_get_crtc_scanoutpos()
365 if (crtc->mode_flags & I915_MODE_FLAG_VRR) { in i915_get_crtc_scanoutpos()
377 position = min(crtc->vmax_vblank_start + scanlines, vtotal - 1); in i915_get_crtc_scanoutpos()
405 position = min(position, vtotal - 1); in i915_get_crtc_scanoutpos()
414 * always add htotal-hsync_start to the current pixel position. in i915_get_crtc_scanoutpos()
416 position = (position + htotal - hsync_start) % vtotal; in i915_get_crtc_scanoutpos()
435 position -= vbl_end; in i915_get_crtc_scanoutpos()
437 position += vtotal - vbl_end; in i915_get_crtc_scanoutpos()
444 *hpos = position - (*vpos * htotal); in i915_get_crtc_scanoutpos()
491 enum pipe pipe = crtc->pipe; in wait_for_pipe_scanline_moving()
495 drm_err(display->drm, in wait_for_pipe_scanline_moving()
514 struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); in intel_crtc_update_active_timings()
515 u8 mode_flags = crtc_state->mode_flags; in intel_crtc_update_active_timings()
520 drm_mode_init(&adjusted_mode, &crtc_state->hw.adjusted_mode); in intel_crtc_update_active_timings()
523 drm_WARN_ON(display->drm, in intel_crtc_update_active_timings()
526 adjusted_mode.crtc_vtotal = crtc_state->vrr.vmax; in intel_crtc_update_active_timings()
527 adjusted_mode.crtc_vblank_end = crtc_state->vrr.vmax; in intel_crtc_update_active_timings()
546 spin_lock_irqsave(&display->drm->vblank_time_lock, irqflags); in intel_crtc_update_active_timings()
549 drm_calc_timestamping_constants(&crtc->base, &adjusted_mode); in intel_crtc_update_active_timings()
551 crtc->vmax_vblank_start = vmax_vblank_start; in intel_crtc_update_active_timings()
553 crtc->mode_flags = mode_flags; in intel_crtc_update_active_timings()
555 crtc->scanline_offset = intel_crtc_scanline_offset(crtc_state); in intel_crtc_update_active_timings()
557 spin_unlock_irqrestore(&display->drm->vblank_time_lock, irqflags); in intel_crtc_update_active_timings()
562 int vdisplay = mode->crtc_vdisplay; in intel_mode_vdisplay()
564 if (mode->flags & DRM_MODE_FLAG_INTERLACE) in intel_mode_vdisplay()
572 int vblank_start = mode->crtc_vblank_start; in intel_mode_vblank_start()
574 if (mode->flags & DRM_MODE_FLAG_INTERLACE) in intel_mode_vblank_start()
582 int vblank_end = mode->crtc_vblank_end; in intel_mode_vblank_end()
584 if (mode->flags & DRM_MODE_FLAG_INTERLACE) in intel_mode_vblank_end()
592 int vtotal = mode->crtc_vtotal; in intel_mode_vtotal()
594 if (mode->flags & DRM_MODE_FLAG_INTERLACE) in intel_mode_vtotal()
605 struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc); in intel_vblank_evade_init()
609 evade->crtc = crtc; in intel_vblank_evade_init()
611 evade->need_vlv_dsi_wa = (display->platform.valleyview || in intel_vblank_evade_init()
612 display->platform.cherryview) && in intel_vblank_evade_init()
626 adjusted_mode = &crtc_state->hw.adjusted_mode; in intel_vblank_evade_init()
628 if (crtc->mode_flags & I915_MODE_FLAG_VRR) { in intel_vblank_evade_init()
629 /* timing changes should happen with VRR disabled */ in intel_vblank_evade_init()
630 drm_WARN_ON(crtc->base.dev, intel_crtc_needs_modeset(new_crtc_state) || in intel_vblank_evade_init()
631 new_crtc_state->update_m_n || new_crtc_state->update_lrr); in intel_vblank_evade_init()
634 evade->vblank_start = intel_vrr_vmin_vblank_start(crtc_state); in intel_vblank_evade_init()
636 evade->vblank_start = intel_vrr_vmax_vblank_start(crtc_state); in intel_vblank_evade_init()
638 evade->vblank_start = intel_mode_vblank_start(adjusted_mode); in intel_vblank_evade_init()
642 evade->min = evade->vblank_start - intel_usecs_to_scanlines(adjusted_mode, in intel_vblank_evade_init()
644 evade->max = evade->vblank_start - 1; in intel_vblank_evade_init()
655 new_crtc_state->update_m_n || new_crtc_state->update_lrr) in intel_vblank_evade_init()
656 evade->min -= intel_mode_vblank_start(adjusted_mode) - in intel_vblank_evade_init()
663 struct intel_crtc *crtc = evade->crtc; in intel_vblank_evade()
666 wait_queue_head_t *wq = drm_crtc_vblank_waitqueue(&crtc->base); in intel_vblank_evade()
670 if (evade->min <= 0 || evade->max <= 0) in intel_vblank_evade()
682 if (scanline < evade->min || scanline > evade->max) in intel_vblank_evade()
686 drm_err(display->drm, in intel_vblank_evade()
688 pipe_name(crtc->pipe)); in intel_vblank_evade()
716 while (evade->need_vlv_dsi_wa && scanline == evade->vblank_start) in intel_vblank_evade()