[Intel-gfx] [PATCH 59/66] drm/i915: Basic shared dpll support for WRPLLs

Damien Lespiau damien.lespiau at intel.com
Tue May 20 13:06:13 CEST 2014


On Thu, Apr 24, 2014 at 11:55:35PM +0200, Daniel Vetter wrote:
> Just filing in names and ids, but not yet officially registering them
> so that the hw state cross checker doesn't completely freak out about
> them. Still since we do already read out and cross check
> config->shared_dpll the basics are now there to flesh out the wrpll
> shared dpll implementation.
> 
> The idea is now to roll out all the callbacks step-by-step and then at
> the end switch to the shared dpll framework. This way hw and sw
> changes are clearly separated.
> 
> Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>

With the consts added:

Reviewed-by: Damien Lespiau <damien.lespiau at intel.com>

-- 
Damien

> ---
>  drivers/gpu/drm/i915/i915_drv.h      |  6 ++++--
>  drivers/gpu/drm/i915/intel_ddi.c     | 17 +++++++++++++++++
>  drivers/gpu/drm/i915/intel_display.c | 21 +++++++++++++--------
>  3 files changed, 34 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index b6eac92e0a22..babeb7e92ee4 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -176,8 +176,10 @@ struct drm_i915_private;
>  enum intel_dpll_id {
>  	DPLL_ID_PRIVATE = -1, /* non-shared dpll in use */
>  	/* real shared dpll ids must be >= 0 */
> -	DPLL_ID_PCH_PLL_A,
> -	DPLL_ID_PCH_PLL_B,
> +	DPLL_ID_PCH_PLL_A = 0,
> +	DPLL_ID_PCH_PLL_B = 1,
> +	DPLL_ID_WRPLL1 = 0,
> +	DPLL_ID_WRPLL2 = 1,
>  };
>  #define I915_NUM_PLLS 2
>  
> diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
> index cc03f0af517b..8316e0e624a4 100644
> --- a/drivers/gpu/drm/i915/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/intel_ddi.c
> @@ -653,9 +653,11 @@ bool intel_ddi_pll_select(struct intel_crtc *intel_crtc)
>  		if (reg == WRPLL_CTL1) {
>  			plls->wrpll1_refcount++;
>  			intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_WRPLL1;
> +			intel_crtc->config.shared_dpll = DPLL_ID_WRPLL1;
>  		} else {
>  			plls->wrpll2_refcount++;
>  			intel_crtc->config.ddi_pll_sel = PORT_CLK_SEL_WRPLL2;
> +			intel_crtc->config.shared_dpll = DPLL_ID_WRPLL2;
>  		}
>  	}
>  
> @@ -1183,10 +1185,25 @@ int intel_ddi_get_cdclk_freq(struct drm_i915_private *dev_priv)
>  	}
>  }
>  
> +static char *hsw_ddi_pll_names[] = {
> +	"WRPLL 1",
> +	"WRPLL 2",
> +};
> +

static const char * const

>  void intel_ddi_pll_init(struct drm_device *dev)
>  {
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  	uint32_t val = I915_READ(LCPLL_CTL);
> +	int i;
> +
> +	/* Dummy setup until everything is moved over to avoid upsetting the hw
> +	 * state cross checker. */
> +	dev_priv->num_shared_dpll = 0;
> +
> +	for (i = 0; i < 2; i++) {
> +		dev_priv->shared_dplls[i].id = i;
> +		dev_priv->shared_dplls[i].name = hsw_ddi_pll_names[i];
> +	}
>  
>  	/* The LCPLL register should be turned on by the BIOS. For now let's
>  	 * just check its state and print errors in case something is wrong.
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 1601da1b57a1..fc7cd89b8921 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -7019,6 +7019,16 @@ static void haswell_get_ddi_port_state(struct intel_crtc *crtc,
>  	port = (tmp & TRANS_DDI_PORT_MASK) >> TRANS_DDI_PORT_SHIFT;
>  
>  	pipe_config->ddi_pll_sel = I915_READ(PORT_CLK_SEL(port));
> +
> +	switch (pipe_config->ddi_pll_sel) {
> +	case PORT_CLK_SEL_WRPLL1:
> +		pipe_config->shared_dpll = DPLL_ID_WRPLL1;
> +		break;
> +	case PORT_CLK_SEL_WRPLL2:
> +		pipe_config->shared_dpll = DPLL_ID_WRPLL2;
> +		break;
> +	}
> +
>  	/*
>  	 * Haswell has only FDI/PCH transcoder A. It is which is connected to
>  	 * DDI E. So just check whether this pipe is wired to DDI E and whether
> @@ -10340,12 +10350,6 @@ static const struct drm_crtc_funcs intel_crtc_funcs = {
>  	.page_flip = intel_crtc_page_flip,
>  };
>  
> -static void intel_cpu_pll_init(struct drm_device *dev)
> -{
> -	if (HAS_DDI(dev))
> -		intel_ddi_pll_init(dev);
> -}
> -
>  static bool ibx_pch_dpll_get_hw_state(struct drm_i915_private *dev_priv,
>  				      struct intel_shared_dpll *pll,
>  				      struct intel_dpll_hw_state *hw_state)
> @@ -10433,7 +10437,9 @@ static void intel_shared_dpll_init(struct drm_device *dev)
>  {
>  	struct drm_i915_private *dev_priv = dev->dev_private;
>  
> -	if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev))
> +	if (HAS_DDI(dev))
> +		intel_ddi_pll_init(dev);
> +	else if (HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev))
>  		ibx_pch_dpll_init(dev);
>  	else
>  		dev_priv->num_shared_dpll = 0;
> @@ -11232,7 +11238,6 @@ void intel_modeset_init(struct drm_device *dev)
>  	intel_init_dpio(dev);
>  	intel_reset_dpio(dev);
>  
> -	intel_cpu_pll_init(dev);
>  	intel_shared_dpll_init(dev);
>  
>  	/* Just disable it once at startup */
> -- 
> 1.8.1.4
> 
> _______________________________________________
> 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