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 | 38 +++++++++++--------
 1 file changed, 22 insertions(+), 16 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..c5b3e51ea0c9 100644
--- a/drivers/gpu/drm/display/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/display/drm_dp_mst_topology.c
@@ -3666,12 +3666,14 @@ 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 (ret < 0)
-                       goto out_unlock;
+               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;
+               }
 
                /* Write reset payload */
                drm_dp_dpcd_write_payload(mgr, 0, 0, 0x3f);
@@ -3684,7 +3686,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 +3727,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,13 +3777,15 @@ 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 (ret < 0) {
-               drm_dbg_kms(mgr->dev, "mst write failed - undocked during 
suspend?\n");
-               goto out_fail;
+       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;
+               }
        }
 
        /* Some hubs forget their guids after they resume */
-- 
2.25.1

Reply via email to