All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: "José Roberto de Souza" <jose.souza@intel.com>
Cc: intel-gfx@lists.freedesktop.org, Paulo Zanoni <paulo.r.zanoni@intel.com>
Subject: Re: [PATCH 5/6] drm/i915/icl: Delay hotplug processing for tc ports
Date: Tue, 30 Oct 2018 19:52:46 +0200	[thread overview]
Message-ID: <20181030175246.GB9144@intel.com> (raw)
In-Reply-To: <20181010213508.3046-5-jose.souza@intel.com>

On Wed, Oct 10, 2018 at 02:35:07PM -0700, José Roberto de Souza wrote:
> Some USB type-C dongles requires some time to power on before being
> able to process aux channel transactions.
> It was not a problem for older gens because there was a bridge
> between DP port and USB-C controller adding some delay but ICL
> handles type-C native.
> 
> So here trying to do a aux channel transaction at each 150ms for up 5
> times, before giving up.
> 
> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_drv.h      |  1 +
>  drivers/gpu/drm/i915/intel_dp.c      |  7 ++++
>  drivers/gpu/drm/i915/intel_drv.h     |  6 ++-
>  drivers/gpu/drm/i915/intel_hotplug.c | 58 ++++++++++++++++++++++++++++
>  4 files changed, 71 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 3017ef037fed..b3f1fc865366 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -2810,6 +2810,7 @@ enum hpd_pin intel_hpd_pin_default(struct drm_i915_private *dev_priv,
>  				   enum port port);
>  bool intel_hpd_disable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
>  void intel_hpd_enable(struct drm_i915_private *dev_priv, enum hpd_pin pin);
> +void intel_hotplug_tc_wa_work(struct work_struct *__work);
>  
>  /* i915_irq.c */
>  static inline void i915_queue_hangcheck(struct drm_i915_private *dev_priv)
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 60e62a3c1e22..b945385cd5bc 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -5289,6 +5289,7 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder)
>  {
>  	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
>  	struct intel_dp *intel_dp = &intel_dig_port->dp;
> +	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
>  
>  	intel_dp_mst_encoder_cleanup(intel_dig_port);
>  	if (intel_dp_is_edp(intel_dp)) {
> @@ -5305,6 +5306,8 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder)
>  			unregister_reboot_notifier(&intel_dp->edp_notifier);
>  			intel_dp->edp_notifier.notifier_call = NULL;
>  		}
> +	} else if (IS_ICELAKE(dev_priv)) {
> +		cancel_delayed_work_sync(&intel_dp->tc_wa_work);
>  	}
>  
>  	intel_dp_aux_fini(intel_dp);
> @@ -6663,6 +6666,10 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
>  		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
>  	}
>  
> +	if (IS_ICELAKE(dev_priv) && !intel_dp_is_edp(intel_dp))
> +		INIT_DELAYED_WORK(&intel_dp->tc_wa_work,
> +				  intel_hotplug_tc_wa_work);
> +
>  	return true;
>  
>  fail:
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 3dea7a1bda7f..174a54aa966a 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -1100,7 +1100,11 @@ struct intel_dp {
>  	int panel_power_cycle_delay;
>  	int backlight_on_delay;
>  	int backlight_off_delay;
> -	struct delayed_work panel_vdd_work;
> +	union {
> +		struct delayed_work panel_vdd_work;
> +		struct delayed_work tc_wa_work;
> +	};
> +	u8 tc_wa_count;
>  	bool want_panel_vdd;
>  	unsigned long last_power_on;
>  	unsigned long last_backlight_off;
> diff --git a/drivers/gpu/drm/i915/intel_hotplug.c b/drivers/gpu/drm/i915/intel_hotplug.c
> index 648a13c6043c..96546067f832 100644
> --- a/drivers/gpu/drm/i915/intel_hotplug.c
> +++ b/drivers/gpu/drm/i915/intel_hotplug.c
> @@ -323,6 +323,45 @@ static void i915_digport_work_func(struct work_struct *work)
>  	}
>  }
>  
> +#define TC_WA_DELAY_MSEC 150
> +#define TC_WA_TRIES 5
> +
> +void intel_hotplug_tc_wa_work(struct work_struct *__work)
> +{
> +	struct intel_dp *intel_dp = container_of(to_delayed_work(__work),
> +						 struct intel_dp, tc_wa_work);
> +	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
> +	struct intel_encoder *intel_encoder = &intel_dig_port->base;
> +	struct intel_connector *intel_connector = intel_dp->attached_connector;
> +	struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
> +	struct drm_device *dev = &dev_priv->drm;
> +	u8 val;
> +
> +	if (!intel_port_is_tc(dev_priv, intel_encoder->port) ||
> +	    !intel_digital_port_connected(intel_encoder))
> +		return;
> +
> +	if (drm_dp_dpcd_read(&intel_dp->aux, DP_DPCD_REV, &val, 1) < 1) {
> +		intel_dp->tc_wa_count++;
> +
> +		if (intel_dp->tc_wa_count < TC_WA_TRIES) {
> +			unsigned long delay;
> +
> +			delay = msecs_to_jiffies(TC_WA_DELAY_MSEC);
> +			schedule_delayed_work(&intel_dp->tc_wa_work, delay);
> +		} else {
> +			DRM_DEBUG_KMS("TC not responsive, giving up\n");
> +		}
> +	} else {
> +		mutex_lock(&dev->mode_config.mutex);
> +		val = intel_encoder->hotplug(intel_encoder, intel_connector);
> +		mutex_unlock(&dev->mode_config.mutex);
> +
> +		if (val)
> +			drm_kms_helper_hotplug_event(dev);
> +	}
> +}
> +
>  /*
>   * Handle hotplug events outside the interrupt handler proper.
>   */
> @@ -361,6 +400,25 @@ static void i915_hotplug_work_func(struct work_struct *work)
>  			DRM_DEBUG_KMS("Connector %s (pin %i) received hotplug event.\n",
>  				      connector->name, intel_encoder->hpd_pin);
>  
> +			/*
> +			 * TC WA: TC dongles takes some type to be
> +			 * responsible
> +			 */
> +			if (IS_ICELAKE(dev_priv) &&
> +			    intel_port_is_tc(dev_priv, intel_encoder->port) &&
> +			    intel_digital_port_connected(intel_encoder)) {
> +				struct intel_dp *intel_dp;
> +				unsigned long delay;
> +
> +				intel_dp = enc_to_intel_dp(&intel_encoder->base);
> +
> +				intel_dp->tc_wa_count = 0;
> +				delay = msecs_to_jiffies(TC_WA_DELAY_MSEC);
> +				schedule_delayed_work(&intel_dp->tc_wa_work,
> +						      delay);
> +				continue;
> +			}
> +
>  			changed |= intel_encoder->hotplug(intel_encoder,
>  							  intel_connector);

