[Intel-gfx] [PATCH] drm/i915/hsw: Fix workaround for server AUX channel clock divisor

Jim Bride jim.bride at linux.intel.com
Thu May 21 11:34:39 PDT 2015


On Thu, May 21, 2015 at 03:04:40PM +0300, Jani Nikula wrote:
> On Thu, 21 May 2015, Ville Syrjälä <ville.syrjala at linux.intel.com> wrote:
> > On Wed, May 20, 2015 at 04:07:37PM -0700, Todd Previte wrote:
> >> Hi Jim,
> >> 
> >> I checked the BSpec as well and there's nothing indicating that these 
> >> two bits are mutually exclusive. They are both sticky though, and if the 
> >> loop times out 5 times, both _DONE and _TIMEOUT may very well be set. In 
> >> that case the current code would just exit and never bother to change 
> >> clock dividers. So I think your code here is valid.
> >
> > Shouldn't we we checking receive error as well then?
> 
> In other words,
> 
> 
> diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> index 7cf3fd43071a..179af62d803d 100644
> --- a/drivers/gpu/drm/i915/intel_dp.c
> +++ b/drivers/gpu/drm/i915/intel_dp.c
> @@ -893,10 +893,8 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
>  				continue;
>  			}
>  			if (status & DP_AUX_CH_CTL_DONE)
> -				break;
> +				goto done;
>  		}
> -		if (status & DP_AUX_CH_CTL_DONE)
> -			break;
>  	}
>  
>  	if ((status & DP_AUX_CH_CTL_DONE) == 0) {
> @@ -921,7 +919,7 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
>  		ret = -ETIMEDOUT;
>  		goto out;
>  	}
> -
> +done:
>  	/* Unload any bytes sent back from the other side */
>  	recv_bytes = ((status & DP_AUX_CH_CTL_MESSAGE_SIZE_MASK) >>
>  		      DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT);

This looks good, except I think we might want something more like:

diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 0edc305..89ab714 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -893,10 +893,8 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
                                continue;
                        }
                        if (status & DP_AUX_CH_CTL_DONE)
-                               break;
+                               goto done;;
                }
-               if (status & DP_AUX_CH_CTL_DONE)
-                       break;
        }
 
        if ((status & DP_AUX_CH_CTL_DONE) == 0) {
@@ -905,6 +903,7 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
                goto out;
        }
 
+done:
        /* Check for timeout or receive error.
         * Timeouts occur when the sink is not connected
         */

This way we actually set ret appropriately in the event of a receive error
or a timeout.

Thoughts?

Jim


> 
> 
> 
> >
> > In fact looking at our code after the loop, it's expecting DONE to be
> > set before it'll even report receive/timeout errors to the user as
> > EIO/ETIMEDOUT, otherwise it'll just return EBUSY.
> >
> >> 
> >> The only thing you may want to do is capture some of the IRC discussion 
> >> though. In particular, whether or not this is really HSW-specific, how 
> >> this affects other platforms and and the additional delays incurred by 
> >> running through the loop again after changing AUX channel clock dividers 
> >> would be good information to put in there. That's probably more of a 
> >> bikeshed though.
> >> 
> >> Reviewed-by: Todd Previte <tprevite at gmail.com>
> >> 
> >> -T
> >> 
> >> On 5/19/2015 9:13 AM, jim.bride at linux.intel.com wrote:
> >> > From: Jim Bride <jim.bride at linux.intel.com>
> >> >
> >> > According to the HSW b-spec we need to try clock divisors of 63
> >> > and 72, each 3 or more times, when attempting DP AUX channel
> >> > communication on a server chipset.  This actually wasn't happening
> >> > due to a short-circuit that only checked the DP_AUX_CH_CTL_DONE bit
> >> > in status rather than checking that the operation was done and
> >> > that DP_AUX_CH_CTL_TIME_OUT_ERROR was not set.
> >> >
> >> > Signed-off-by: Jim Bride <jim.bride at linux.intel.com>
> >> > ---
> >> >   drivers/gpu/drm/i915/intel_dp.c | 3 ++-
> >> >   1 file changed, 2 insertions(+), 1 deletion(-)
> >> >
> >> > diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
> >> > index 0edc305..c01a3f9 100644
> >> > --- a/drivers/gpu/drm/i915/intel_dp.c
> >> > +++ b/drivers/gpu/drm/i915/intel_dp.c
> >> > @@ -895,7 +895,8 @@ intel_dp_aux_ch(struct intel_dp *intel_dp,
> >> >   			if (status & DP_AUX_CH_CTL_DONE)
> >> >   				break;
> >> >   		}
> >> > -		if (status & DP_AUX_CH_CTL_DONE)
> >> > +		if ((status & DP_AUX_CH_CTL_DONE) &&
> >> > +		    !(status & DP_AUX_CH_CTL_TIME_OUT_ERROR))
> >> >   			break;
> >> >   	}
> >> >   
> >> 
> >> _______________________________________________
> >> Intel-gfx mailing list
> >> Intel-gfx at lists.freedesktop.org
> >> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> >
> > -- 
> > Ville Syrjälä
> > Intel OTC
> > _______________________________________________
> > Intel-gfx mailing list
> > Intel-gfx at lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/intel-gfx
> 
> -- 
> Jani Nikula, Intel Open Source Technology Center
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx


More information about the Intel-gfx mailing list