Blob Blame History Raw
From 22e008f90d546507d57bdac92030cece73ded09a 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: only check for re-train when the link is active
Git-commit: 22e008f90d546507d57bdac92030cece73ded09a
Patch-mainline: v4.13-rc1
References: bsc#1095094

An upcoming commit will limit link training to only when the sink is
meant to be displaying an image.

We still need IRQs enabled even when the link isn't trained (for MST
messages), but don't want to train the link unnecessarily.

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

---
 drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c    |   51 ++++-------------------
 drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h    |    1 
 drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c |    3 -
 drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c  |    3 -
 4 files changed, 13 insertions(+), 45 deletions(-)

--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c
@@ -491,7 +491,13 @@ nvkm_dp_hpd(struct nvkm_notify *notify)
 	struct nvif_notify_conn_rep_v0 rep = {};
 
 	OUTP_DBG(&dp->outp, "HPD: %d", line->mask);
-	nvkm_dp_enable(dp, true);
+	if (line->mask & NVKM_I2C_IRQ) {
+		if (atomic_read(&dp->lt.done))
+			nvkm_output_dp_train(&dp->outp, 0);
+		rep.mask |= NVIF_NOTIFY_CONN_V0_IRQ;
+	} else {
+		nvkm_dp_enable(dp, true);
+	}
 
 	if (line->mask & NVKM_I2C_UNPLUG)
 		rep.mask |= NVIF_NOTIFY_CONN_V0_UNPLUG;
@@ -502,30 +508,11 @@ nvkm_dp_hpd(struct nvkm_notify *notify)
 	return NVKM_NOTIFY_KEEP;
 }
 
-static int
-nvkm_dp_irq(struct nvkm_notify *notify)
-{
-	const struct nvkm_i2c_ntfy_rep *line = notify->data;
-	struct nvkm_dp *dp = container_of(notify, typeof(*dp), irq);
-	struct nvkm_conn *conn = dp->outp.conn;
-	struct nvkm_disp *disp = dp->outp.disp;
-	struct nvif_notify_conn_rep_v0 rep = {
-		.mask = NVIF_NOTIFY_CONN_V0_IRQ,
-	};
-
-	OUTP_DBG(&dp->outp, "IRQ: %d", line->mask);
-	nvkm_output_dp_train(&dp->outp, 0);
-
-	nvkm_event_send(&disp->hpd, rep.mask, conn->index, &rep, sizeof(rep));
-	return NVKM_NOTIFY_KEEP;
-}
-
 static void
 nvkm_dp_fini(struct nvkm_outp *outp)
 {
 	struct nvkm_dp *dp = nvkm_dp(outp);
 	nvkm_notify_put(&dp->hpd);
-	nvkm_notify_put(&dp->irq);
 	nvkm_dp_enable(dp, false);
 }
 
@@ -535,7 +522,6 @@ nvkm_dp_init(struct nvkm_outp *outp)
 	struct nvkm_dp *dp = nvkm_dp(outp);
 	nvkm_notify_put(&dp->outp.conn->hpd);
 	nvkm_dp_enable(dp, true);
-	nvkm_notify_get(&dp->irq);
 	nvkm_notify_get(&dp->hpd);
 }
 
@@ -544,7 +530,6 @@ nvkm_dp_dtor(struct nvkm_outp *outp)
 {
 	struct nvkm_dp *dp = nvkm_dp(outp);
 	nvkm_notify_fini(&dp->hpd);
-	nvkm_notify_fini(&dp->irq);
 	return dp;
 }
 
@@ -588,27 +573,11 @@ nvkm_dp_ctor(struct nvkm_disp *disp, int
 	OUTP_DBG(&dp->outp, "bios dp %02x %02x %02x %02x",
 		 dp->version, hdr, cnt, len);
 
-	/* link maintenance */
-	ret = nvkm_notify_init(NULL, &i2c->event, nvkm_dp_irq, true,
-			       &(struct nvkm_i2c_ntfy_req) {
-				.mask = NVKM_I2C_IRQ,
-				.port = dp->aux->id,
-			       },
-			       sizeof(struct nvkm_i2c_ntfy_req),
-			       sizeof(struct nvkm_i2c_ntfy_rep),
-			       &dp->irq);
-	if (ret) {
-		OUTP_ERR(&dp->outp, "error monitoring aux irq: %d", ret);
-		return ret;
-	}
-
-	mutex_init(&dp->mutex);
-	atomic_set(&dp->lt.done, 0);
-
 	/* hotplug detect, replaces gpio-based mechanism with aux events */
 	ret = nvkm_notify_init(NULL, &i2c->event, nvkm_dp_hpd, true,
 			       &(struct nvkm_i2c_ntfy_req) {
-				.mask = NVKM_I2C_PLUG | NVKM_I2C_UNPLUG,
+				.mask = NVKM_I2C_PLUG | NVKM_I2C_UNPLUG |
+					NVKM_I2C_IRQ,
 				.port = dp->aux->id,
 			       },
 			       sizeof(struct nvkm_i2c_ntfy_req),
@@ -619,6 +588,8 @@ nvkm_dp_ctor(struct nvkm_disp *disp, int
 		return ret;
 	}
 
+	mutex_init(&dp->mutex);
+	atomic_set(&dp->lt.done, 0);
 	return 0;
 }
 
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.h
@@ -19,7 +19,6 @@ struct nvkm_dp {
 
 	struct nvkm_i2c_aux *aux;
 
-	struct nvkm_notify irq;
 	struct nvkm_notify hpd;
 	bool present;
 	u8 dpcd[16];
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/gf119.c
@@ -201,9 +201,8 @@ gf119_disp_intr_unk2_0(struct nv50_disp
 				.execute = 1,
 			};
 
-			nvkm_notify_put(&outpdp->irq);
-			nvbios_exec(&init);
 			atomic_set(&outpdp->lt.done, 0);
+			nvbios_exec(&init);
 		}
 	}
 }
--- a/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
+++ b/drivers/gpu/drm/nouveau/nvkm/engine/disp/nv50.c
@@ -661,9 +661,8 @@ nv50_disp_intr_unk20_0(struct nv50_disp
 			.execute = 1,
 		};
 
-		nvkm_notify_put(&outpdp->irq);
-		nvbios_exec(&init);
 		atomic_set(&outpdp->lt.done, 0);
+		nvbios_exec(&init);
 	}
 }