With DP2.1, multistream packetization and the underneth MST protocol
will be required for SST. So check for MSTM_CAP to see if MST is really
required and skip the MSTM_CTRL write so that we ensure that only the
underneth protocol and the multistream packetization will be enabled and
sink will not be confused by a corresponding dpcd write.

Signed-off-by: Arun R Murthy <arun.r.mur...@intel.com>
---
 drivers/gpu/drm/display/drm_dp_mst_topology.c | 26 +++++++++++--------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/display/drm_dp_mst_topology.c 
b/drivers/gpu/drm/display/drm_dp_mst_topology.c
index 8ca01a6bf645..22d81732a978 100644
--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
@@ -3666,10 +3666,11 @@ int drm_dp_mst_topology_mgr_set_mst(struct 
drm_dp_mst_topology_mgr *mgr, bool ms
                mgr->mst_primary = mstb;
                drm_dp_mst_topology_get_mstb(mgr->mst_primary);
 
-               ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
-                                        DP_MST_EN |
-                                        DP_UP_REQ_EN |
-                                        DP_UPSTREAM_IS_SRC);
+               if (drm_dp_read_mst_cap(mgr->aux, mgr->dpcd))
+                       ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
+                                                DP_MST_EN |
+                                                DP_UP_REQ_EN |
+                                                DP_UPSTREAM_IS_SRC);
                if (ret < 0)
                        goto out_unlock;
 
@@ -3684,7 +3685,8 @@ int drm_dp_mst_topology_mgr_set_mst(struct 
drm_dp_mst_topology_mgr *mgr, bool ms
                mstb = mgr->mst_primary;
                mgr->mst_primary = NULL;
                /* this can fail if the device is gone */
-               drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0);
+               if (drm_dp_read_mst_cap(mgr->aux, mgr->dpcd))
+                       drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0);
                ret = 0;
                mgr->payload_id_table_cleared = false;
 
@@ -3724,8 +3726,9 @@ drm_dp_mst_topology_mgr_invalidate_mstb(struct 
drm_dp_mst_branch *mstb)
 void drm_dp_mst_topology_mgr_suspend(struct drm_dp_mst_topology_mgr *mgr)
 {
        mutex_lock(&mgr->lock);
-       drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
-                          DP_MST_EN | DP_UPSTREAM_IS_SRC);
+       if (drm_dp_read_mst_cap(mgr->aux, mgr->dpcd))
+               drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
+                                  DP_MST_EN | DP_UPSTREAM_IS_SRC);
        mutex_unlock(&mgr->lock);
        flush_work(&mgr->up_req_work);
        flush_work(&mgr->work);
@@ -3773,10 +3776,11 @@ int drm_dp_mst_topology_mgr_resume(struct 
drm_dp_mst_topology_mgr *mgr,
                goto out_fail;
        }
 
-       ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
-                                DP_MST_EN |
-                                DP_UP_REQ_EN |
-                                DP_UPSTREAM_IS_SRC);
+       if (drm_dp_read_mst_cap(mgr->aux, mgr->dpcd))
+               ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
+                                        DP_MST_EN |
+                                        DP_UP_REQ_EN |
+                                        DP_UPSTREAM_IS_SRC);
        if (ret < 0) {
                drm_dbg_kms(mgr->dev, "mst write failed - undocked during 
suspend?\n");
                goto out_fail;
-- 
2.25.1

Reply via email to