[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