|
@@ -1123,17 +1123,21 @@ nv50_mstm_enable(struct nv50_mstm *mstm, u8 dpcd, int state)
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
if (dpcd >= 0x12) {
|
|
if (dpcd >= 0x12) {
|
|
- ret = drm_dp_dpcd_readb(mstm->mgr.aux, DP_MSTM_CTRL, &dpcd);
|
|
|
|
|
|
+ /* Even if we're enabling MST, start with disabling the
|
|
|
|
+ * branching unit to clear any sink-side MST topology state
|
|
|
|
+ * that wasn't set by us
|
|
|
|
+ */
|
|
|
|
+ ret = drm_dp_dpcd_writeb(mstm->mgr.aux, DP_MSTM_CTRL, 0);
|
|
if (ret < 0)
|
|
if (ret < 0)
|
|
return ret;
|
|
return ret;
|
|
|
|
|
|
- dpcd &= ~DP_MST_EN;
|
|
|
|
- if (state)
|
|
|
|
- dpcd |= DP_MST_EN;
|
|
|
|
-
|
|
|
|
- ret = drm_dp_dpcd_writeb(mstm->mgr.aux, DP_MSTM_CTRL, dpcd);
|
|
|
|
- if (ret < 0)
|
|
|
|
- return ret;
|
|
|
|
|
|
+ if (state) {
|
|
|
|
+ /* Now, start initializing */
|
|
|
|
+ ret = drm_dp_dpcd_writeb(mstm->mgr.aux, DP_MSTM_CTRL,
|
|
|
|
+ DP_MST_EN);
|
|
|
|
+ if (ret < 0)
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
return nvif_mthd(disp, 0, &args, sizeof(args));
|
|
return nvif_mthd(disp, 0, &args, sizeof(args));
|