I think if we need such duct-tape we should just stuff it into the
.hotplug() hook.

>  		}
> -- 
> 2.19.1
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ville Syrjälä
Intel
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2018-10-30 17:52 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-10-10 21:35 [PATCH 1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink José Roberto de Souza
2018-10-10 21:35 ` [PATCH 2/6] drm/i915/icl: Set TC type to unknown in the disconnection flow José Roberto de Souza
2018-10-10 21:35 ` [PATCH 3/6] drm/i915/icl: Set TC type to unknown when a sudden disconnection happen José Roberto de Souza
2018-10-30 17:51   ` Ville Syrjälä
2018-10-30 20:42     ` Souza, Jose
2018-10-10 21:35 ` [PATCH 4/6] drm/i915: Initialize panel_vdd_work only for eDP ports José Roberto de Souza
2018-10-30 17:51   ` Ville Syrjälä
2018-10-10 21:35 ` [PATCH 5/6] drm/i915/icl: Delay hotplug processing for tc ports José Roberto de Souza
2018-10-30 17:52   ` Ville Syrjälä [this message]
2018-10-31  1:02     ` Souza, Jose
2018-10-10 21:35 ` [PATCH 6/6] drm/i915/icl: Fix crash when getting DPLL of a MST encoder in TC ports José Roberto de Souza
2018-10-30 17:56   ` Ville Syrjälä
2018-10-10 21:52 ` ✗ Fi.CI.SPARSE: warning for series starting with [1/6] drm/i915/debugfs: Do not print cached information of a disconnected sink Patchwork
2018-10-10 22:12 ` ✓ Fi.CI.BAT: success " Patchwork
2018-10-11  7:54 ` ✓ Fi.CI.IGT: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181030175246.GB9144@intel.com \
    --to=ville.syrjala@linux.intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=jose.souza@intel.com \
    --cc=paulo.r.zanoni@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.