[Intel-gfx] [PATCH 39/49] drm/i915/chv: use vlv_PLL_is_optimal in chv_find_best_dpll

Daniel Vetter daniel at ffwll.ch
Fri Mar 20 03:02:57 PDT 2015


On Thu, Mar 19, 2015 at 01:34:49PM -0700, Jesse Barnes wrote:
> On 03/17/2015 02:40 AM, Imre Deak wrote:
> > Prepare chv_find_best_dpll to be used for BXT too, where we want to
> > consider the error between target and calculated frequency too when
> > choosing a better PLL configuration.
> > 
> > No functional change.
> > 
> > Signed-off-by: Imre Deak <imre.deak at intel.com>
> > ---
> >  drivers/gpu/drm/i915/intel_display.c | 26 ++++++++++++++++++++------
> >  1 file changed, 20 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> > index 5874512..9ca84a2 100644
> > --- a/drivers/gpu/drm/i915/intel_display.c
> > +++ b/drivers/gpu/drm/i915/intel_display.c
> > @@ -786,6 +786,16 @@ static bool vlv_PLL_is_optimal(struct drm_device *dev, int target_freq,
> >  			       unsigned int best_error_ppm,
> >  			       unsigned int *error_ppm)
> >  {
> > +	/*
> > +	 * For CHV ignore the error and consider only the P value.
> > +	 * Prefer a bigger P value based on HW requirements.
> > +	 */
> > +	if (IS_CHERRYVIEW(dev)) {
> > +		*error_ppm = 0;
> > +
> > +		return calculated_clock->p > best_clock->p;
> > +	}
> > +
> >  	if (WARN_ON_ONCE(!target_freq))
> >  		return false;
> >  
> > @@ -864,11 +874,13 @@ chv_find_best_dpll(const intel_limit_t *limit, struct intel_crtc *crtc,
> >  		   intel_clock_t *best_clock)
> >  {
> >  	struct drm_device *dev = crtc->base.dev;
> > +	unsigned int best_error_ppm;
> >  	intel_clock_t clock;
> >  	uint64_t m2;
> >  	int found = false;
> >  
> >  	memset(best_clock, 0, sizeof(*best_clock));
> > +	best_error_ppm = 1000000;
> >  
> >  	/*
> >  	 * Based on hardware doc, the n always set to 1, and m1 always
> > @@ -882,6 +894,7 @@ chv_find_best_dpll(const intel_limit_t *limit, struct intel_crtc *crtc,
> >  		for (clock.p2 = limit->p2.p2_fast;
> >  				clock.p2 >= limit->p2.p2_slow;
> >  				clock.p2 -= clock.p2 > 10 ? 2 : 1) {
> > +			unsigned int error_ppm;
> >  
> >  			clock.p = clock.p1 * clock.p2;
> >  
> > @@ -898,12 +911,13 @@ chv_find_best_dpll(const intel_limit_t *limit, struct intel_crtc *crtc,
> >  			if (!intel_PLL_is_valid(dev, limit, &clock))
> >  				continue;
> >  
> > -			/* based on hardware requirement, prefer bigger p
> > -			 */
> > -			if (clock.p > best_clock->p) {
> > -				*best_clock = clock;
> > -				found = true;
> > -			}
> > +			if (!vlv_PLL_is_optimal(dev, target, &clock, best_clock,
> > +						best_error_ppm, &error_ppm))
> > +				continue;
> > +
> > +			*best_clock = clock;
> > +			best_error_ppm = error_ppm;
> > +			found = true;
> >  		}
> >  	}
> >  
> > 
> 
> Looking at it again, maybe vlv_PLL_is_better() might be a better name.
> 
> Also, could you just make the ppm variable a scratch one and ignore it?
>  It just gets set to 0 no matter what, right?
> 
> Reviewed-by: Jesse Barnes <jbarnes at virtuousgeek.org>

Also merged to dinq. If there's other refactorings to existing platform
code then I need to get that in in the next few days for it to make the
4.1 cutoff. Otherwise we can't pull the usual "separate branch&late pull"
trick for new platforms.

Thanks, Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the Intel-gfx mailing list