On Fri, Oct 20, 2017 at 05:03:58PM +0000, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrj...@linux.intel.com>
> 
> Track the system agent voltage we request from pcode in the cdclk state
> on BDW. Annoyingly we can't actually read out the current value since
> there's no pcode command to do that, so we'll have to just assume that
> it worked.
> 
> v2: Keep the WARN_ON (Rodrigo)

thanks

Reviewed-by: Rodrigo Vivi <rodrigo.v...@intel.com>


> 
> Cc: Mika Kahola <mika.kah...@intel.com>
> Cc: Manasi Navare <manasi.d.nav...@intel.com>
> Cc: Rodrigo Vivi <rodrigo.v...@intel.com>
> Signed-off-by: Ville Syrjälä <ville.syrj...@linux.intel.com>
> ---
>  drivers/gpu/drm/i915/intel_cdclk.c | 32 ++++++++++++++++++++++++++------
>  1 file changed, 26 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_cdclk.c 
> b/drivers/gpu/drm/i915/intel_cdclk.c
> index e2f18545d20c..ab0481183bae 100644
> --- a/drivers/gpu/drm/i915/intel_cdclk.c
> +++ b/drivers/gpu/drm/i915/intel_cdclk.c
> @@ -639,6 +639,21 @@ static int bdw_calc_cdclk(int min_cdclk)
>               return 337500;
>  }
>  
> +static u8 bdw_calc_voltage(int cdclk)
> +{
> +     switch (cdclk) {
> +     default:
> +     case 337500:
> +             return 2;
> +     case 450000:
> +             return 0;
> +     case 540000:
> +             return 1;
> +     case 675000:
> +             return 3;
> +     }
> +}
> +
>  static void bdw_get_cdclk(struct drm_i915_private *dev_priv,
>                         struct intel_cdclk_state *cdclk_state)
>  {
> @@ -657,13 +672,19 @@ static void bdw_get_cdclk(struct drm_i915_private 
> *dev_priv,
>               cdclk_state->cdclk = 337500;
>       else
>               cdclk_state->cdclk = 675000;
> +
> +     /*
> +      * Can't read this out :( Let's assume it's
> +      * at least what the CDCLK frequency requires.
> +      */
> +     cdclk_state->voltage = bdw_calc_voltage(cdclk_state->cdclk);
>  }
>  
>  static void bdw_set_cdclk(struct drm_i915_private *dev_priv,
>                         const struct intel_cdclk_state *cdclk_state)
>  {
>       int cdclk = cdclk_state->cdclk;
> -     uint32_t val, data;
> +     uint32_t val;
>       int ret;
>  
>       if (WARN((I915_READ(LCPLL_CTL) &
> @@ -704,19 +725,15 @@ static void bdw_set_cdclk(struct drm_i915_private 
> *dev_priv,
>               /* fall through */
>       case 337500:
>               val |= LCPLL_CLK_FREQ_337_5_BDW;
> -             data = 2;
>               break;
>       case 450000:
>               val |= LCPLL_CLK_FREQ_450;
> -             data = 0;
>               break;
>       case 540000:
>               val |= LCPLL_CLK_FREQ_54O_BDW;
> -             data = 1;
>               break;
>       case 675000:
>               val |= LCPLL_CLK_FREQ_675_BDW;
> -             data = 3;
>               break;
>       }
>  
> @@ -731,7 +748,8 @@ static void bdw_set_cdclk(struct drm_i915_private 
> *dev_priv,
>               DRM_ERROR("Switching back to LCPLL failed\n");
>  
>       mutex_lock(&dev_priv->pcu_lock);
> -     sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ, data);
> +     sandybridge_pcode_write(dev_priv, HSW_PCODE_DE_WRITE_FREQ_REQ,
> +                             cdclk_state->voltage);
>       mutex_unlock(&dev_priv->pcu_lock);
>  
>       I915_WRITE(CDCLK_FREQ, DIV_ROUND_CLOSEST(cdclk, 1000) - 1);
> @@ -1910,11 +1928,13 @@ static int bdw_modeset_calc_cdclk(struct 
> drm_atomic_state *state)
>       cdclk = bdw_calc_cdclk(min_cdclk);
>  
>       intel_state->cdclk.logical.cdclk = cdclk;
> +     intel_state->cdclk.logical.voltage = bdw_calc_voltage(cdclk);
>  
>       if (!intel_state->active_crtcs) {
>               cdclk = bdw_calc_cdclk(0);
>  
>               intel_state->cdclk.actual.cdclk = cdclk;
> +             intel_state->cdclk.actual.voltage = bdw_calc_voltage(cdclk);
>       } else {
>               intel_state->cdclk.actual =
>                       intel_state->cdclk.logical;
> -- 
> 2.13.6
> 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to