drm/nouveau/kms/gv100-: avoid sending a core update until the first modeset
authorBen Skeggs <bskeggs@redhat.com>
Mon, 3 Feb 2020 08:37:07 +0000 (03:37 -0500)
committerBen Skeggs <bskeggs@redhat.com>
Mon, 3 Feb 2020 11:36:54 +0000 (21:36 +1000)
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>
drivers/gpu/drm/nouveau/dispnv50/corec37d.c
drivers/gpu/drm/nouveau/dispnv50/corec57d.c

index f414171..3b36dc8 100644 (file)
@@ -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;
        }
index b540606..147adcd 100644 (file)
@@ -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;
        }