drm/nouveau/disp/dp: train link only when actively displaying an image
authorBen Skeggs <bskeggs@redhat.com>
Fri, 19 May 2017 13:59:35 +0000 (23:59 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Fri, 16 Jun 2017 04:04:52 +0000 (14:04 +1000)
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>
drivers/gpu/drm/nouveau/nvkm/engine/disp/dp.c
drivers/gpu/drm/nouveau/nvkm/engine/disp/rootnv50.c

index a67192a..f3b2550 100644 (file)
@@ -417,7 +417,9 @@ nvkm_output_dp_train(struct nvkm_outp *outp, u32 datakbps)
        /* 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 enable)
                }
 
                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) {
index b817cb5..9cf1365 100644 (file)
@@ -125,7 +125,7 @@ nv50_disp_root_mthd_(struct nvkm_object *object, u32 mthd, void *data, u32 size)
        }
                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 *object, u32 mthd, void *data, u32 size)
                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;