Re: [Intel-gfx] [PATCH v2] drm/i915: Avoid HPD poll detect triggering a new detect cycle

2019-10-30 Thread Ville Syrjälä
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 
> Reported-and-tested-by: wangqr 
> Cc: Val Kulkov 
> Cc: wangqr 
> Cc: Ville Syrjälä 
> Signed-off-by: Imre Deak 

Reviewed-by: Ville Syrjälä 

> ---
>  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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Re: [Intel-gfx] [PATCH v2] drm/i915: Avoid HPD poll detect triggering a new detect cycle

2019-10-29 Thread Val Kulkov
On Mon, 28 Oct 2019 at 14:16, 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 
> Reported-and-tested-by: wangqr 
> Cc: Val Kulkov 
> Cc: wangqr 
> Cc: Ville Syrjälä 
> Signed-off-by: Imre Deak 

Confirming that this latest revision of the patch fixes the issue.
Tested on linux-drm-tip-git
5.4.865162.dd5bccfa3b5d-1 on Eglobal NUC Fanless Mini PC Intel N3150.
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

[Intel-gfx] [PATCH v2] drm/i915: Avoid HPD poll detect triggering a new detect cycle

2019-10-28 Thread Imre Deak
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 
Reported-and-tested-by: wangqr 
Cc: Val Kulkov 
Cc: wangqr 
Cc: Ville Syrjälä 
Signed-off-by: Imre Deak 
---
 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

___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx