drm/nouveau/disp: release outputs post-modeset
authorBen Skeggs <bskeggs@redhat.com>
Tue, 19 Sep 2023 21:56:16 +0000 (17:56 -0400)
committerLyude Paul <lyude@redhat.com>
Tue, 19 Sep 2023 22:22:04 +0000 (18:22 -0400)
Prior to this commit, KMS would call release() prior to modeset, and the
second supervisor interrupt would update SOR routing if needed.

Now, KMS will call release() post-modeset and update routing immediately.

- preparation for GSP-RM

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Acked-by: Danilo Krummrich <me@dakr.org>
Signed-off-by: Lyude Paul <lyude@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230919220442.202488-22-lyude@redhat.com
drivers/gpu/drm/nouveau/dispnv50/disp.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/outp.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/uoutp.c

index ab048cf25d866eabcde3ff3a1181a8918e3bc8ac..50a0ff304291ed84a22b9d837df0ca65e5a3711a 100644 (file)
@@ -477,7 +477,6 @@ nv50_dac_atomic_disable(struct drm_encoder *encoder, struct drm_atomic_state *st
 
        core->func->dac->ctrl(core, nv_encoder->outp.or.id, ctrl, NULL);
        nv_encoder->crtc = NULL;
-       nvif_outp_release(&nv_encoder->outp);
 }
 
 static void
@@ -1300,6 +1299,11 @@ nv50_mstm_cleanup(struct drm_atomic_state *state,
                }
        }
 
+       if (mstm->disabled) {
+               nvif_outp_release(&mstm->outp->outp);
+               mstm->disabled = false;
+       }
+
        mstm->modified = false;
 }
 
@@ -1334,12 +1338,6 @@ nv50_mstm_prepare(struct drm_atomic_state *state,
                                nv50_msto_prepare(state, mst_state, &mstm->mgr, msto);
                }
        }
-
-       if (mstm->disabled) {
-               if (!mstm->links)
-                       nvif_outp_release(&mstm->outp->outp);
-               mstm->disabled = false;
-       }
 }
 
 static struct drm_connector *
@@ -1582,7 +1580,6 @@ nv50_sor_atomic_disable(struct drm_encoder *encoder, struct drm_atomic_state *st
 
        nv_encoder->update(nv_encoder, nv_crtc->index, NULL, 0, 0);
        nv50_audio_disable(encoder, nv_crtc);
-       nvif_outp_release(&nv_encoder->outp);
        nv_encoder->crtc = NULL;
 }
 
@@ -1827,7 +1824,6 @@ nv50_pior_atomic_disable(struct drm_encoder *encoder, struct drm_atomic_state *s
 
        core->func->pior->ctrl(core, nv_encoder->outp.or.id, ctrl, NULL);
        nv_encoder->crtc = NULL;
-       nvif_outp_release(&nv_encoder->outp);
 }
 
 static void
@@ -1990,8 +1986,10 @@ nv50_disp_atomic_commit_core(struct drm_atomic_state *state, u32 *interlock)
                                                  nv_encoder->conn, NULL, NULL);
                                outp->enabled = outp->disabled = false;
                        } else {
-                               if (outp->disabled)
+                               if (outp->disabled) {
+                                       nvif_outp_release(&nv_encoder->outp);
                                        outp->disabled = false;
+                               }
                        }
                }
        }
index b288ea6658da65de60331c81f3cd4a56365853b5..20a013f1bbbacc07327feea14a8dd94a64d1f51a 100644 (file)
@@ -238,6 +238,7 @@ void
 nvkm_outp_release(struct nvkm_outp *outp)
 {
        nvkm_outp_release_or(outp, NVKM_OUTP_USER);
+       nvkm_outp_route(outp->disp);
 }
 
 void
index ffd174091454fff68a23b48c09e272612b548822..40cbb4ddc0378b325be9b2266c8d83e68bcbe296 100644 (file)
@@ -188,6 +188,8 @@ nvkm_uoutp_mthd_release(struct nvkm_outp *outp, void *argv, u32 argc)
 
        if (argc != sizeof(args->vn))
                return -ENOSYS;
+       if (!outp->ior)
+               return -EINVAL;
 
        nvkm_outp_release(outp);
        return 0;