[Intel-gfx] [PATCH v2 07/14] drm/i915: Start moving the cdclk stuff into a distinct state structure

Ander Conselvan De Oliveira conselvan2 at gmail.com
Fri Dec 23 13:07:25 UTC 2016


On Fri, 2016-12-23 at 14:27 +0200, Ville Syrjälä wrote:
> On Fri, Dec 23, 2016 at 11:09:22AM +0200, Ander Conselvan De Oliveira wrote:
> > 
> > On Thu, 2016-12-22 at 16:33 +0200, Ville Syrjälä wrote:
> > > 
> > > On Thu, Dec 22, 2016 at 04:14:40PM +0200, Ander Conselvan De Oliveira
> > > wrote:
> > > > 
> > > > 
> > > > On Mon, 2016-12-19 at 19:28 +0200, ville.syrjala at linux.intel.com wrote:
> > > > > 
> > > > > 
> > > > > From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> > > > > 
> > > > > Introduce intel_cdclk state which for now will track the cdclk
> > > > > frequency, the vco frequency and the reference frequency (not sure we
> > > > > want the last one, but I put it there anyway). We'll also make the
> > > > > .get_cdclk() function fill out this state structure rather than
> > > > > just returning the current cdclk frequency.
> > > > > 
> > > > > One immediate benefit is that calling .get_cdclk() will no longer
> > > > > clobber state stored under dev_priv unless ex[plicitly told to do
> > > > Typo: ex[plicity
> > > > 
> > > > > 
> > > > > 
> > > > > so. Previously it clobbered the vco and reference clocks stored
> > > > > there on some platforms.
> > > > > 
> > > > > We'll expand the use of this structure to actually precomputing the
> > > > > state and whatnot later.
> > > > > 
> > > > > v2: Constify intel_cdclk_state_compare()
> > > > > 
> > > > > Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> > > > A couple more comments beloew, but either way,
> > > > 
> > > > Reviewed-by: Ander Conselvan de Oliveira <conselvan2 at gmail.com>
> > > > 
> > > > > 
> > > > > 
> > > > > ---
> > > > >  drivers/gpu/drm/i915/i915_debugfs.c     |   2 +-
> > > > >  drivers/gpu/drm/i915/i915_drv.h         |  14 +-
> > > > >  drivers/gpu/drm/i915/intel_audio.c      |   2 +-
> > > > >  drivers/gpu/drm/i915/intel_cdclk.c      | 359 ++++++++++++++++++-----
> > > > > ---------
> > > > >  drivers/gpu/drm/i915/intel_display.c    |  18 +-
> > > > >  drivers/gpu/drm/i915/intel_dp.c         |   2 +-
> > > > >  drivers/gpu/drm/i915/intel_drv.h        |   3 +
> > > > >  drivers/gpu/drm/i915/intel_fbc.c        |   2 +-
> > > > >  drivers/gpu/drm/i915/intel_panel.c      |   4 +-
> > > > >  drivers/gpu/drm/i915/intel_runtime_pm.c |   5 +-
> > > > >  10 files changed, 240 insertions(+), 171 deletions(-)
> > > > > 
> > [...]
> > 
> > @@ -629,12 +668,13 @@ static int skl_calc_cdclk(int max_pixclk, int vco)
> > > 
> > > > 
> > > > > 
> > > > >  }
> > > > >  
> > > > > -static void skl_dpll0_update(struct drm_i915_private *dev_priv)
> > > > > +static void skl_dpll0_update(struct drm_i915_private *dev_priv,
> > > > > +			     struct intel_cdclk_state *cdclk_state)
> > > > >  {
> > > > >  	u32 val;
> > > > >  
> > > > > -	dev_priv->cdclk_pll.ref = 24000;
> > > > > -	dev_priv->cdclk_pll.vco = 0;
> > > > > +	cdclk_state->ref = 24000;
> > > > > +	cdclk_state->vco = 0;
> > > > >  
> > > > >  	val = I915_READ(LCPLL1_CTL);
> > > > >  	if ((val & LCPLL_PLL_ENABLE) == 0)
> > > > > @@ -656,11 +696,11 @@ static void skl_dpll0_update(struct
> > > > > drm_i915_private *dev_priv)
> > > > >  	case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350,
> > > > > SKL_DPLL0):
> > > > >  	case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620,
> > > > > SKL_DPLL0):
> > > > >  	case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700,
> > > > > SKL_DPLL0):
> > > > > -		dev_priv->cdclk_pll.vco = 8100000;
> > > > > +		cdclk_state->vco = 8100000;
> > > > >  		break;
> > > > >  	case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080,
> > > > > SKL_DPLL0):
> > > > >  	case DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160,
> > > > > SKL_DPLL0):
> > > > > -		dev_priv->cdclk_pll.vco = 8640000;
> > > > > +		cdclk_state->vco = 8640000;
> > > > >  		break;
> > > > >  	default:
> > > > >  		MISSING_CASE(val &
> > > > > DPLL_CTRL1_LINK_RATE_MASK(SKL_DPLL0));
> > > > This function is a bit funny now, since it sets up the cdclk state based
> > > > on
> > > > current pll0 programming, instead of looking at an atomic state.
> > > We should probably rename it to somehting more descriptive.
> > > skl_get_dpll0()
> > > maybe. Or maybe skl_dpll0_get_config to match the .get_config()
> > > nomenclature used for eg. encoders.
> > Hmm, I think the problem is that this have a mix of get_hw_state() and
> > get_config(). We actually have skl_ddi_dpll0_get_hw_state(), but it wouldn't
> > be
> > trivial to make that code reusable for the cdclk stuff.
> > 
> > Maybe it should be two separate functions, one that gets the hardware state
> > and
> > another for choosing the vco.
> This function only exists to read the hw state.

Then get_hw_state() wouldn't be a bad name. The only difference between this and
the pll get_hw_state() hook is that the latter doesn't set a vco value, since
that is not directly programmed.

> 
> > 
> > Then
> > 
> >   vco = skl_cdclk_vco(skl_dpll0_get_hw_state());
> > 
> > directly in skl_get_cdclk() ? I'm not really sure, maybe just leave the way
> > it
> > is for now.
> > 
> > > 
> > >  Though if we go there then
> > > .get_cdclk() might need to be renamed to .cdclk_get_config or something.
> > .cdclk_get_hw_state() ?
> .get_hw_state() is the thing which tells us if something is enabled,
> .get_config() is the thing that actually reads out the full state. Or at
> least that's how it used to be.

For encoders, get_hw_state() may also read what pipe it is in. For crtcs,
get_pipe_config() does both. PLLs get_hw_state() read the whole config too. I
guess there's room for making these more consistent. I'd go for is_enabled() for
something that is only supposed to say if something is enabled. :)

Ander





More information about the Intel-gfx mailing list