Blob Blame History Raw
From 7d0a01a6dec9737d24be5ac223e73a0725eac8a0 Mon Sep 17 00:00:00 2001
From: Ben Skeggs <bskeggs@redhat.com>
Date: Fri, 19 May 2017 23:59:35 +1000
Subject: [PATCH] drm/nouveau/disp/dp: train link only when actively displaying an image
Git-commit: 7d0a01a6dec9737d24be5ac223e73a0725eac8a0
Patch-mainline: v4.13-rc1
References: bsc#1095094

This essentially (unless the link becomes unstable and needs to be
re-trained) gives us a single entry-point to link training, during
supervisor handling, where we can ensure all routing is up to date.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Acked-by: Takashi Iwai <tiwai@suse.de>

---
 drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c       |    8 ++++----
 drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c |    8 ++------
 2 files changed, 6 insertions(+), 10 deletions(-)

--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c
@@ -417,7 +417,9 @@ nvkm_output_dp_train(struct nvkm_outp *o
 	/* Check that link configuration meets current requirements. */
 	linkKBps = ior->dp.bw * 27000 * ior->dp.nr;
 	dataKBps = DIV_ROUND_UP(datakbps, 8);
-	if (linkKBps < dataKBps) {
+	OUTP_DBG(&dp->outp, "data %d KB/s link %d KB/s mst %d->%d",
+		 dataKBps, linkKBps, ior->dp.mst, dp->lt.mst);
+	if (linkKBps < dataKBps || ior->dp.mst != dp->lt.mst) {
 		OUTP_DBG(&dp->outp, "link requirements changed");
 		goto done;
 	}
@@ -466,10 +468,8 @@ nvkm_dp_enable(struct nvkm_dp *dp, bool
 		}
 
 		if (!nvkm_rdaux(aux, DPCD_RC00_DPCD_REV, dp->dpcd,
-				sizeof(dp->dpcd))) {
-			nvkm_output_dp_train(&dp->outp, 0);
+				sizeof(dp->dpcd)))
 			return;
-		}
 	}
 
 	if (dp->present) {
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c
@@ -125,7 +125,7 @@ nv50_disp_root_mthd_(struct nvkm_object
 	}
 		break;
 	case NV50_DISP_MTHD_V1_SOR_DP_MST_LINK: {
-		struct nvkm_output_dp *outpdp = nvkm_output_dp(outp);
+		struct nvkm_dp *dp = nvkm_dp(outp);
 		union {
 			struct nv50_disp_sor_dp_mst_link_v0 v0;
 		} *args = data;
@@ -134,11 +134,7 @@ nv50_disp_root_mthd_(struct nvkm_object
 		if (!(ret = nvif_unpack(ret, &data, &size, args->v0, 0, 0, false))) {
 			nvif_ioctl(object, "disp sor dp mst link vers %d state %d\n",
 				   args->v0.version, args->v0.state);
-			if (outpdp->lt.mst != !!args->v0.state) {
-				outpdp->lt.mst = !!args->v0.state;
-				atomic_set(&outpdp->lt.done, 0);
-				nvkm_output_dp_train(&outpdp->base, 0);
-			}
+			dp->lt.mst = !!args->v0.state;
 			return 0;
 		} else
 			return ret;