drm/i915/display/vrr: Configure and enable VRR in modeset enable
authorManasi Navare <manasi.d.navare@intel.com>
Fri, 22 Jan 2021 23:26:39 +0000 (15:26 -0800)
committerManasi Navare <manasi.d.navare@intel.com>
Mon, 25 Jan 2021 23:23:17 +0000 (15:23 -0800)
This patch computes the VRR parameters from VRR crtc states
and configures them in VRR registers during CRTC enable in
the modeset enable sequence.

v2:
* Remove initialization to 0 (Jani N)
* Use correct pipe %c (Jani N)

v3:
* Remove debug prints (Ville)
* Use cpu_trans instead of pipe for TRANS_VRR regs (Ville)

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Manasi Navare <manasi.d.navare@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210122232647.22688-10-manasi.d.navare@intel.com
drivers/gpu/drm/i915/display/intel_ddi.c
drivers/gpu/drm/i915/display/intel_vrr.c
drivers/gpu/drm/i915/display/intel_vrr.h

index d4c09a1..d1cb049 100644 (file)
@@ -51,6 +51,7 @@
 #include "intel_sprite.h"
 #include "intel_tc.h"
 #include "intel_vdsc.h"
+#include "intel_vrr.h"
 
 struct ddi_buf_trans {
        u32 trans1;     /* balance leg enable, de-emph level */
@@ -4310,6 +4311,8 @@ static void intel_enable_ddi(struct intel_atomic_state *state,
        if (!crtc_state->bigjoiner_slave)
                intel_ddi_enable_transcoder_func(encoder, crtc_state);
 
+       intel_vrr_enable(encoder, crtc_state);
+
        intel_enable_pipe(crtc_state);
 
        intel_crtc_vblank_on(crtc_state);
index 346ea3c..b2545dd 100644 (file)
@@ -99,3 +99,25 @@ intel_vrr_compute_config(struct intel_crtc_state *crtc_state,
        crtc_state->vrr.pipeline_full =
                min(255, crtc_state->vrr.vmin - adjusted_mode->crtc_vdisplay - 4 - 1);
 }
+
+void intel_vrr_enable(struct intel_encoder *encoder,
+                     const struct intel_crtc_state *crtc_state)
+{
+       struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
+       enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
+       u32 trans_vrr_ctl;
+
+       if (!crtc_state->vrr.enable)
+               return;
+
+       trans_vrr_ctl = VRR_CTL_VRR_ENABLE |
+               VRR_CTL_IGN_MAX_SHIFT | VRR_CTL_FLIP_LINE_EN |
+               VRR_CTL_PIPELINE_FULL(crtc_state->vrr.pipeline_full) |
+               VRR_CTL_PIPELINE_FULL_OVERRIDE;
+
+       intel_de_write(dev_priv, TRANS_VRR_VMIN(cpu_transcoder), crtc_state->vrr.vmin - 1);
+       intel_de_write(dev_priv, TRANS_VRR_VMAX(cpu_transcoder), crtc_state->vrr.vmax - 1);
+       intel_de_write(dev_priv, TRANS_VRR_CTL(cpu_transcoder), trans_vrr_ctl);
+       intel_de_write(dev_priv, TRANS_VRR_FLIPLINE(cpu_transcoder), crtc_state->vrr.flipline - 1);
+       intel_de_write(dev_priv, TRANS_PUSH(cpu_transcoder), TRANS_PUSH_EN);
+}
index 992b9c5..7ec106a 100644 (file)
@@ -14,10 +14,13 @@ struct intel_atomic_state;
 struct intel_crtc;
 struct intel_crtc_state;
 struct intel_dp;
+struct intel_encoder;
 
 bool intel_vrr_is_capable(struct drm_connector *connector);
 void intel_vrr_check_modeset(struct intel_atomic_state *state);
 void intel_vrr_compute_config(struct intel_crtc_state *crtc_state,
                              struct drm_connector_state *conn_state);
+void intel_vrr_enable(struct intel_encoder *encoder,
+                     const struct intel_crtc_state *crtc_state);
 
 #endif /* __INTEL_VRR_H__ */