drm/i915: Disable/restore all sprite planes around modeset
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@linux.intel.com> Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
b85dfcf924
commit
bb53d4aeac
|
@ -3164,6 +3164,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)
|
static void ironlake_crtc_enable(struct drm_crtc *crtc)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = crtc->dev;
|
struct drm_device *dev = crtc->dev;
|
||||||
|
@ -3219,6 +3241,7 @@ static void ironlake_crtc_enable(struct drm_crtc *crtc)
|
||||||
intel_enable_pipe(dev_priv, pipe,
|
intel_enable_pipe(dev_priv, pipe,
|
||||||
intel_crtc->config.has_pch_encoder);
|
intel_crtc->config.has_pch_encoder);
|
||||||
intel_enable_plane(dev_priv, plane, pipe);
|
intel_enable_plane(dev_priv, plane, pipe);
|
||||||
|
intel_enable_planes(crtc);
|
||||||
intel_crtc_update_cursor(crtc, true);
|
intel_crtc_update_cursor(crtc, true);
|
||||||
|
|
||||||
if (intel_crtc->config.has_pch_encoder)
|
if (intel_crtc->config.has_pch_encoder)
|
||||||
|
@ -3327,6 +3350,7 @@ static void haswell_crtc_enable(struct drm_crtc *crtc)
|
||||||
intel_enable_pipe(dev_priv, pipe,
|
intel_enable_pipe(dev_priv, pipe,
|
||||||
intel_crtc->config.has_pch_encoder);
|
intel_crtc->config.has_pch_encoder);
|
||||||
intel_enable_plane(dev_priv, plane, pipe);
|
intel_enable_plane(dev_priv, plane, pipe);
|
||||||
|
intel_enable_planes(crtc);
|
||||||
intel_crtc_update_cursor(crtc, true);
|
intel_crtc_update_cursor(crtc, true);
|
||||||
|
|
||||||
hsw_enable_ips(intel_crtc);
|
hsw_enable_ips(intel_crtc);
|
||||||
|
@ -3391,6 +3415,7 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
|
||||||
intel_disable_fbc(dev);
|
intel_disable_fbc(dev);
|
||||||
|
|
||||||
intel_crtc_update_cursor(crtc, false);
|
intel_crtc_update_cursor(crtc, false);
|
||||||
|
intel_disable_planes(crtc);
|
||||||
intel_disable_plane(dev_priv, plane, pipe);
|
intel_disable_plane(dev_priv, plane, pipe);
|
||||||
|
|
||||||
intel_set_pch_fifo_underrun_reporting(dev, pipe, false);
|
intel_set_pch_fifo_underrun_reporting(dev, pipe, false);
|
||||||
|
@ -3473,6 +3498,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
|
||||||
hsw_disable_ips(intel_crtc);
|
hsw_disable_ips(intel_crtc);
|
||||||
|
|
||||||
intel_crtc_update_cursor(crtc, false);
|
intel_crtc_update_cursor(crtc, false);
|
||||||
|
intel_disable_planes(crtc);
|
||||||
intel_disable_plane(dev_priv, plane, pipe);
|
intel_disable_plane(dev_priv, plane, pipe);
|
||||||
|
|
||||||
if (intel_crtc->config.has_pch_encoder)
|
if (intel_crtc->config.has_pch_encoder)
|
||||||
|
@ -3620,6 +3646,7 @@ static void valleyview_crtc_enable(struct drm_crtc *crtc)
|
||||||
|
|
||||||
intel_enable_pipe(dev_priv, pipe, false);
|
intel_enable_pipe(dev_priv, pipe, false);
|
||||||
intel_enable_plane(dev_priv, plane, pipe);
|
intel_enable_plane(dev_priv, plane, pipe);
|
||||||
|
intel_enable_planes(crtc);
|
||||||
intel_crtc_update_cursor(crtc, true);
|
intel_crtc_update_cursor(crtc, true);
|
||||||
|
|
||||||
intel_update_fbc(dev);
|
intel_update_fbc(dev);
|
||||||
|
@ -3657,6 +3684,7 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)
|
||||||
|
|
||||||
intel_enable_pipe(dev_priv, pipe, false);
|
intel_enable_pipe(dev_priv, pipe, false);
|
||||||
intel_enable_plane(dev_priv, plane, pipe);
|
intel_enable_plane(dev_priv, plane, pipe);
|
||||||
|
intel_enable_planes(crtc);
|
||||||
intel_crtc_update_cursor(crtc, true);
|
intel_crtc_update_cursor(crtc, true);
|
||||||
if (IS_G4X(dev))
|
if (IS_G4X(dev))
|
||||||
g4x_fixup_plane(dev_priv, pipe);
|
g4x_fixup_plane(dev_priv, pipe);
|
||||||
|
@ -3709,6 +3737,7 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
|
||||||
|
|
||||||
intel_crtc_dpms_overlay(intel_crtc, false);
|
intel_crtc_dpms_overlay(intel_crtc, false);
|
||||||
intel_crtc_update_cursor(crtc, false);
|
intel_crtc_update_cursor(crtc, false);
|
||||||
|
intel_disable_planes(crtc);
|
||||||
intel_disable_plane(dev_priv, plane, pipe);
|
intel_disable_plane(dev_priv, plane, pipe);
|
||||||
|
|
||||||
intel_disable_pipe(dev_priv, pipe);
|
intel_disable_pipe(dev_priv, pipe);
|
||||||
|
|
|
@ -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 bool intel_connector_get_hw_state(struct intel_connector *connector);
|
||||||
extern void intel_modeset_check_state(struct drm_device *dev);
|
extern void intel_modeset_check_state(struct drm_device *dev);
|
||||||
extern void intel_plane_restore(struct drm_plane *plane);
|
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)
|
static inline struct intel_encoder *intel_attached_encoder(struct drm_connector *connector)
|
||||||
|
|
|
@ -957,6 +957,14 @@ void intel_plane_restore(struct drm_plane *plane)
|
||||||
intel_plane->src_w, intel_plane->src_h);
|
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 = {
|
static const struct drm_plane_funcs intel_plane_funcs = {
|
||||||
.update_plane = intel_update_plane,
|
.update_plane = intel_update_plane,
|
||||||
.disable_plane = intel_disable_plane,
|
.disable_plane = intel_disable_plane,
|
||||||
|
|
Loading…
Reference in a new issue