[Intel-gfx] [PATCH 8/8] drm/i915: Eliminate crtc->state usage from DVO pipe tracking

Chris Wilson chris at chris-wilson.co.uk
Wed Sep 13 14:51:32 UTC 2017


Quoting Ville Syrjala (2017-09-13 15:09:00)
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Change the DVO pipe tracking to maintain a bitmask in the top level
> state, just as we do for active_crtcs. This gets rid of the ugly
> intel_num_dvo_pipes() and its crtc->state and crtc->config usage.
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/i915_drv.h      |  2 ++
>  drivers/gpu/drm/i915/intel_display.c | 33 ++++++++++++++++-----------------
>  drivers/gpu/drm/i915/intel_drv.h     |  2 ++
>  3 files changed, 20 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index f8d7599cff43..a352644ea5a5 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -2384,6 +2384,8 @@ struct drm_i915_private {
>         struct mutex dpll_lock;
>  
>         u8 active_crtcs;
> +       u8 dvo_pipes; /* bitmask of pipes driving DVO encoders */
> +
>         /* minimum acceptable cdclk for each pipe */
>         int min_cdclk[I915_MAX_PIPES];
>  
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index c33fce9d9824..cb32f264a5d4 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -1555,19 +1555,6 @@ static void chv_enable_pll(struct intel_crtc *crtc,
>         }
>  }
>  
> -static int intel_num_dvo_pipes(struct drm_i915_private *dev_priv)
> -{
> -       struct intel_crtc *crtc;
> -       int count = 0;
> -
> -       for_each_intel_crtc(&dev_priv->drm, crtc) {
> -               count += crtc->base.state->active &&
> -                       intel_crtc_has_type(crtc->config, INTEL_OUTPUT_DVO);
> -       }
> -
> -       return count;
> -}
> -
>  static void i9xx_enable_pll(struct intel_crtc *crtc,
>                             const struct intel_crtc_state *crtc_state)
>  {
> @@ -1583,7 +1570,7 @@ static void i9xx_enable_pll(struct intel_crtc *crtc,
>                 assert_panel_unlocked(dev_priv, crtc->pipe);
>  
>         /* Enable DVO 2x clock on both PLLs if necessary */
> -       if (IS_I830(dev_priv) && intel_num_dvo_pipes(dev_priv) > 0) {
> +       if (IS_I830(dev_priv) && dev_priv->dvo_pipes != 0) {
>                 /*
>                  * It appears to be important that we don't enable this
>                  * for the current pipe before otherwise configuring the
> @@ -1634,9 +1621,7 @@ static void i9xx_disable_pll(struct intel_crtc *crtc)
>         enum pipe pipe = crtc->pipe;
>  
>         /* Disable DVO 2x clock on both PLLs if necessary */
> -       if (IS_I830(dev_priv) &&
> -           intel_crtc_has_type(crtc->config, INTEL_OUTPUT_DVO) &&
> -           !intel_num_dvo_pipes(dev_priv)) {
> +       if (IS_I830(dev_priv) && dev_priv->dvo_pipes == 0) {
>                 I915_WRITE(DPLL(PIPE_B),
>                            I915_READ(DPLL(PIPE_B)) & ~DPLL_DVO_2X_MODE);
>                 I915_WRITE(DPLL(PIPE_A),
> @@ -6033,6 +6018,7 @@ static void intel_crtc_disable_noatomic(struct drm_crtc *crtc,
>         intel_crtc->enabled_power_domains = 0;
>  
>         dev_priv->active_crtcs &= ~BIT(intel_crtc->pipe);
> +       dev_priv->dvo_pipes &= ~BIT(intel_crtc->pipe);
>         dev_priv->min_cdclk[intel_crtc->pipe] = 0;
>  }
>  
> @@ -11951,6 +11937,7 @@ static int intel_modeset_checks(struct drm_atomic_state *state)
>  
>         intel_state->modeset = true;
>         intel_state->active_crtcs = dev_priv->active_crtcs;
> +       intel_state->dvo_pipes = dev_priv->dvo_pipes;
>         intel_state->cdclk.logical = dev_priv->cdclk.logical;
>         intel_state->cdclk.actual = dev_priv->cdclk.actual;
>  
> @@ -11960,6 +11947,12 @@ static int intel_modeset_checks(struct drm_atomic_state *state)
>                 else
>                         intel_state->active_crtcs &= ~BIT(crtc->pipe);
>  
> +               if (new_crtc_state->base.active &&
> +                   intel_crtc_has_type(new_crtc_state, INTEL_OUTPUT_DVO))
> +                       intel_state->dvo_pipes |= BIT(crtc->pipe);
> +               else
> +                       intel_state->dvo_pipes &= ~BIT(crtc->pipe);
> +
>                 if (old_crtc_state->base.active != new_crtc_state->base.active)
>                         intel_state->active_pipe_changes |= BIT(crtc->pipe);
>         }
> @@ -12560,6 +12553,7 @@ static int intel_atomic_commit(struct drm_device *dev,
>                 memcpy(dev_priv->min_cdclk, intel_state->min_cdclk,
>                        sizeof(intel_state->min_cdclk));
>                 dev_priv->active_crtcs = intel_state->active_crtcs;
> +               dev_priv->dvo_pipes = intel_state->dvo_pipes;
>                 dev_priv->cdclk.logical = intel_state->cdclk.logical;
>                 dev_priv->cdclk.actual = intel_state->cdclk.actual;
>         }
> @@ -14935,6 +14929,7 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
>         int i;
>  
>         dev_priv->active_crtcs = 0;
> +       dev_priv->dvo_pipes = 0;
>  
>         for_each_intel_crtc(dev, crtc) {
>                 struct intel_crtc_state *crtc_state =
> @@ -14992,6 +14987,10 @@ static void intel_modeset_readout_hw_state(struct drm_device *dev)
>                         encoder->base.crtc = &crtc->base;
>                         crtc_state->output_types |= 1 << encoder->type;
>                         encoder->get_config(encoder, crtc_state);
> +
> +                       if (crtc_state->base.active &&
> +                           intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DVO))
> +                               dev_priv->dvo_pipes |= BIT(crtc->pipe);
>                 } else {
>                         encoder->base.crtc = NULL;
>                 }
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index 96f683256d7e..15ec6076e6a0 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -384,6 +384,8 @@ struct intel_atomic_state {
>         u8 active_pipe_changes;
>  
>         u8 active_crtcs;
> +       u8 dvo_pipes; /* bitmask of pipes driving DVO encoders */

Easy enough for even me to follow.
Reviewed-by: Chris Wilson <chris at chris-wilson.co.uk>
-Chris


More information about the Intel-gfx mailing list