intel_display_power_put(dev_priv, psr_aux_domain(intel_dp));
 }
 
-static bool intel_dp_get_y_cord_status(struct intel_dp *intel_dp)
+static bool intel_dp_get_y_coord_required(struct intel_dp *intel_dp)
 {
        uint8_t psr_caps = 0;
 
        drm_dp_dpcd_read(&intel_dp->aux, DP_PSR_SUPPORT, intel_dp->psr_dpcd,
                         sizeof(intel_dp->psr_dpcd));
 
-       if (intel_dp->psr_dpcd[0] & DP_PSR_IS_SUPPORTED) {
+       if (intel_dp->psr_dpcd[0]) {
                dev_priv->psr.sink_support = true;
                DRM_DEBUG_KMS("Detected EDP PSR Panel.\n");
        }
 
        if (INTEL_GEN(dev_priv) >= 9 &&
-           (intel_dp->psr_dpcd[0] & DP_PSR2_IS_SUPPORTED)) {
-
-               dev_priv->psr.sink_support = true;
-               dev_priv->psr.psr2_support = true;
+           (intel_dp->psr_dpcd[0] == DP_PSR2_WITH_Y_COORD_IS_SUPPORTED)) {
+               /*
+                * All panels that supports PSR version 03h (PSR2 +
+                * Y-coordinate) can handle Y-coordinates in VSC but we are
+                * only sure that it is going to be used when required by the
+                * panel. This way panel is capable to do selective update
+                * without a aux frame sync.
+                *
+                * To support PSR version 02h and PSR version 03h without
+                * Y-coordinate requirement panels we would need to enable
+                * GTC first.
+                */
+               dev_priv->psr.psr2_support = intel_dp_get_y_coord_required(intel_dp);
                DRM_DEBUG_KMS("PSR2 %s on sink",
                              dev_priv->psr.psr2_support ? "supported" : "not supported");
 
                if (dev_priv->psr.psr2_support) {
-                       dev_priv->psr.y_cord_support =
-                               intel_dp_get_y_cord_status(intel_dp);
                        dev_priv->psr.colorimetry_support =
                                intel_dp_get_colorimetry_status(intel_dp);
                        dev_priv->psr.alpm =
                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 &&
-                   dev_priv->psr.y_cord_support) {
+               if (dev_priv->psr.colorimetry_support) {
                        psr_vsc.sdp_header.HB2 = 0x5;
                        psr_vsc.sdp_header.HB3 = 0x13;
-               } else if (dev_priv->psr.y_cord_support) {
+               } else {
                        psr_vsc.sdp_header.HB2 = 0x4;
                        psr_vsc.sdp_header.HB3 = 0xe;
-               } else {
-                       psr_vsc.sdp_header.HB2 = 0x3;
-                       psr_vsc.sdp_header.HB3 = 0xc;
                }
        } else {
                /* Prepare VSC packet as per EDP 1.3 spec, Table 3.10 */
                return false;
        }
 
-       /*
-        * FIXME:enable psr2 only for y-cordinate psr2 panels
-        * After gtc implementation , remove this restriction.
-        */
-       if (!dev_priv->psr.y_cord_support) {
-               DRM_DEBUG_KMS("PSR2 not enabled, panel does not support Y coordinate\n");
-               return false;
-       }
-
        return true;
 }
 
        struct drm_device *dev = dig_port->base.base.dev;
        struct drm_i915_private *dev_priv = to_i915(dev);
        enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
-       u32 chicken;
 
        psr_aux_io_power_get(intel_dp);
 
                hsw_psr_setup_aux(intel_dp);
 
        if (dev_priv->psr.psr2_support) {
-               chicken = PSR2_VSC_ENABLE_PROG_HEADER;
-               if (dev_priv->psr.y_cord_support)
-                       chicken |= PSR2_ADD_VERTICAL_LINE_COUNT;
+               u32 chicken = PSR2_VSC_ENABLE_PROG_HEADER
+                             | PSR2_ADD_VERTICAL_LINE_COUNT;
                I915_WRITE(CHICKEN_TRANS(cpu_transcoder), chicken);
 
                I915_WRITE(EDP_PSR_DEBUG,