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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 7 Jun 2020 11:18:48 +0000 (13:18 +0200)
[ Upstream commit 10d987fd1b7baceaafa78d805e71427ab735b4e4 ]

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
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/i915/display/intel_dp.c
drivers/gpu/drm/i915/display/intel_dp_mst.c

index 9b15ac4f2fb6e00a259b162dc273cc57a3495160..4ab6531a4a74b5870cdc14235ecf59b38dfc5d0a 100644 (file)
@@ -7218,11 +7218,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 600873c796d093b0d0ee67413343d143669ad240..74d45a0eecb84e10528f0fa0e0bb16866e47716a 100644 (file)
@@ -653,21 +653,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;
 }