[Intel-gfx] [PATCH v2 6/9] drm/i915: Disable/restore all sprite planes around modeset
Rodrigo Vivi
rodrigo.vivi at gmail.com
Wed Jun 5 21:32:24 CEST 2013
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
More information about the Intel-gfx
mailing list