[Intel-gfx] [PATCH] drm/i915: move cpu_transcoder to the pipe configuration

Daniel Vetter daniel at ffwll.ch
Wed Apr 17 20:15:36 CEST 2013


On Wed, Apr 17, 2013 at 03:09:50PM -0300, Paulo Zanoni wrote:
> 2013/4/17 Daniel Vetter <daniel.vetter at ffwll.ch>:
> > For a bunch of reason we need to more accurately track this:
> > - hw pipe state readout for Haswell needs the cpu transcoder.
> > - We need to know the right cpu transcoder in a bunch of places in
> >   ->disable and other modeset callbacks.
> >
> > In the future we need to add hw state readout&check support, too. But
> > to avoid ugly merge conflicts do the rote sed job now without any
> > functional changes.
> >
> > v2: Preserve the cpu_transcoder value when overwriting crtc->config.
> > Reported by Paulo.
> 
> No more WARNs here. Just booted, checked dmesg and checked if there
> are pixels on the screen.
> 
> Reviewed-by: Paulo Zanoni <paulo.r.zanoni at intel.com>

Let's try this again ... thanks for the review.
-Daniel

> 
> >
> > Cc: Paulo Zanoni <przanoni at gmail.com>
> > Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> > ---
> >  drivers/gpu/drm/i915/intel_ddi.c     |    8 ++++----
> >  drivers/gpu/drm/i915/intel_display.c |   37 +++++++++++++++++++---------------
> >  drivers/gpu/drm/i915/intel_drv.h     |    6 +++++-
> >  drivers/gpu/drm/i915/intel_hdmi.c    |    6 +++---
> >  4 files changed, 33 insertions(+), 24 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
> > index 22524cb..26a0a57 100644
> > --- a/drivers/gpu/drm/i915/intel_ddi.c
> > +++ b/drivers/gpu/drm/i915/intel_ddi.c
> > @@ -924,7 +924,7 @@ void intel_ddi_set_pipe_settings(struct drm_crtc *crtc)
> >         struct drm_i915_private *dev_priv = crtc->dev->dev_private;
> >         struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> >         struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
> > -       enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder;
> > +       enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> >         int type = intel_encoder->type;
> >         uint32_t temp;
> >
> > @@ -958,7 +958,7 @@ void intel_ddi_enable_transcoder_func(struct drm_crtc *crtc)
> >         struct drm_encoder *encoder = &intel_encoder->base;
> >         struct drm_i915_private *dev_priv = crtc->dev->dev_private;
> >         enum pipe pipe = intel_crtc->pipe;
> > -       enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder;
> > +       enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> >         enum port port = intel_ddi_get_encoder_port(intel_encoder);
> >         int type = intel_encoder->type;
> >         uint32_t temp;
> > @@ -1223,7 +1223,7 @@ void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
> >         struct drm_i915_private *dev_priv = crtc->dev->dev_private;
> >         struct intel_encoder *intel_encoder = intel_ddi_get_crtc_encoder(crtc);
> >         enum port port = intel_ddi_get_encoder_port(intel_encoder);
> > -       enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder;
> > +       enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> >
> >         if (cpu_transcoder != TRANSCODER_EDP)
> >                 I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
> > @@ -1233,7 +1233,7 @@ void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc)
> >  void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc)
> >  {
> >         struct drm_i915_private *dev_priv = intel_crtc->base.dev->dev_private;
> > -       enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder;
> > +       enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> >
> >         if (cpu_transcoder != TRANSCODER_EDP)
> >                 I915_WRITE(TRANS_CLK_SEL(cpu_transcoder),
> > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> > index dce643c..948a2c3 100644
> > --- a/drivers/gpu/drm/i915/intel_display.c
> > +++ b/drivers/gpu/drm/i915/intel_display.c
> > @@ -892,7 +892,7 @@ enum transcoder intel_pipe_to_cpu_transcoder(struct drm_i915_private *dev_priv,
> >         struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pipe];
> >         struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> >
> > -       return intel_crtc->cpu_transcoder;
> > +       return intel_crtc->config.cpu_transcoder;
> >  }
> >
> >  static void ironlake_wait_for_vblank(struct drm_device *dev, int pipe)
> > @@ -3208,7 +3208,7 @@ static void lpt_pch_enable(struct drm_crtc *crtc)
> >         struct drm_device *dev = crtc->dev;
> >         struct drm_i915_private *dev_priv = dev->dev_private;
> >         struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> > -       enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder;
> > +       enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> >
> >         assert_transcoder_disabled(dev_priv, TRANSCODER_A);
> >
> > @@ -3583,7 +3583,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
> >         struct intel_encoder *encoder;
> >         int pipe = intel_crtc->pipe;
> >         int plane = intel_crtc->plane;
> > -       enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder;
> > +       enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> >
> >         if (!intel_crtc->active)
> >                 return;
> > @@ -3643,7 +3643,7 @@ static void haswell_crtc_off(struct drm_crtc *crtc)
> >
> >         /* Stop saying we're using TRANSCODER_EDP because some other CRTC might
> >          * start using it. */
> > -       intel_crtc->cpu_transcoder = (enum transcoder) intel_crtc->pipe;
> > +       intel_crtc->config.cpu_transcoder = (enum transcoder) intel_crtc->pipe;
> >
> >         intel_ddi_put_crtc_pll(crtc);
> >  }
> > @@ -4499,7 +4499,7 @@ static void intel_set_pipe_timings(struct intel_crtc *intel_crtc,
> >         struct drm_device *dev = intel_crtc->base.dev;
> >         struct drm_i915_private *dev_priv = dev->dev_private;
> >         enum pipe pipe = intel_crtc->pipe;
> > -       enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder;
> > +       enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> >         uint32_t vsyncshift;
> >
> >         if (!IS_GEN2(dev) && adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) {
> > @@ -5237,7 +5237,7 @@ static void haswell_set_pipeconf(struct drm_crtc *crtc,
> >  {
> >         struct drm_i915_private *dev_priv = crtc->dev->dev_private;
> >         struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> > -       enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder;
> > +       enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> >         uint32_t val;
> >
> >         val = I915_READ(PIPECONF(cpu_transcoder));
> > @@ -5431,7 +5431,7 @@ void intel_cpu_transcoder_set_m_n(struct intel_crtc *crtc,
> >         struct drm_device *dev = crtc->base.dev;
> >         struct drm_i915_private *dev_priv = dev->dev_private;
> >         int pipe = crtc->pipe;
> > -       enum transcoder transcoder = crtc->cpu_transcoder;
> > +       enum transcoder transcoder = crtc->config.cpu_transcoder;
> >
> >         if (INTEL_INFO(dev)->gen >= 5) {
> >                 I915_WRITE(PIPE_DATA_M1(transcoder), TU_SIZE(m_n->tu) | m_n->gmch_m);
> > @@ -5614,7 +5614,7 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
> >         WARN(!(HAS_PCH_IBX(dev) || HAS_PCH_CPT(dev)),
> >              "Unexpected PCH type %d\n", INTEL_PCH_TYPE(dev));
> >
> > -       intel_crtc->cpu_transcoder = pipe;
> > +       intel_crtc->config.cpu_transcoder = pipe;
> >
> >         ok = ironlake_compute_clocks(crtc, adjusted_mode, &clock,
> >                                      &has_reduced_clock, &reduced_clock);
> > @@ -5796,9 +5796,9 @@ static int haswell_crtc_mode_set(struct drm_crtc *crtc,
> >         }
> >
> >         if (is_cpu_edp)
> > -               intel_crtc->cpu_transcoder = TRANSCODER_EDP;
> > +               intel_crtc->config.cpu_transcoder = TRANSCODER_EDP;
> >         else
> > -               intel_crtc->cpu_transcoder = pipe;
> > +               intel_crtc->config.cpu_transcoder = pipe;
> >
> >         /* We are not sure yet this won't happen. */
> >         WARN(!HAS_PCH_LPT(dev), "Unexpected PCH type %d\n",
> > @@ -5807,7 +5807,7 @@ static int haswell_crtc_mode_set(struct drm_crtc *crtc,
> >         WARN(num_connectors != 1, "%d connectors attached to pipe %c\n",
> >              num_connectors, pipe_name(pipe));
> >
> > -       WARN_ON(I915_READ(PIPECONF(intel_crtc->cpu_transcoder)) &
> > +       WARN_ON(I915_READ(PIPECONF(intel_crtc->config.cpu_transcoder)) &
> >                 (PIPECONF_ENABLE | I965_PIPECONF_ACTIVE));
> >
> >         WARN_ON(I915_READ(DSPCNTR(plane)) & DISPLAY_PLANE_ENABLE);
> > @@ -5858,7 +5858,7 @@ static bool haswell_get_pipe_config(struct intel_crtc *crtc,
> >         struct drm_i915_private *dev_priv = dev->dev_private;
> >         uint32_t tmp;
> >
> > -       tmp = I915_READ(PIPECONF(crtc->cpu_transcoder));
> > +       tmp = I915_READ(PIPECONF(crtc->config.cpu_transcoder));
> >         if (!(tmp & PIPECONF_ENABLE))
> >                 return false;
> >
> > @@ -6826,7 +6826,7 @@ struct drm_display_mode *intel_crtc_mode_get(struct drm_device *dev,
> >  {
> >         struct drm_i915_private *dev_priv = dev->dev_private;
> >         struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
> > -       enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder;
> > +       enum transcoder cpu_transcoder = intel_crtc->config.cpu_transcoder;
> >         struct drm_display_mode *mode;
> >         int htot = I915_READ(HTOTAL(cpu_transcoder));
> >         int hsync = I915_READ(HSYNC(cpu_transcoder));
> > @@ -7989,10 +7989,12 @@ static int __intel_set_mode(struct drm_crtc *crtc,
> >          * to set it here already despite that we pass it down the callchain.
> >          */
> >         if (modeset_pipes) {
> > +               enum transcoder tmp = to_intel_crtc(crtc)->config.cpu_transcoder;
> >                 crtc->mode = *mode;
> >                 /* mode_set/enable/disable functions rely on a correct pipe
> >                  * config. */
> >                 to_intel_crtc(crtc)->config = *pipe_config;
> > +               to_intel_crtc(crtc)->config.cpu_transcoder = tmp;
> >         }
> >
> >         /* Only after disabling all output pipelines that will be changed can we
> > @@ -8403,7 +8405,7 @@ static void intel_crtc_init(struct drm_device *dev, int pipe)
> >         /* Swap pipes & planes for FBC on pre-965 */
> >         intel_crtc->pipe = pipe;
> >         intel_crtc->plane = pipe;
> > -       intel_crtc->cpu_transcoder = pipe;
> > +       intel_crtc->config.cpu_transcoder = pipe;
> >         if (IS_MOBILE(dev) && IS_GEN3(dev)) {
> >                 DRM_DEBUG_KMS("swapping pipes & planes for FBC\n");
> >                 intel_crtc->plane = !pipe;
> > @@ -9128,7 +9130,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
> >         u32 reg;
> >
> >         /* Clear any frame start delays used for debugging left by the BIOS */
> > -       reg = PIPECONF(crtc->cpu_transcoder);
> > +       reg = PIPECONF(crtc->config.cpu_transcoder);
> >         I915_WRITE(reg, I915_READ(reg) & ~PIPECONF_FRAME_START_DELAY_MASK);
> >
> >         /* We need to sanitize the plane -> pipe mapping first because this will
> > @@ -9294,7 +9296,7 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
> >                         }
> >
> >                         crtc = to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
> > -                       crtc->cpu_transcoder = TRANSCODER_EDP;
> > +                       crtc->config.cpu_transcoder = TRANSCODER_EDP;
> >
> >                         DRM_DEBUG_KMS("Pipe %c using transcoder EDP\n",
> >                                       pipe_name(pipe));
> > @@ -9304,7 +9306,10 @@ void intel_modeset_setup_hw_state(struct drm_device *dev,
> >  setup_pipes:
> >         list_for_each_entry(crtc, &dev->mode_config.crtc_list,
> >                             base.head) {
> > +               enum transcoder tmp = crtc->config.cpu_transcoder;
> >                 memset(&crtc->config, 0, sizeof(crtc->config));
> > +               crtc->config.cpu_transcoder = tmp;
> > +
> >                 crtc->active = dev_priv->display.get_pipe_config(crtc,
> >                                                                  &crtc->config);
> >
> > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> > index 7b97b9a..1362ca6 100644
> > --- a/drivers/gpu/drm/i915/intel_drv.h
> > +++ b/drivers/gpu/drm/i915/intel_drv.h
> > @@ -188,6 +188,10 @@ struct intel_crtc_config {
> >          * between pch encoders and cpu encoders. */
> >         bool has_pch_encoder;
> >
> > +       /* CPU Transcoder for the pipe. Currently this can only differ from the
> > +        * pipe on Haswell (where we have a special eDP transcoder). */
> > +       enum transcoder cpu_transcoder;
> > +
> >         /*
> >          * Use reduced/limited/broadcast rbg range, compressing from the full
> >          * range fed into the crtcs.
> > @@ -220,13 +224,13 @@ struct intel_crtc_config {
> >         int pixel_target_clock;
> >         /* Used by SDVO (and if we ever fix it, HDMI). */
> >         unsigned pixel_multiplier;
> > +
> >  };
> >
> >  struct intel_crtc {
> >         struct drm_crtc base;
> >         enum pipe pipe;
> >         enum plane plane;
> > -       enum transcoder cpu_transcoder;
> >         u8 lut_r[256], lut_g[256], lut_b[256];
> >         /*
> >          * Whether the crtc and the connected output pipeline is active. Implies
> > diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c
> > index 8912201..3e6a3ef 100644
> > --- a/drivers/gpu/drm/i915/intel_hdmi.c
> > +++ b/drivers/gpu/drm/i915/intel_hdmi.c
> > @@ -294,8 +294,8 @@ static void hsw_write_infoframe(struct drm_encoder *encoder,
> >         struct drm_device *dev = encoder->dev;
> >         struct drm_i915_private *dev_priv = dev->dev_private;
> >         struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
> > -       u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->cpu_transcoder);
> > -       u32 data_reg = hsw_infoframe_data_reg(frame, intel_crtc->cpu_transcoder);
> > +       u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
> > +       u32 data_reg = hsw_infoframe_data_reg(frame, intel_crtc->config.cpu_transcoder);
> >         unsigned int i, len = DIP_HEADER_SIZE + frame->len;
> >         u32 val = I915_READ(ctl_reg);
> >
> > @@ -570,7 +570,7 @@ static void hsw_set_infoframes(struct drm_encoder *encoder,
> >         struct drm_i915_private *dev_priv = encoder->dev->dev_private;
> >         struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
> >         struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
> > -       u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->cpu_transcoder);
> > +       u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
> >         u32 val = I915_READ(reg);
> >
> >         assert_hdmi_port_disabled(intel_hdmi);
> > --
> > 1.7.10.4
> >
> 
> 
> 
> --
> Paulo Zanoni

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch



More information about the Intel-gfx mailing list