Commit 20bc8673 authored by Ville Syrjälä's avatar Ville Syrjälä Committed by Daniel Vetter

drm/i915: Enable/disable IPS when primary is enabled/disabled

IPS should be OK as long as one plane is enabled on the pipe, but
it does seem to cause problems when going between primary only and
sprite only.

This needs more investigations, but for now just disable IPS whenever
the primary plane is disabled.
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Acked-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent abae50ed
...@@ -3329,7 +3329,7 @@ static void intel_disable_planes(struct drm_crtc *crtc) ...@@ -3329,7 +3329,7 @@ static void intel_disable_planes(struct drm_crtc *crtc)
intel_plane_disable(&intel_plane->base); intel_plane_disable(&intel_plane->base);
} }
static void hsw_enable_ips(struct intel_crtc *crtc) void hsw_enable_ips(struct intel_crtc *crtc)
{ {
struct drm_i915_private *dev_priv = crtc->base.dev->dev_private; struct drm_i915_private *dev_priv = crtc->base.dev->dev_private;
...@@ -3344,7 +3344,7 @@ static void hsw_enable_ips(struct intel_crtc *crtc) ...@@ -3344,7 +3344,7 @@ static void hsw_enable_ips(struct intel_crtc *crtc)
I915_WRITE(IPS_CTL, IPS_ENABLE); I915_WRITE(IPS_CTL, IPS_ENABLE);
} }
static void hsw_disable_ips(struct intel_crtc *crtc) void hsw_disable_ips(struct intel_crtc *crtc)
{ {
struct drm_device *dev = crtc->base.dev; struct drm_device *dev = crtc->base.dev;
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
......
...@@ -677,6 +677,8 @@ ironlake_check_encoder_dotclock(const struct intel_crtc_config *pipe_config, ...@@ -677,6 +677,8 @@ ironlake_check_encoder_dotclock(const struct intel_crtc_config *pipe_config,
int dotclock); int dotclock);
bool intel_crtc_active(struct drm_crtc *crtc); bool intel_crtc_active(struct drm_crtc *crtc);
void i915_disable_vga_mem(struct drm_device *dev); void i915_disable_vga_mem(struct drm_device *dev);
void hsw_enable_ips(struct intel_crtc *crtc);
void hsw_disable_ips(struct intel_crtc *crtc);
/* intel_dp.c */ /* intel_dp.c */
......
...@@ -528,6 +528,17 @@ intel_enable_primary(struct drm_crtc *crtc) ...@@ -528,6 +528,17 @@ intel_enable_primary(struct drm_crtc *crtc)
I915_WRITE(reg, I915_READ(reg) | DISPLAY_PLANE_ENABLE); I915_WRITE(reg, I915_READ(reg) | DISPLAY_PLANE_ENABLE);
/*
* FIXME IPS should be fine as long as one plane is
* enabled, but in practice it seems to have problems
* when going from primary only to sprite only and vice
* versa.
*/
if (intel_crtc->config.ips_enabled) {
intel_wait_for_vblank(dev, intel_crtc->pipe);
hsw_enable_ips(intel_crtc);
}
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
intel_update_fbc(dev); intel_update_fbc(dev);
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
...@@ -551,6 +562,14 @@ intel_disable_primary(struct drm_crtc *crtc) ...@@ -551,6 +562,14 @@ intel_disable_primary(struct drm_crtc *crtc)
intel_disable_fbc(dev); intel_disable_fbc(dev);
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
/*
* FIXME IPS should be fine as long as one plane is
* enabled, but in practice it seems to have problems
* when going from primary only to sprite only and vice
* versa.
*/
hsw_disable_ips(intel_crtc);
I915_WRITE(reg, I915_READ(reg) & ~DISPLAY_PLANE_ENABLE); I915_WRITE(reg, I915_READ(reg) & ~DISPLAY_PLANE_ENABLE);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment