]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/i915/dsb: Introduce intel_dsb_wait_vblank_delay()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Mon, 30 Sep 2024 17:04:11 +0000 (20:04 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 3 Oct 2024 21:33:21 +0000 (00:33 +0300)
Add intel_dsb_wait_vblank_delay() which instructs the DSB
to wait for duration between the undelayed and delayed vblanks.
We'll need this as the DSB can only directly wait for the
undelayed vblank, but we'll need to wait until the delayed
vblank has elapsed as well.

Reviewed-by: Animesh Manna <animesh.manna@intel.com>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240930170415.23841-10-ville.syrjala@linux.intel.com
drivers/gpu/drm/i915/display/intel_dsb.c
drivers/gpu/drm/i915/display/intel_dsb.h

index 373e815a7639ff59fd34ada27a45e3a7081fca0a..780f4cee59d657f127ec2503fb7e972e908a8a30 100644 (file)
@@ -637,6 +637,17 @@ void intel_dsb_chain(struct intel_atomic_state *state,
                         wait_for_vblank ? DSB_WAIT_FOR_VBLANK : 0);
 }
 
+void intel_dsb_wait_vblank_delay(struct intel_atomic_state *state,
+                                struct intel_dsb *dsb)
+{
+       struct intel_crtc *crtc = dsb->crtc;
+       const struct intel_crtc_state *crtc_state = pre_commit_crtc_state(state, crtc);
+       int usecs = intel_scanlines_to_usecs(&crtc_state->hw.adjusted_mode,
+                                            dsb_vblank_delay(crtc_state)) + 1;
+
+       intel_dsb_wait_usec(dsb, usecs);
+}
+
 static void _intel_dsb_commit(struct intel_dsb *dsb, u32 ctrl,
                              int hw_dewake_scanline)
 {
index 115f51c75a1e46e357cba50f74e1e8056a93f91d..33e0fc2ab3809436446461319d3a3a029b855927 100644 (file)
@@ -42,6 +42,8 @@ void intel_dsb_nonpost_end(struct intel_dsb *dsb);
 void intel_dsb_interrupt(struct intel_dsb *dsb);
 void intel_dsb_wait_usec(struct intel_dsb *dsb, int count);
 void intel_dsb_wait_vblanks(struct intel_dsb *dsb, int count);
+void intel_dsb_wait_vblank_delay(struct intel_atomic_state *state,
+                                struct intel_dsb *dsb);
 void intel_dsb_wait_scanline_in(struct intel_atomic_state *state,
                                struct intel_dsb *dsb,
                                int lower, int upper);