#include "intel_display_types.h"
 #include "intel_psr.h"
 #include "intel_sprite.h"
+#include "intel_hdmi.h"
 
 /**
  * DOC: Panel Self Refresh (PSR/SRD)
        }
 }
 
-static void intel_psr_setup_vsc(struct intel_dp *intel_dp,
-                               const struct intel_crtc_state *crtc_state)
-{
-       struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
-       struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
-       struct dp_sdp psr_vsc;
-
-       if (dev_priv->psr.psr2_enabled) {
-               /* Prepare VSC Header for SU as per EDP 1.4 spec, Table 6.11 */
-               memset(&psr_vsc, 0, sizeof(psr_vsc));
-               psr_vsc.sdp_header.HB0 = 0;
-               psr_vsc.sdp_header.HB1 = 0x7;
-               if (dev_priv->psr.colorimetry_support) {
-                       psr_vsc.sdp_header.HB2 = 0x5;
-                       psr_vsc.sdp_header.HB3 = 0x13;
-               } else {
-                       psr_vsc.sdp_header.HB2 = 0x4;
-                       psr_vsc.sdp_header.HB3 = 0xe;
-               }
-       } else {
-               /* Prepare VSC packet as per EDP 1.3 spec, Table 3.10 */
-               memset(&psr_vsc, 0, sizeof(psr_vsc));
-               psr_vsc.sdp_header.HB0 = 0;
-               psr_vsc.sdp_header.HB1 = 0x7;
-               psr_vsc.sdp_header.HB2 = 0x2;
-               psr_vsc.sdp_header.HB3 = 0x8;
-       }
-
-       intel_dig_port->write_infoframe(&intel_dig_port->base,
-                                       crtc_state,
-                                       DP_SDP_VSC, &psr_vsc, sizeof(psr_vsc));
-}
-
 static void hsw_psr_setup_aux(struct intel_dp *intel_dp)
 {
        struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
        if (intel_dp != dev_priv->psr.dp)
                return;
 
+       if (!psr_global_enabled(dev_priv))
+               return;
        /*
         * HSW spec explicitly says PSR is tied to port A.
         * BDW+ platforms have a instance of PSR registers per transcoder but
 
        crtc_state->has_psr = true;
        crtc_state->has_psr2 = intel_psr2_config_valid(intel_dp, crtc_state);
+       crtc_state->infoframes.enable |= intel_hdmi_infoframe_enable(DP_SDP_VSC);
 }
 
 static void intel_psr_activate(struct intel_dp *intel_dp)
 }
 
 static void intel_psr_enable_locked(struct drm_i915_private *dev_priv,
-                                   const struct intel_crtc_state *crtc_state)
+                                   const struct intel_crtc_state *crtc_state,
+                                   const struct drm_connector_state *conn_state)
 {
        struct intel_dp *intel_dp = dev_priv->psr.dp;
+       struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
+       struct intel_encoder *encoder = &intel_dig_port->base;
        u32 val;
 
        drm_WARN_ON(&dev_priv->drm, dev_priv->psr.enabled);
 
        drm_dbg_kms(&dev_priv->drm, "Enabling PSR%s\n",
                    dev_priv->psr.psr2_enabled ? "2" : "1");
-       intel_psr_setup_vsc(intel_dp, crtc_state);
+       intel_dp_compute_psr_vsc_sdp(intel_dp, crtc_state, conn_state,
+                                    &dev_priv->psr.vsc);
+       intel_write_dp_vsc_sdp(encoder, crtc_state, &dev_priv->psr.vsc);
        intel_psr_enable_sink(intel_dp);
        intel_psr_enable_source(intel_dp, crtc_state);
        dev_priv->psr.enabled = true;
  * intel_psr_enable - Enable PSR
  * @intel_dp: Intel DP
  * @crtc_state: new CRTC state
+ * @conn_state: new CONNECTOR state
  *
  * This function can only be called after the pipe is fully trained and enabled.
  */
 void intel_psr_enable(struct intel_dp *intel_dp,
-                     const struct intel_crtc_state *crtc_state)
+                     const struct intel_crtc_state *crtc_state,
+                     const struct drm_connector_state *conn_state)
 {
        struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
 
                goto unlock;
        }
 
-       intel_psr_enable_locked(dev_priv, crtc_state);
+       intel_psr_enable_locked(dev_priv, crtc_state, conn_state);
 
 unlock:
        mutex_unlock(&dev_priv->psr.lock);
  * intel_psr_update - Update PSR state
  * @intel_dp: Intel DP
  * @crtc_state: new CRTC state
+ * @conn_state: new CONNECTOR state
  *
  * This functions will update PSR states, disabling, enabling or switching PSR
  * version when executing fastsets. For full modeset, intel_psr_disable() and
  * intel_psr_enable() should be called instead.
  */
 void intel_psr_update(struct intel_dp *intel_dp,
-                     const struct intel_crtc_state *crtc_state)
+                     const struct intel_crtc_state *crtc_state,
+                     const struct drm_connector_state *conn_state)
 {
        struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
        struct i915_psr *psr = &dev_priv->psr;
                intel_psr_disable_locked(intel_dp);
 
        if (enable)
-               intel_psr_enable_locked(dev_priv, crtc_state);
+               intel_psr_enable_locked(dev_priv, crtc_state, conn_state);
 
 unlock:
        mutex_unlock(&dev_priv->psr.lock);