drm/i915/dp: Reset the link params on HPD/connected boot/resume
authorManasi Navare <manasi.d.navare@intel.com>
Wed, 8 Feb 2017 00:54:11 +0000 (16:54 -0800)
committerJani Nikula <jani.nikula@intel.com>
Wed, 15 Feb 2017 15:24:10 +0000 (17:24 +0200)
The max link parameters should be set/reset only on HPD or
connected boot case or on system resume.

Add a flag reset_link_params to intel_dp to decide when
to reset the max link parameters. This prevents the parameters
from getting reset/overwritten through all other
connector->funcs->detect() calls. This is important when link
training fails and the max link params are modified to the
lower fallback values.

Cc: Ville Syrjala <ville.syrjala@linux.intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Manasi Navare <manasi.d.navare@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1486515251-23469-1-git-send-email-manasi.d.navare@intel.com
drivers/gpu/drm/i915/intel_dp.c
drivers/gpu/drm/i915/intel_drv.h

index 6ef4f38100821af972914e2575e3c8d5d8723245..024798a9c01613120139f1e59f46470241b746fb 100644 (file)
@@ -4624,11 +4624,15 @@ intel_dp_long_pulse(struct intel_connector *intel_connector)
                      yesno(intel_dp_source_supports_hbr2(intel_dp)),
                      yesno(drm_dp_tps3_supported(intel_dp->dpcd)));
 
-       /* Set the max lane count for sink */
-       intel_dp->max_sink_lane_count = drm_dp_max_lane_count(intel_dp->dpcd);
+       if (intel_dp->reset_link_params) {
+               /* Set the max lane count for sink */
+               intel_dp->max_sink_lane_count = drm_dp_max_lane_count(intel_dp->dpcd);
 
-       /* Set the max link BW for sink */
-       intel_dp->max_sink_link_bw = intel_dp_max_link_bw(intel_dp);
+               /* Set the max link BW for sink */
+               intel_dp->max_sink_link_bw = intel_dp_max_link_bw(intel_dp);
+
+               intel_dp->reset_link_params = false;
+       }
 
        intel_dp_print_rates(intel_dp);
 
@@ -5010,6 +5014,8 @@ void intel_dp_encoder_reset(struct drm_encoder *encoder)
        if (lspcon->active)
                lspcon_resume(lspcon);
 
+       intel_dp->reset_link_params = true;
+
        pps_lock(intel_dp);
 
        if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
@@ -5079,6 +5085,7 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
                      long_hpd ? "long" : "short");
 
        if (long_hpd) {
+               intel_dp->reset_link_params = true;
                intel_dp->detect_done = false;
                return IRQ_NONE;
        }
@@ -5947,6 +5954,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
                 intel_dig_port->max_lanes, port_name(port)))
                return false;
 
+       intel_dp->reset_link_params = true;
        intel_dp->pps_pipe = INVALID_PIPE;
        intel_dp->active_pipe = INVALID_PIPE;
 
index 7845d40f203e68005ce916067d1e4667bf46dbd5..f1cbeae5cf8814fffc52065400138b88349ffa1c 100644 (file)
@@ -933,6 +933,7 @@ struct intel_dp {
        bool has_audio;
        bool detect_done;
        bool channel_eq_status;
+       bool reset_link_params;
        enum hdmi_force_audio force_audio;
        bool limited_color_range;
        bool color_range_auto;