drm/i915: Provide more clues as to why MST is/is not used
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 3 Oct 2018 18:42:10 +0000 (21:42 +0300)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 4 Oct 2018 17:21:40 +0000 (20:21 +0300)
Always print out the information whether the port and sink can each
do MST. And let's include the modparam in the debug output as well.
Makes life a little less confusing when you don't have to wonder
why MST isn't kicking in.

This does cause a slight change in our behaviour towards the sink.
Previously we only read the MSTM_CAP register after passing all
the other checks. Now we will read that register regardless. Hopefully
some crazy sink doesn't get confused by a simple register read.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181003184210.1306-1-ville.syrjala@linux.intel.com
Reviewed-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
drivers/gpu/drm/i915/intel_dp.c

index 15a981e..1a510cf 100644 (file)
@@ -4050,16 +4050,10 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
 }
 
 static bool
-intel_dp_can_mst(struct intel_dp *intel_dp)
+intel_dp_sink_can_mst(struct intel_dp *intel_dp)
 {
        u8 mstm_cap;
 
-       if (!i915_modparams.enable_dp_mst)
-               return false;
-
-       if (!intel_dp->can_mst)
-               return false;
-
        if (intel_dp->dpcd[DP_DPCD_REV] < 0x12)
                return false;
 
@@ -4069,21 +4063,30 @@ intel_dp_can_mst(struct intel_dp *intel_dp)
        return mstm_cap & DP_MST_CAP;
 }
 
+static bool
+intel_dp_can_mst(struct intel_dp *intel_dp)
+{
+       return i915_modparams.enable_dp_mst &&
+               intel_dp->can_mst &&
+               intel_dp_sink_can_mst(intel_dp);
+}
+
 static void
 intel_dp_configure_mst(struct intel_dp *intel_dp)
 {
-       if (!i915_modparams.enable_dp_mst)
-               return;
+       struct intel_encoder *encoder =
+               &dp_to_dig_port(intel_dp)->base;
+       bool sink_can_mst = intel_dp_sink_can_mst(intel_dp);
+
+       DRM_DEBUG_KMS("MST support? port %c: %s, sink: %s, modparam: %s\n",
+                     port_name(encoder->port), yesno(intel_dp->can_mst),
+                     yesno(sink_can_mst), yesno(i915_modparams.enable_dp_mst));
 
        if (!intel_dp->can_mst)
                return;
 
-       intel_dp->is_mst = intel_dp_can_mst(intel_dp);
-
-       if (intel_dp->is_mst)
-               DRM_DEBUG_KMS("Sink is MST capable\n");
-       else
-               DRM_DEBUG_KMS("Sink is not MST capable\n");
+       intel_dp->is_mst = sink_can_mst &&
+               i915_modparams.enable_dp_mst;
 
        drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
                                        intel_dp->is_mst);