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