@@ -2642,9 +2642,21 @@ static void intel_crtc_set_vtotal(struct intel_display *display,
enum transcoder cpu_transcoder,
u32 crtc_vdisplay, u32 crtc_vtotal)
{
+ u32 vtotal_bits;
+
+ /*
+ * For platforms that always use VRR Timing Generator, the VTOTAL.Vtotal
+ * bits are not required. Since the support for these bits is going to
+ * be deprecated in upcoming platforms, avoid writing these bits for the
+ * platforms that do not use legacy Timing Generator.
+ */
+ if (intel_vrr_always_use_vrr_tg(display))
+ vtotal_bits = 0;
+ else
+ vtotal_bits = VTOTAL(crtc_vtotal - 1);
+
intel_de_write(display, TRANS_VTOTAL(display, cpu_transcoder),
- VACTIVE(crtc_vdisplay - 1) |
- VTOTAL(crtc_vtotal - 1));
+ VACTIVE(crtc_vdisplay - 1) | vtotal_bits);
}
static void intel_set_transcoder_timings(const struct intel_crtc_state *crtc_state)
@@ -2819,7 +2831,18 @@ static void intel_crtc_get_vtotal(struct intel_crtc_state *crtc_state)
u32 tmp = intel_de_read(display, TRANS_VTOTAL(display, cpu_transcoder));
adjusted_mode->crtc_vdisplay = REG_FIELD_GET(VACTIVE_MASK, tmp) + 1;
- adjusted_mode->crtc_vtotal = REG_FIELD_GET(VTOTAL_MASK, tmp) + 1;
+
+ /*
+ * For platforms that always use VRR Timing Generator, the VTOTAL.Vtotal
+ * bits are not filled. Since for these platforms TRAN_VMIN is always
+ * filled with crtc_vtotal, use TRAN_VRR_VMIN to get the vtotal for
+ * adjusted_mode.
+ */
+ if (intel_vrr_always_use_vrr_tg(display)) {
+ adjusted_mode->crtc_vtotal = intel_vrr_get_vtotal_vmin(crtc_state);
+ } else {
+ adjusted_mode->crtc_vtotal = REG_FIELD_GET(VTOTAL_MASK, tmp) + 1;
+ }
}
static void intel_get_transcoder_timings(struct intel_crtc *crtc,
@@ -734,3 +734,11 @@ void intel_vrr_get_config(struct intel_crtc_state *crtc_state)
if (crtc_state->vrr.enable)
crtc_state->mode_flags |= I915_MODE_FLAG_VRR;
}
+
+int intel_vrr_get_vtotal_vmin(struct intel_crtc_state *crtc_state)
+{
+ struct intel_display *display = to_intel_display(crtc_state);
+ enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
+
+ return intel_de_read(display, TRANS_VRR_VMIN(display, cpu_transcoder)) + 1;
+}
@@ -41,5 +41,6 @@ void intel_vrr_transcoder_enable(const struct intel_crtc_state *crtc_state);
void intel_vrr_transcoder_disable(const struct intel_crtc_state *crtc_state);
void intel_vrr_set_fixed_rr_timings(const struct intel_crtc_state *crtc_state);
bool intel_vrr_always_use_vrr_tg(struct intel_display *display);
+int intel_vrr_get_vtotal_vmin(struct intel_crtc_state *crtc_state);
#endif /* __INTEL_VRR_H__ */
For platforms that always use VRR Timing Generator, the VTOTAL.Vtotal bits are not required. Since the support for these bits is going to be deprecated in upcoming platforms, avoid writing these bits for the platforms that do not use legacy Timing Generator. Since for these platforms TRAN_VMIN is always filled with crtc_vtotal, use TRAN_VRR_VMIN to get the vtotal for adjusted_mode. Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com> --- drivers/gpu/drm/i915/display/intel_display.c | 29 ++++++++++++++++++-- drivers/gpu/drm/i915/display/intel_vrr.c | 8 ++++++ drivers/gpu/drm/i915/display/intel_vrr.h | 1 + 3 files changed, 35 insertions(+), 3 deletions(-)