diff mbox

drm/i915: Don't try to set the DP sink power state on disconnected monitors

Message ID 1386862464-29363-1-git-send-email-damien.lespiau@intel.com (mailing list archive)
State New, archived
Headers show

Commit Message

Lespiau, Damien Dec. 12, 2013, 3:34 p.m. UTC
While looking at some debug traces, I noticed that we were always trying
to set the sink power, even when we previously identified that the
connector was in the disconnected state.

In that case, we don't a big chance for the write to succeed, so don't
try.

[drm:drm_helper_probe_single_connector_modes], [CONNECTOR:30:DP-3]
[drm:intel_dp_detect], [CONNECTOR:30:DP-3]
[drm:drm_helper_probe_single_connector_modes], [CONNECTOR:30:DP-3] disconnected
[drm:intel_dp_aux_ch], dp_aux_ch timeout status 0x7015003f
[drm:intel_dp_sink_dpms], failed to write sink power state

Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>
---
 drivers/gpu/drm/i915/intel_dp.c | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)

Comments

Daniel Vetter Dec. 12, 2013, 4:50 p.m. UTC | #1
On Thu, Dec 12, 2013 at 03:34:24PM +0000, Damien Lespiau wrote:
> While looking at some debug traces, I noticed that we were always trying
> to set the sink power, even when we previously identified that the
> connector was in the disconnected state.
> 
> In that case, we don't a big chance for the write to succeed, so don't
> try.
> 
> [drm:drm_helper_probe_single_connector_modes], [CONNECTOR:30:DP-3]
> [drm:intel_dp_detect], [CONNECTOR:30:DP-3]
> [drm:drm_helper_probe_single_connector_modes], [CONNECTOR:30:DP-3] disconnected
> [drm:intel_dp_aux_ch], dp_aux_ch timeout status 0x7015003f
> [drm:intel_dp_sink_dpms], failed to write sink power state
> 
> Signed-off-by: Damien Lespiau <damien.lespiau@intel.com>

How wide-spread is this issue? Is this the only place where we routinely
do this (e.g. after the user yanked the connector and we switch things
off) or are there other place?

Link training comes to mind, but doing the right thing (i.e. just
switching to normal mode so that the pipe runs) is a bit more involved. So
that one's out of scope for this patch. But I wonder what other places
there are ...
-Daniel

> ---
>  drivers/gpu/drm/i915/intel_dp.c | 7 +++++--
>  1 file changed, 5 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 9b40113..006bca5 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -1361,18 +1361,21 @@ static void ironlake_edp_pll_off(struct intel_dp *intel_dp)
>  /* If the sink supports it, try to set the power state appropriately */
>  void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode)
>  {
> +	struct intel_connector *intel_connector = intel_dp->attached_connector;
> +	struct drm_connector *connector = &intel_connector->base;
>  	int ret, i;
>  
>  	/* Should have a valid DPCD by this point */
>  	if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
>  		return;
>  
> -	if (mode != DRM_MODE_DPMS_ON) {
> +	if (mode != DRM_MODE_DPMS_ON &&
> +	    connector->status != connector_status_disconnected) {
>  		ret = intel_dp_aux_native_write_1(intel_dp, DP_SET_POWER,
>  						  DP_SET_POWER_D3);
>  		if (ret != 1)
>  			DRM_DEBUG_DRIVER("failed to write sink power state\n");
> -	} else {
> +	} else if (mode == DRM_MODE_DPMS_ON) {
>  		/*
>  		 * When turning on, we need to retry for 1ms to give the sink
>  		 * time to wake up.
> -- 
> 1.8.3.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
diff mbox

Patch

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 9b40113..006bca5 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -1361,18 +1361,21 @@  static void ironlake_edp_pll_off(struct intel_dp *intel_dp)
 /* If the sink supports it, try to set the power state appropriately */
 void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode)
 {
+	struct intel_connector *intel_connector = intel_dp->attached_connector;
+	struct drm_connector *connector = &intel_connector->base;
 	int ret, i;
 
 	/* Should have a valid DPCD by this point */
 	if (intel_dp->dpcd[DP_DPCD_REV] < 0x11)
 		return;
 
-	if (mode != DRM_MODE_DPMS_ON) {
+	if (mode != DRM_MODE_DPMS_ON &&
+	    connector->status != connector_status_disconnected) {
 		ret = intel_dp_aux_native_write_1(intel_dp, DP_SET_POWER,
 						  DP_SET_POWER_D3);
 		if (ret != 1)
 			DRM_DEBUG_DRIVER("failed to write sink power state\n");
-	} else {
+	} else if (mode == DRM_MODE_DPMS_ON) {
 		/*
 		 * When turning on, we need to retry for 1ms to give the sink
 		 * time to wake up.