drm/i915/psr: Tie PSR2 support to Y coordinate requirement
authorJosé Roberto de Souza <jose.souza@intel.com>
Wed, 28 Mar 2018 22:30:40 +0000 (15:30 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Fri, 30 Mar 2018 17:17:55 +0000 (10:17 -0700)
Although i915 don't implement aux sync frame through tests was
findout that pannels can do selective update when the y-coordinate
is also included in SDP, that is why it is required to run PSR2 in
i915.

So moving to only one place the sink requirements that the actual
driver needs to enable PSR2.

Also intel_psr2_config_valid() is called every time the crtc config
is computed, wasting some time every time it was checking for
Y coordinate requirement.

This allow us to nuke y_cord_support and some of VSC setup code that
was handling a scenario that would never happen(PSR2 without Y
coordinate).

Also here renaming intel_dp_get_y_cord_status() to
intel_dp_get_y_coord_required() as it more accurate to the name and
function of bit according to eDP spec.

Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180328223046.16125-4-jose.souza@intel.com
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/intel_psr.c

index fade9029b6f500b2597b997949219544f07e5523..92cf6f4e9e00d125448e71766b8f1098561b7500 100644 (file)
@@ -604,7 +604,6 @@ struct i915_psr {
        unsigned busy_frontbuffer_bits;
        bool psr2_support;
        bool link_standby;
-       bool y_cord_support;
        bool colorimetry_support;
        bool alpm;
        bool has_hw_tracking;
index c0a6f63b586f4e15138e967caa1684f654a3c633..fb2d0fe7106b5aa0aba4161df2464ca223939a4b 100644 (file)
@@ -93,7 +93,7 @@ static void psr_aux_io_power_put(struct intel_dp *intel_dp)
        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;
 
@@ -130,22 +130,29 @@ void intel_psr_init_dpcd(struct intel_dp *intel_dp)
        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 =
@@ -191,16 +198,12 @@ static void hsw_psr_setup_vsc(struct intel_dp *intel_dp,
                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 */
@@ -457,15 +460,6 @@ static bool intel_psr2_config_valid(struct intel_dp *intel_dp,
                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;
 }
 
@@ -565,7 +559,6 @@ static void hsw_psr_enable_source(struct intel_dp *intel_dp,
        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);
 
@@ -576,9 +569,8 @@ static void hsw_psr_enable_source(struct intel_dp *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,