drm/i915: fix port checks for MST support on gen >= 11
authorLucas De Marchi <lucas.demarchi@intel.com>
Fri, 11 Oct 2019 01:09:03 +0000 (18:09 -0700)
committerLucas De Marchi <lucas.demarchi@intel.com>
Sat, 19 Oct 2019 00:28:12 +0000 (17:28 -0700)
Both Ice Lake and Elkhart Lake (gen 11) support MST on all external
connections except DDI A. Tiger Lake (gen 12) supports on all external
connections.

Move the check to happen inside intel_dp_mst_encoder_init() and add
specific platform checks.

v2: Replace != with == checks for ports on gen < 11 (Ville)

Signed-off-by: Lucas De Marchi <lucas.demarchi@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191015164029.18431-3-lucas.demarchi@intel.com
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_dp_mst.c

index 3792d143bea99881f7d2fa126c9c29736c40d982..3696623ce443e2c468d188711267859b1be614c8 100644 (file)
@@ -7468,11 +7468,8 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
                intel_connector->get_hw_state = intel_connector_get_hw_state;
 
        /* init MST on ports that can support it */
-       if (HAS_DP_MST(dev_priv) && !intel_dp_is_edp(intel_dp) &&
-           (port == PORT_B || port == PORT_C ||
-            port == PORT_D || port == PORT_F))
-               intel_dp_mst_encoder_init(intel_dig_port,
-                                         intel_connector->base.base.id);
+       intel_dp_mst_encoder_init(intel_dig_port,
+                                 intel_connector->base.base.id);
 
        if (!intel_edp_init_connector(intel_dp, intel_connector)) {
                intel_dp_aux_fini(intel_dp);
index 2203be28ea016b3af21560c77d66428c45708660..bbcab27644dcd578352c2d983b0c5f445eae936c 100644 (file)
@@ -655,21 +655,31 @@ intel_dp_mst_encoder_active_links(struct intel_digital_port *intel_dig_port)
 int
 intel_dp_mst_encoder_init(struct intel_digital_port *intel_dig_port, int conn_base_id)
 {
+       struct drm_i915_private *i915 = to_i915(intel_dig_port->base.base.dev);
        struct intel_dp *intel_dp = &intel_dig_port->dp;
-       struct drm_device *dev = intel_dig_port->base.base.dev;
+       enum port port = intel_dig_port->base.port;
        int ret;
 
-       intel_dp->can_mst = true;
+       if (!HAS_DP_MST(i915) || intel_dp_is_edp(intel_dp))
+               return 0;
+
+       if (INTEL_GEN(i915) < 12 && port == PORT_A)
+               return 0;
+
+       if (INTEL_GEN(i915) < 11 && port == PORT_E)
+               return 0;
+
        intel_dp->mst_mgr.cbs = &mst_cbs;
 
        /* create encoders */
        intel_dp_create_fake_mst_encoders(intel_dig_port);
-       ret = drm_dp_mst_topology_mgr_init(&intel_dp->mst_mgr, dev,
+       ret = drm_dp_mst_topology_mgr_init(&intel_dp->mst_mgr, &i915->drm,
                                           &intel_dp->aux, 16, 3, conn_base_id);
-       if (ret) {
-               intel_dp->can_mst = false;
+       if (ret)
                return ret;
-       }
+
+       intel_dp->can_mst = true;
+
        return 0;
 }