diff mbox series

[SRU,F,3/3] drm/nouveau/kms/gv100-: avoid sending a core update until the first modeset

Message ID 20241210220308.903968-4-jacob.martin@canonical.com
State New
Headers show
Series Fix nouveau error storm and unresponsive display after desktop idle timeout | expand

Commit Message

Jacob Martin Dec. 10, 2024, 10:03 p.m. UTC
From: Ben Skeggs <bskeggs@redhat.com>

BugLink: https://bugs.launchpad.net/bugs/2078011

The OR routing logic in NVKM does not expect to receive supervisor
interrupts until the DD has provided consistent information on the
ORs it's using and the EVO/NVD assembly state to match.

The combination of changing window ownership + core channel update
during display init triggered a situation where we'd disconnect an
OR from the pad it was meant to still be driving on some systems.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
(cherry picked from commit 137c4ba7163ad9d5696b9fde78b1c0898a9c115b)
Signed-off-by: Jacob Martin <jacob.martin@canonical.com>
---
 drivers/gpu/drm/nouveau/dispnv50/corec37d.c | 4 +---
 drivers/gpu/drm/nouveau/dispnv50/corec57d.c | 4 +---
 2 files changed, 2 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/drivers/gpu/drm/nouveau/dispnv50/corec37d.c b/drivers/gpu/drm/nouveau/dispnv50/corec37d.c
index f414171e40b4c..3b36dc8d36b2d 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/corec37d.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/corec37d.c
@@ -90,7 +90,7 @@  corec37d_init(struct nv50_core *core)
 {
 	const u32 windows = 8; /*XXX*/
 	u32 *push, i;
-	if ((push = evo_wait(&core->chan, 2 + 5 * windows + 2))) {
+	if ((push = evo_wait(&core->chan, 2 + 5 * windows))) {
 		evo_mthd(push, 0x0208, 1);
 		evo_data(push, core->chan.sync.handle);
 		for (i = 0; i < windows; i++) {
@@ -100,8 +100,6 @@  corec37d_init(struct nv50_core *core)
 			evo_mthd(push, 0x1010 + (i * 0x080), 1);
 			evo_data(push, 0x00127fff);
 		}
-		evo_mthd(push, 0x0200, 1);
-		evo_data(push, 0x00000001);
 		evo_kick(push, &core->chan);
 		core->assign_windows = true;
 	}
diff --git a/drivers/gpu/drm/nouveau/dispnv50/corec57d.c b/drivers/gpu/drm/nouveau/dispnv50/corec57d.c
index b540606ac0525..147adcd609378 100644
--- a/drivers/gpu/drm/nouveau/dispnv50/corec57d.c
+++ b/drivers/gpu/drm/nouveau/dispnv50/corec57d.c
@@ -27,7 +27,7 @@  corec57d_init(struct nv50_core *core)
 {
 	const u32 windows = 8; /*XXX*/
 	u32 *push, i;
-	if ((push = evo_wait(&core->chan, 2 + 5 * windows + 2))) {
+	if ((push = evo_wait(&core->chan, 2 + 5 * windows))) {
 		evo_mthd(push, 0x0208, 1);
 		evo_data(push, core->chan.sync.handle);
 		for (i = 0; i < windows; i++) {
@@ -37,8 +37,6 @@  corec57d_init(struct nv50_core *core)
 			evo_mthd(push, 0x1010 + (i * 0x080), 1);
 			evo_data(push, 0x00117fff);
 		}
-		evo_mthd(push, 0x0200, 1);
-		evo_data(push, 0x00000001);
 		evo_kick(push, &core->chan);
 		core->assign_windows = true;
 	}