[Intel-gfx] [PATCH 1/4] drm/i915/lspcon: Ensure AUX CH is awake while in DP Sleep state

Sharma, Shashank shashank.sharma at intel.com
Tue Nov 22 10:13:33 UTC 2016


Reviewed-by: Shashank Sharma

Regards
Shashank
On 11/22/2016 12:45 AM, Imre Deak wrote:
> Some LSPCON adaptors won't properly wake up in response to an AUX
> request after the adaptor was placed to a DP Sink Sleep state (via
> writing 0x2 to DP_SET_POWER). Based on the DP 1.4 specification 5.2.5,
> the sink may place the AUX CH into a low-power state while in Sleep
> state, but should wake it up in response to an AUX request within 1-20ms
> (answering with AUX defers while waking it up). As opposed to this at
> least the ParadTech PS175 adaptor won't fully wake in response to the
> first I2C-over-AUX access and will occasionally ignore the offset in I2C
> messages. This can result in accessing the DDC register at offset 0
> regardless of the specified offset and the LSPCON detection failing.
>
> To fix this do an initial dummy read from the DPCD area. The PS175 will
> defer this access until it's fully woken (taking ~150ms) making sure the
> following I2C-over-AUX accesses will work correctly.
>
> Cc: Shashank Sharma <shashank.sharma at intel.com>
> Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
> Cc: Jani Nikula <jani.nikula at intel.com>
> Reference: https://bugs.freedesktop.org/show_bug.cgi?id=98353
> Signed-off-by: Imre Deak <imre.deak at intel.com>
> ---
>   drivers/gpu/drm/i915/intel_lspcon.c | 21 ++++++++++++++++++++-
>   1 file changed, 20 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_lspcon.c b/drivers/gpu/drm/i915/intel_lspcon.c
> index daa5234..5013124 100644
> --- a/drivers/gpu/drm/i915/intel_lspcon.c
> +++ b/drivers/gpu/drm/i915/intel_lspcon.c
> @@ -77,11 +77,29 @@ static int lspcon_change_mode(struct intel_lspcon *lspcon,
>   	return 0;
>   }
>   
> +static bool lspcon_wake_native_aux_ch(struct intel_lspcon *lspcon)
> +{
> +	uint8_t rev;
> +
> +	if (drm_dp_dpcd_readb(&lspcon_to_intel_dp(lspcon)->aux, DP_DPCD_REV,
> +			      &rev) != 1) {
> +		DRM_DEBUG_KMS("Native AUX CH down\n");
> +		return false;
> +	}
> +
> +	DRM_DEBUG_KMS("Native AUX CH up, DPCD version: %d.%d\n",
> +		      rev >> 4, rev & 0xf);
> +
> +	return true;
> +}
> +
>   static bool lspcon_probe(struct intel_lspcon *lspcon)
>   {
>   	enum drm_dp_dual_mode_type adaptor_type;
>   	struct i2c_adapter *adapter = &lspcon_to_intel_dp(lspcon)->aux.ddc;
>   
> +	lspcon_wake_native_aux_ch(lspcon);
> +
>   	/* Lets probe the adaptor and check its type */
>   	adaptor_type = drm_dp_dual_mode_detect(adapter);
>   	if (adaptor_type != DRM_DP_DUAL_MODE_LSPCON) {
> @@ -132,7 +150,8 @@ static void lspcon_resume_in_pcon_wa(struct intel_lspcon *lspcon)
>   
>   void lspcon_resume(struct intel_lspcon *lspcon)
>   {
> -	lspcon_resume_in_pcon_wa(lspcon);
> +	if (lspcon_wake_native_aux_ch(lspcon))
> +		lspcon_resume_in_pcon_wa(lspcon);
>   
>   	if (lspcon_change_mode(lspcon, DRM_LSPCON_MODE_PCON, true))
>   		DRM_ERROR("LSPCON resume failed\n");



More information about the Intel-gfx mailing list