]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/i915/vrr: Track vrr.enable only for variable timing
authorAnkit Nautiyal <ankit.k.nautiyal@intel.com>
Tue, 11 Mar 2025 09:37:48 +0000 (15:07 +0530)
committerAnkit Nautiyal <ankit.k.nautiyal@intel.com>
Thu, 13 Mar 2025 12:15:27 +0000 (17:45 +0530)
Since CMRR is now disabled, use the flag vrr.enable to tracks if vrr timing
generator is used with variable timings.

Avoid setting vrr.enable for CMRR and adjust readout to not set vrr.enable
when vmax == vmin == flipline (fixed refresh rate timing).

v2: Use intel_vrr_vmin_flipline() to account for adjustments required
for icl/tgl. (Ville)

v3: Add a #TODO for handling I915_MODE_FLAG_VRR better for CMRR. (Ville)

Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250311093751.1329043-6-ankit.k.nautiyal@intel.com
drivers/gpu/drm/i915/display/intel_vrr.c

index a57659820f4be569683d59195ae91af2620c643e..7320eb97991f6c41c2ade9c7e6ca4f4df56b9d44 100644 (file)
@@ -226,7 +226,6 @@ cmrr_get_vtotal(struct intel_crtc_state *crtc_state, bool video_mode_required)
 static
 void intel_vrr_compute_cmrr_timings(struct intel_crtc_state *crtc_state)
 {
-       crtc_state->vrr.enable = true;
        crtc_state->cmrr.enable = true;
        /*
         * TODO: Compute precise target refresh rate to determine
@@ -527,6 +526,14 @@ void intel_vrr_disable(const struct intel_crtc_state *old_crtc_state)
        intel_de_write(display, TRANS_PUSH(display, cpu_transcoder), 0);
 }
 
+static
+bool intel_vrr_is_fixed_rr(const struct intel_crtc_state *crtc_state)
+{
+       return crtc_state->vrr.flipline &&
+              crtc_state->vrr.flipline == crtc_state->vrr.vmax &&
+              crtc_state->vrr.flipline == intel_vrr_vmin_flipline(crtc_state);
+}
+
 void intel_vrr_get_config(struct intel_crtc_state *crtc_state)
 {
        struct intel_display *display = to_intel_display(crtc_state);
@@ -536,7 +543,6 @@ void intel_vrr_get_config(struct intel_crtc_state *crtc_state)
        trans_vrr_ctl = intel_de_read(display,
                                      TRANS_VRR_CTL(display, cpu_transcoder));
 
-       crtc_state->vrr.enable = trans_vrr_ctl & VRR_CTL_VRR_ENABLE;
        if (HAS_CMRR(display))
                crtc_state->cmrr.enable = (trans_vrr_ctl & VRR_CTL_CMRR_ENABLE);
 
@@ -576,6 +582,14 @@ void intel_vrr_get_config(struct intel_crtc_state *crtc_state)
                }
        }
 
+       crtc_state->vrr.enable = trans_vrr_ctl & VRR_CTL_VRR_ENABLE &&
+                                !intel_vrr_is_fixed_rr(crtc_state);
+
+       /*
+        * #TODO: For Both VRR and CMRR the flag I915_MODE_FLAG_VRR is set for mode_flags.
+        * Since CMRR is currently disabled, set this flag for VRR for now.
+        * Need to keep this in mind while re-enabling CMRR.
+        */
        if (crtc_state->vrr.enable)
                crtc_state->mode_flags |= I915_MODE_FLAG_VRR;
 }