[PATCH v2 6/9] drm/i915: Disable/restore all sprite planes around modeset

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Reviewed-by: Rodrigo Vivi <rodrigo.vivi at gmail.com>

On Tue, Jun 4, 2013 at 7:49 AM,  <ville.syrjala at linux.intel.com> wrote:
> From: Ville Syrj?l? <ville.syrjala at linux.intel.com>
>
> Disable/restore sprite planes around mode-set just like we do for the
> primary and cursor planes. Now that we have working sprite clipping,
> this actually works quite decently.
>
> Previosuly we didn't even bother to disable sprites when changing mode,
> which could lead to a corrupted sprite appearing on the screen after a
> modeset (at least on my IVB). Not sure if all hardware generations would
> be so forgiving when enabled sprites end up outside the pipe dimensons.
>
> v2: Disable rather than enable sprites in ironlake_crtc_disable()
>
> Signed-off-by: Ville Syrj?l? <ville.syrjala at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/intel_display.c | 29 +++++++++++++++++++++++++++++
>  drivers/gpu/drm/i915/intel_drv.h     |  1 +
>  drivers/gpu/drm/i915/intel_sprite.c  |  8 ++++++++
>  3 files changed, 38 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 61bee12..e928a54 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -3161,6 +3161,28 @@ static void ironlake_pfit_enable(struct intel_crtc *crtc)
>         }
>  }
>
> +static void intel_enable_planes(struct drm_crtc *crtc)
> +{
> +       struct drm_device *dev = crtc->dev;
> +       enum pipe pipe = to_intel_crtc(crtc)->pipe;
> +       struct intel_plane *intel_plane;
> +
> +       list_for_each_entry(intel_plane, &dev->mode_config.plane_list, base.head)
> +               if (intel_plane->pipe == pipe)
> +                       intel_plane_restore(&intel_plane->base);
> +}
> +
> +static void intel_disable_planes(struct drm_crtc *crtc)
> +{
> +       struct drm_device *dev = crtc->dev;
> +       enum pipe pipe = to_intel_crtc(crtc)->pipe;
> +       struct intel_plane *intel_plane;
> +
> +       list_for_each_entry(intel_plane, &dev->mode_config.plane_list, base.head)
> +               if (intel_plane->pipe == pipe)
> +                       intel_plane_disable(&intel_plane->base);
> +}
> +
>  static void ironlake_crtc_enable(struct drm_crtc *crtc)
>  {
>         struct drm_device *dev = crtc->dev;
> @@ -3216,6 +3238,7 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
>         intel_enable_pipe(dev_priv, pipe,
>                           intel_crtc->config.has_pch_encoder);
>         intel_enable_plane(dev_priv, plane, pipe);
> +       intel_enable_planes(crtc);
>         intel_crtc_update_cursor(crtc, true);
>
>         if (intel_crtc->config.has_pch_encoder)
> @@ -3324,6 +3347,7 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
>         intel_enable_pipe(dev_priv, pipe,
>                           intel_crtc->config.has_pch_encoder);
>         intel_enable_plane(dev_priv, plane, pipe);
> +       intel_enable_planes(crtc);
>         intel_crtc_update_cursor(crtc, true);
>
>         hsw_enable_ips(intel_crtc);
> @@ -3388,6 +3412,7 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
>                 intel_disable_fbc(dev);
>
>         intel_crtc_update_cursor(crtc, false);
> +       intel_disable_planes(crtc);
>         intel_disable_plane(dev_priv, plane, pipe);
>
>         intel_set_pch_fifo_underrun_reporting(dev, pipe, false);
> @@ -3470,6 +3495,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
>         hsw_disable_ips(intel_crtc);
>
>         intel_crtc_update_cursor(crtc, false);
> +       intel_disable_planes(crtc);
>         intel_disable_plane(dev_priv, plane, pipe);
>
>         if (intel_crtc->config.has_pch_encoder)
> @@ -3617,6 +3643,7 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)
>
>         intel_enable_pipe(dev_priv, pipe, false);
>         intel_enable_plane(dev_priv, plane, pipe);
> +       intel_enable_planes(crtc);
>         intel_crtc_update_cursor(crtc, true);
>
>         intel_update_fbc(dev);
> @@ -3654,6 +3681,7 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)
>
>         intel_enable_pipe(dev_priv, pipe, false);
>         intel_enable_plane(dev_priv, plane, pipe);
> +       intel_enable_planes(crtc);
>         intel_crtc_update_cursor(crtc, true);
>         if (IS_G4X(dev))
>                 g4x_fixup_plane(dev_priv, pipe);
> @@ -3706,6 +3734,7 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
>
>         intel_crtc_dpms_overlay(intel_crtc, false);
>         intel_crtc_update_cursor(crtc, false);
> +       intel_disable_planes(crtc);
>         intel_disable_plane(dev_priv, plane, pipe);
>
>         intel_disable_pipe(dev_priv, pipe);
> diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
> index fdf6303..0355315 100644
> --- a/drivers/gpu/drm/i915/intel_drv.h
> +++ b/drivers/gpu/drm/i915/intel_drv.h
> @@ -633,6 +633,7 @@ extern void intel_connector_dpms(struct drm_connector *, int mode);
>  extern bool intel_connector_get_hw_state(struct intel_connector *connector);
>  extern void intel_modeset_check_state(struct drm_device *dev);
>  extern void intel_plane_restore(struct drm_plane *plane);
> +extern void intel_plane_disable(struct drm_plane *plane);
>
>
>  static inline struct intel_encoder *intel_attached_encoder(struct drm_connector *connector)
> diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c
> index 04d38d4..1fa5612 100644
> --- a/drivers/gpu/drm/i915/intel_sprite.c
> +++ b/drivers/gpu/drm/i915/intel_sprite.c
> @@ -957,6 +957,14 @@ void intel_plane_restore(struct drm_plane *plane)
>                            intel_plane->src_w, intel_plane->src_h);
>  }
>
> +void intel_plane_disable(struct drm_plane *plane)
> +{
> +       if (!plane->crtc || !plane->fb)
> +               return;
> +
> +       intel_disable_plane(plane);
> +}
> +
>  static const struct drm_plane_funcs intel_plane_funcs = {
>         .update_plane = intel_update_plane,
>         .disable_plane = intel_disable_plane,
> --
> 1.8.1.5
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Rodrigo Vivi
Blog: http://blog.vivi.eng.br


[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux