[Intel-gfx] [PATCH 5/9] drm/i915: Extract ilk_pch_get_config()

David Airlie airlied at redhat.com
Mon Oct 18 00:22:53 UTC 2021


On Fri, Oct 15, 2021 at 5:16 PM Ville Syrjala
<ville.syrjala at linux.intel.com> wrote:
>
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> Pull the ilk+ PCH state readout into its own function and relocate
> to the appropriate file.
>
> The clock readout parts are perhaps a bit iffy since we depend
> on the gmch DPLL readout code. But we can think about the clock
> readout big picture later.

Looks good,

Reviewed-by: Dave Airlie <airlied at redhat.com>

>
> Cc: Dave Airlie <airlied at redhat.com>
> Cc: Jani Nikula <jani.nikula at intel.com>
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_display.c  | 72 ++-----------------
>  drivers/gpu/drm/i915/display/intel_display.h  |  3 +-
>  .../gpu/drm/i915/display/intel_pch_display.c  | 68 ++++++++++++++++++
>  .../gpu/drm/i915/display/intel_pch_display.h  |  1 +
>  4 files changed, 75 insertions(+), 69 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display.c b/drivers/gpu/drm/i915/display/intel_display.c
> index 8f65b8b6a306..e8f15fb3ed07 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_display.c
> @@ -113,11 +113,6 @@
>  #include "skl_universal_plane.h"
>  #include "vlv_sideband.h"
>
> -static void i9xx_crtc_clock_get(struct intel_crtc *crtc,
> -                               struct intel_crtc_state *pipe_config);
> -static void ilk_pch_clock_get(struct intel_crtc *crtc,
> -                             struct intel_crtc_state *pipe_config);
> -
>  static void intel_set_transcoder_timings(const struct intel_crtc_state *crtc_state);
>  static void intel_set_pipe_src_size(const struct intel_crtc_state *crtc_state);
>  static void intel_cpu_transcoder_set_m_n(const struct intel_crtc_state *crtc_state,
> @@ -4228,50 +4223,9 @@ static bool ilk_get_pipe_config(struct intel_crtc *crtc,
>         i9xx_get_pipe_color_config(pipe_config);
>         intel_color_get_config(pipe_config);
>
> -       if (intel_de_read(dev_priv, PCH_TRANSCONF(crtc->pipe)) & TRANS_ENABLE) {
> -               struct intel_shared_dpll *pll;
> -               enum intel_dpll_id pll_id;
> -               bool pll_active;
> +       pipe_config->pixel_multiplier = 1;
>
> -               pipe_config->has_pch_encoder = true;
> -
> -               tmp = intel_de_read(dev_priv, FDI_RX_CTL(crtc->pipe));
> -               pipe_config->fdi_lanes = ((FDI_DP_PORT_WIDTH_MASK & tmp) >>
> -                                         FDI_DP_PORT_WIDTH_SHIFT) + 1;
> -
> -               ilk_get_fdi_m_n_config(crtc, pipe_config);
> -
> -               if (HAS_PCH_IBX(dev_priv)) {
> -                       /*
> -                        * The pipe->pch transcoder and pch transcoder->pll
> -                        * mapping is fixed.
> -                        */
> -                       pll_id = (enum intel_dpll_id) crtc->pipe;
> -               } else {
> -                       tmp = intel_de_read(dev_priv, PCH_DPLL_SEL);
> -                       if (tmp & TRANS_DPLLB_SEL(crtc->pipe))
> -                               pll_id = DPLL_ID_PCH_PLL_B;
> -                       else
> -                               pll_id= DPLL_ID_PCH_PLL_A;
> -               }
> -
> -               pipe_config->shared_dpll =
> -                       intel_get_shared_dpll_by_id(dev_priv, pll_id);
> -               pll = pipe_config->shared_dpll;
> -
> -               pll_active = intel_dpll_get_hw_state(dev_priv, pll,
> -                                                    &pipe_config->dpll_hw_state);
> -               drm_WARN_ON(dev, !pll_active);
> -
> -               tmp = pipe_config->dpll_hw_state.dpll;
> -               pipe_config->pixel_multiplier =
> -                       ((tmp & PLL_REF_SDVO_HDMI_MULTIPLIER_MASK)
> -                        >> PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT) + 1;
> -
> -               ilk_pch_clock_get(crtc, pipe_config);
> -       } else {
> -               pipe_config->pixel_multiplier = 1;
> -       }
> +       ilk_pch_get_config(pipe_config);
>
>         intel_get_transcoder_timings(crtc, pipe_config);
>         intel_get_pipe_src_size(crtc, pipe_config);
> @@ -4854,8 +4808,8 @@ static int i9xx_pll_refclk(struct drm_device *dev,
>  }
>
>  /* Returns the clock of the currently programmed mode of the given pipe. */
> -static void i9xx_crtc_clock_get(struct intel_crtc *crtc,
> -                               struct intel_crtc_state *pipe_config)
> +void i9xx_crtc_clock_get(struct intel_crtc *crtc,
> +                        struct intel_crtc_state *pipe_config)
>  {
>         struct drm_device *dev = crtc->base.dev;
>         struct drm_i915_private *dev_priv = to_i915(dev);
> @@ -4965,24 +4919,6 @@ int intel_dotclock_calculate(int link_freq,
>         return div_u64(mul_u32_u32(m_n->link_m, link_freq), m_n->link_n);
>  }
>
> -static void ilk_pch_clock_get(struct intel_crtc *crtc,
> -                             struct intel_crtc_state *pipe_config)
> -{
> -       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> -
> -       /* read out port_clock from the DPLL */
> -       i9xx_crtc_clock_get(crtc, pipe_config);
> -
> -       /*
> -        * In case there is an active pipe without active ports,
> -        * we may need some idea for the dotclock anyway.
> -        * Calculate one based on the FDI configuration.
> -        */
> -       pipe_config->hw.adjusted_mode.crtc_clock =
> -               intel_dotclock_calculate(intel_fdi_link_freq(dev_priv, pipe_config),
> -                                        &pipe_config->fdi_m_n);
> -}
> -
>  /* Returns the currently programmed mode of the given encoder. */
>  struct drm_display_mode *
>  intel_encoder_current_mode(struct intel_encoder *encoder)
> diff --git a/drivers/gpu/drm/i915/display/intel_display.h b/drivers/gpu/drm/i915/display/intel_display.h
> index 5bc8d8913178..c2efba7c6c17 100644
> --- a/drivers/gpu/drm/i915/display/intel_display.h
> +++ b/drivers/gpu/drm/i915/display/intel_display.h
> @@ -586,8 +586,9 @@ void intel_dp_set_m_n(const struct intel_crtc_state *crtc_state,
>                       enum link_m_n_set m_n);
>  void ilk_get_fdi_m_n_config(struct intel_crtc *crtc,
>                             struct intel_crtc_state *pipe_config);
> +void i9xx_crtc_clock_get(struct intel_crtc *crtc,
> +                        struct intel_crtc_state *pipe_config);
>  int intel_dotclock_calculate(int link_freq, const struct intel_link_m_n *m_n);
> -
>  bool hsw_crtc_state_ips_capable(const struct intel_crtc_state *crtc_state);
>  void hsw_enable_ips(const struct intel_crtc_state *crtc_state);
>  void hsw_disable_ips(const struct intel_crtc_state *crtc_state);
> diff --git a/drivers/gpu/drm/i915/display/intel_pch_display.c b/drivers/gpu/drm/i915/display/intel_pch_display.c
> index df7195ed1aaa..f3edabdd0a4c 100644
> --- a/drivers/gpu/drm/i915/display/intel_pch_display.c
> +++ b/drivers/gpu/drm/i915/display/intel_pch_display.c
> @@ -299,6 +299,74 @@ void ilk_pch_enable(struct intel_atomic_state *state,
>         ilk_enable_pch_transcoder(crtc_state);
>  }
>
> +static void ilk_pch_clock_get(struct intel_crtc_state *crtc_state)
> +{
> +       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> +       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> +
> +       /* read out port_clock from the DPLL */
> +       i9xx_crtc_clock_get(crtc, crtc_state);
> +
> +       /*
> +        * In case there is an active pipe without active ports,
> +        * we may need some idea for the dotclock anyway.
> +        * Calculate one based on the FDI configuration.
> +        */
> +       crtc_state->hw.adjusted_mode.crtc_clock =
> +               intel_dotclock_calculate(intel_fdi_link_freq(dev_priv, crtc_state),
> +                                        &crtc_state->fdi_m_n);
> +}
> +
> +void ilk_pch_get_config(struct intel_crtc_state *crtc_state)
> +{
> +       struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
> +       struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
> +       struct intel_shared_dpll *pll;
> +       enum pipe pipe = crtc->pipe;
> +       enum intel_dpll_id pll_id;
> +       bool pll_active;
> +       u32 tmp;
> +
> +       if ((intel_de_read(dev_priv, PCH_TRANSCONF(pipe)) & TRANS_ENABLE) == 0)
> +               return;
> +
> +       crtc_state->has_pch_encoder = true;
> +
> +       tmp = intel_de_read(dev_priv, FDI_RX_CTL(pipe));
> +       crtc_state->fdi_lanes = ((FDI_DP_PORT_WIDTH_MASK & tmp) >>
> +                                FDI_DP_PORT_WIDTH_SHIFT) + 1;
> +
> +       ilk_get_fdi_m_n_config(crtc, crtc_state);
> +
> +       if (HAS_PCH_IBX(dev_priv)) {
> +               /*
> +                * The pipe->pch transcoder and pch transcoder->pll
> +                * mapping is fixed.
> +                */
> +               pll_id = (enum intel_dpll_id) pipe;
> +       } else {
> +               tmp = intel_de_read(dev_priv, PCH_DPLL_SEL);
> +               if (tmp & TRANS_DPLLB_SEL(pipe))
> +                       pll_id = DPLL_ID_PCH_PLL_B;
> +               else
> +                       pll_id = DPLL_ID_PCH_PLL_A;
> +       }
> +
> +       crtc_state->shared_dpll = intel_get_shared_dpll_by_id(dev_priv, pll_id);
> +       pll = crtc_state->shared_dpll;
> +
> +       pll_active = intel_dpll_get_hw_state(dev_priv, pll,
> +                                            &crtc_state->dpll_hw_state);
> +       drm_WARN_ON(&dev_priv->drm, !pll_active);
> +
> +       tmp = crtc_state->dpll_hw_state.dpll;
> +       crtc_state->pixel_multiplier =
> +               ((tmp & PLL_REF_SDVO_HDMI_MULTIPLIER_MASK)
> +                >> PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT) + 1;
> +
> +       ilk_pch_clock_get(crtc_state);
> +}
> +
>  static void lpt_enable_pch_transcoder(struct drm_i915_private *dev_priv,
>                                       enum transcoder cpu_transcoder)
>  {
> diff --git a/drivers/gpu/drm/i915/display/intel_pch_display.h b/drivers/gpu/drm/i915/display/intel_pch_display.h
> index e0ff331c0bc6..6e834fbebd64 100644
> --- a/drivers/gpu/drm/i915/display/intel_pch_display.h
> +++ b/drivers/gpu/drm/i915/display/intel_pch_display.h
> @@ -14,6 +14,7 @@ struct intel_crtc_state;
>  void ilk_disable_pch_transcoder(struct intel_crtc *crtc);
>  void ilk_pch_enable(struct intel_atomic_state *state,
>                     struct intel_crtc *crtc);
> +void ilk_pch_get_config(struct intel_crtc_state *crtc_state);
>
>  void lpt_disable_pch_transcoder(struct drm_i915_private *dev_priv);
>  void lpt_pch_enable(struct intel_atomic_state *state,
> --
> 2.32.0
>



More information about the Intel-gfx mailing list