Re: [Intel-gfx] [PATCH] drm/i915: Make sure cdclk is high enough for DP audio on VLV/CHV

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Quoting Ville Syrjälä (2019-07-18 19:04:56)
> On Thu, Jul 18, 2019 at 06:11:08PM +0100, Chris Wilson wrote:
> > Quoting Ville Syrjala (2019-07-17 12:45:36)
> > > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>
> > > 
> > > On VLV/CHV there is some kind of linkage between the cdclk frequency
> > > and the DP link frequency. The spec says:
> > > "For DP audio configuration, cdclk frequency shall be set to
> > >  meet the following requirements:
> > >  DP Link Frequency(MHz) | Cdclk frequency(MHz)
> > >  270                    | 320 or higher
> > >  162                    | 200 or higher"
> > > 
> > > I suspect that would more accurately be expressed as
> > > "cdclk >= DP link clock", and in any case we can express it like
> > > that in the code because of the limited set of cdclk and link
> > > frequencies we support.
> > > 
> > > Without this we can end up in a situation where the cdclk
> > > is too low and enabling DP audio will kill the pipe. Happens
> > > eg. with 2560x1440 modes where the 266MHz cdclk is sufficient
> > > to pump the pixels (241.5 MHz dotclock) but is too low for
> > > the DP audio due to the link frequency being 270 MHz.
> > > 
> > > Cc: stable@xxxxxxxxxxxxxxx
> > > Tested-by: Stefan Gottwald <gottwald@xxxxxxxx>
> > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=111149
> > > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx>
> > > ---
> > >  drivers/gpu/drm/i915/display/intel_cdclk.c | 11 +++++++++++
> > >  1 file changed, 11 insertions(+)
> > > 
> > > diff --git a/drivers/gpu/drm/i915/display/intel_cdclk.c b/drivers/gpu/drm/i915/display/intel_cdclk.c
> > > index d0581a1ac243..93b0d190c184 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_cdclk.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_cdclk.c
> > > @@ -2262,6 +2262,17 @@ int intel_crtc_compute_min_cdclk(const struct intel_crtc_state *crtc_state)
> > >         if (crtc_state->has_audio && INTEL_GEN(dev_priv) >= 9)
> > >                 min_cdclk = max(2 * 96000, min_cdclk);
> > >  
> > > +       /*
> > > +        * "For DP audio configuration, cdclk frequency shall be set to
> > > +        *  meet the following requirements:
> > > +        *  DP Link Frequency(MHz) | Cdclk frequency(MHz)
> > > +        *  270                    | 320 or higher
> > > +        *  162                    | 200 or higher"
> > > +        */
> > > +       if ((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
> > > +           intel_crtc_has_dp_encoder(crtc_state) && crtc_state->has_audio)
> > > +               min_cdclk = max(crtc_state->port_clock, min_cdclk);
> > 
> > I tracked port_clock down to being the dp link clock (162 or 270) so
> > that part of the story checks out.
> > 
> > Judging by the rest of the function, I buy that the cdclk and link clock
> > may be inscrutably tied together, and accept the test result that the
> > cdclk must be at least the link clock with audio enabled.
> > 
> > It may be that a corner case does require a higher frequency (rather
> > than just bumping from 266 to 270), but for here and now
> 
> Yeah there could be some extra headroom required. But our cdclk
> can only be 200, 266, 320 or 400 MHz (and 200 won't actually get used
> due to inexplicable display failure when try to use it). So in practice
> we going to actually get bumped 162->266 and 270->320 here. I should
> have expressed that better in the commit message.

Also, I didn't find an easy way to confirm the limited set of cdlck.
Hmm, actually I was looking at min_cdclk and didn't thin to compare that
against any table. Ah, adding a see vlv_calc_cdclk() might have helped
me put together the other side. Certainly adding more of a hint that
min_cdclk isn't the final clock would help :)
-Chris



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux