On Mon, Oct 28, 2019 at 08:15:17PM +0200, Imre Deak wrote: > For the HPD interrupt functionality the HW depends on power wells in the > display core domain to be on. Accordingly when enabling these power > wells the HPD polling logic will force an HPD detection cycle to account > for hotplug events that may have happened when such a power well was > off. > > Thus a detect cycle started by polling could start a new detect cycle if > a power well in the display core domain gets enabled during detect and > stays enabled after detect completes. That in turn can lead to a > detection cycle runaway. > > To prevent re-triggering a poll-detect cycle make sure we drop all power > references we acquired during detect synchronously by the end of detect. > This will let the poll-detect logic continue with polling (matching the > off state of the corresponding power wells) instead of scheduling a new > detection cycle. > > Fixes: 6cfe7ec02e85 ("drm/i915: Remove the unneeded AUX power ref from intel_dp_detect()") > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=112125 > Reported-and-tested-by: Val Kulkov <val.kulkov@xxxxxxxxx> > Reported-and-tested-by: wangqr <wqr.prg@xxxxxxxxx> > Cc: Val Kulkov <val.kulkov@xxxxxxxxx> > Cc: wangqr <wqr.prg@xxxxxxxxx> > Cc: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > Signed-off-by: Imre Deak <imre.deak@xxxxxxxxx> Reviewed-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > --- > drivers/gpu/drm/i915/display/intel_crt.c | 7 +++++++ > drivers/gpu/drm/i915/display/intel_dp.c | 6 ++++++ > drivers/gpu/drm/i915/display/intel_hdmi.c | 6 ++++++ > 3 files changed, 19 insertions(+) > > diff --git a/drivers/gpu/drm/i915/display/intel_crt.c b/drivers/gpu/drm/i915/display/intel_crt.c > index ff6126ea793c..834bf1d43bb8 100644 > --- a/drivers/gpu/drm/i915/display/intel_crt.c > +++ b/drivers/gpu/drm/i915/display/intel_crt.c > @@ -864,6 +864,13 @@ intel_crt_detect(struct drm_connector *connector, > > out: > intel_display_power_put(dev_priv, intel_encoder->power_domain, wakeref); > + > + /* > + * Make sure the refs for power wells enabled during detect are > + * dropped to avoid a new detect cycle triggered by HPD polling. > + */ > + intel_display_power_flush_work(dev_priv); > + > return status; > } > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c > index 86989ec25bc6..486fe203f56c 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > @@ -5688,6 +5688,12 @@ intel_dp_detect(struct drm_connector *connector, > if (status != connector_status_connected && !intel_dp->is_mst) > intel_dp_unset_edid(intel_dp); > > + /* > + * Make sure the refs for power wells enabled during detect are > + * dropped to avoid a new detect cycle triggered by HPD polling. > + */ > + intel_display_power_flush_work(dev_priv); > + > return status; > } > > diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c > index b54ccbb5aad5..ff71a4da3d00 100644 > --- a/drivers/gpu/drm/i915/display/intel_hdmi.c > +++ b/drivers/gpu/drm/i915/display/intel_hdmi.c > @@ -2626,6 +2626,12 @@ intel_hdmi_detect(struct drm_connector *connector, bool force) > if (status != connector_status_connected) > cec_notifier_phys_addr_invalidate(intel_hdmi->cec_notifier); > > + /* > + * Make sure the refs for power wells enabled during detect are > + * dropped to avoid a new detect cycle triggered by HPD polling. > + */ > + intel_display_power_flush_work(dev_priv); > + > return status; > } > > -- > 2.17.1 -- Ville Syrjälä Intel _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx