Lyude Paul
2018-Sep-14 20:44 UTC
[Nouveau] [PATCH] drm/nouveau: Grab runtime PM ref in nv50_mstc_detect()
While we currently grab a runtime PM ref in nouveau's normal connector detection code, we apparently don't do this for MST. This means if we're in a scenario where the GPU is suspended and userspace attempts to do a connector probe on an MSTC connector, the probe will fail entirely due to the DP aux channel and GPU not being woken up: [ 316.633489] nouveau 0000:01:00.0: i2c: aux 000a: begin idle timeout ffffffff [ 316.635713] nouveau 0000:01:00.0: i2c: aux 000a: begin idle timeout ffffffff [ 316.637785] nouveau 0000:01:00.0: i2c: aux 000a: begin idle timeout ffffffff ... So, grab a runtime PM ref here. Signed-off-by: Lyude Paul <lyude at redhat.com> Cc: stable at vger.kernel.org --- drivers/gpu/drm/nouveau/dispnv50/disp.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c index c94b7f42d62d..9da0bdfe1e1c 100644 --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c @@ -938,9 +938,22 @@ static enum drm_connector_status nv50_mstc_detect(struct drm_connector *connector, bool force) { struct nv50_mstc *mstc = nv50_mstc(connector); + enum drm_connector_status conn_status; + int ret; + if (!mstc->port) return connector_status_disconnected; - return drm_dp_mst_detect_port(connector, mstc->port->mgr, mstc->port); + + ret = pm_runtime_get_sync(connector->dev->dev); + if (ret < 0 && ret != -EACCES) + return connector_status_disconnected; + + conn_status = drm_dp_mst_detect_port(connector, mstc->port->mgr, + mstc->port); + + pm_runtime_mark_last_busy(connector->dev->dev); + pm_runtime_put_autosuspend(connector->dev->dev); + return conn_status; } static void -- 2.17.1
Karol Herbst
2018-Sep-21 19:12 UTC
[Nouveau] [PATCH] drm/nouveau: Grab runtime PM ref in nv50_mstc_detect()
Reviewed-by: Karol Herbst <kherbst at redhat.com> On Fri, Sep 14, 2018 at 10:44 PM, Lyude Paul <lyude at redhat.com> wrote:> While we currently grab a runtime PM ref in nouveau's normal connector > detection code, we apparently don't do this for MST. This means if we're > in a scenario where the GPU is suspended and userspace attempts to do a > connector probe on an MSTC connector, the probe will fail entirely due > to the DP aux channel and GPU not being woken up: > > [ 316.633489] nouveau 0000:01:00.0: i2c: aux 000a: begin idle timeout ffffffff > [ 316.635713] nouveau 0000:01:00.0: i2c: aux 000a: begin idle timeout ffffffff > [ 316.637785] nouveau 0000:01:00.0: i2c: aux 000a: begin idle timeout ffffffff > ... > > So, grab a runtime PM ref here. > > Signed-off-by: Lyude Paul <lyude at redhat.com> > Cc: stable at vger.kernel.org > --- > drivers/gpu/drm/nouveau/dispnv50/disp.c | 15 ++++++++++++++- > 1 file changed, 14 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/nouveau/dispnv50/disp.c b/drivers/gpu/drm/nouveau/dispnv50/disp.c > index c94b7f42d62d..9da0bdfe1e1c 100644 > --- a/drivers/gpu/drm/nouveau/dispnv50/disp.c > +++ b/drivers/gpu/drm/nouveau/dispnv50/disp.c > @@ -938,9 +938,22 @@ static enum drm_connector_status > nv50_mstc_detect(struct drm_connector *connector, bool force) > { > struct nv50_mstc *mstc = nv50_mstc(connector); > + enum drm_connector_status conn_status; > + int ret; > + > if (!mstc->port) > return connector_status_disconnected; > - return drm_dp_mst_detect_port(connector, mstc->port->mgr, mstc->port); > + > + ret = pm_runtime_get_sync(connector->dev->dev); > + if (ret < 0 && ret != -EACCES) > + return connector_status_disconnected; > + > + conn_status = drm_dp_mst_detect_port(connector, mstc->port->mgr, > + mstc->port); > + > + pm_runtime_mark_last_busy(connector->dev->dev); > + pm_runtime_put_autosuspend(connector->dev->dev); > + return conn_status; > } > > static void > -- > 2.17.1 > > _______________________________________________ > Nouveau mailing list > Nouveau at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/nouveau
Seemingly Similar Threads
- [PATCH v5 06/14] drm/dp_mst: Protect drm_dp_mst_port members with locking
- [PATCH] drm/nouveau/dispnv50: fix runtime pm imbalance on error
- [PATCH 0/6] Remove all bad dp_mst_port uses and hide struct def
- [WIP PATCH 10/15] drm/nouveau: Stop unsetting mstc->port, use malloc refs
- [PATCH RESEND v3 0/5] drm/dp_mst: Improve VCPI helpers, use in nouveau