aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/intel_display.c31
1 files changed, 18 insertions, 13 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index a7a7b672c4c2..8f7ed7304269 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -1290,6 +1290,17 @@ static void intel_disable_pipe(struct drm_i915_private *dev_priv,
1290 intel_wait_for_pipe_off(dev_priv->dev, pipe); 1290 intel_wait_for_pipe_off(dev_priv->dev, pipe);
1291} 1291}
1292 1292
1293/*
1294 * Plane regs are double buffered, going from enabled->disabled needs a
1295 * trigger in order to latch. The display address reg provides this.
1296 */
1297static void intel_flush_display_plane(struct drm_i915_private *dev_priv,
1298 enum plane plane)
1299{
1300 I915_WRITE(DSPADDR(plane), I915_READ(DSPADDR(plane)));
1301 I915_WRITE(DSPSURF(plane), I915_READ(DSPSURF(plane)));
1302}
1303
1293/** 1304/**
1294 * intel_enable_plane - enable a display plane on a given pipe 1305 * intel_enable_plane - enable a display plane on a given pipe
1295 * @dev_priv: i915 private structure 1306 * @dev_priv: i915 private structure
@@ -1313,20 +1324,10 @@ static void intel_enable_plane(struct drm_i915_private *dev_priv,
1313 return; 1324 return;
1314 1325
1315 I915_WRITE(reg, val | DISPLAY_PLANE_ENABLE); 1326 I915_WRITE(reg, val | DISPLAY_PLANE_ENABLE);
1327 intel_flush_display_plane(dev_priv, plane);
1316 intel_wait_for_vblank(dev_priv->dev, pipe); 1328 intel_wait_for_vblank(dev_priv->dev, pipe);
1317} 1329}
1318 1330
1319/*
1320 * Plane regs are double buffered, going from enabled->disabled needs a
1321 * trigger in order to latch. The display address reg provides this.
1322 */
1323static void intel_flush_display_plane(struct drm_i915_private *dev_priv,
1324 enum plane plane)
1325{
1326 I915_WRITE(DSPADDR(plane), I915_READ(DSPADDR(plane)));
1327 I915_WRITE(DSPSURF(plane), I915_READ(DSPSURF(plane)));
1328}
1329
1330/** 1331/**
1331 * intel_disable_plane - disable a display plane 1332 * intel_disable_plane - disable a display plane
1332 * @dev_priv: i915 private structure 1333 * @dev_priv: i915 private structure
@@ -7418,10 +7419,12 @@ static void gen6_init_clock_gating(struct drm_device *dev)
7418 ILK_DPARB_CLK_GATE | 7419 ILK_DPARB_CLK_GATE |
7419 ILK_DPFD_CLK_GATE); 7420 ILK_DPFD_CLK_GATE);
7420 7421
7421 for_each_pipe(pipe) 7422 for_each_pipe(pipe) {
7422 I915_WRITE(DSPCNTR(pipe), 7423 I915_WRITE(DSPCNTR(pipe),
7423 I915_READ(DSPCNTR(pipe)) | 7424 I915_READ(DSPCNTR(pipe)) |
7424 DISPPLANE_TRICKLE_FEED_DISABLE); 7425 DISPPLANE_TRICKLE_FEED_DISABLE);
7426 intel_flush_display_plane(dev_priv, pipe);
7427 }
7425} 7428}
7426 7429
7427static void ivybridge_init_clock_gating(struct drm_device *dev) 7430static void ivybridge_init_clock_gating(struct drm_device *dev)
@@ -7438,10 +7441,12 @@ static void ivybridge_init_clock_gating(struct drm_device *dev)
7438 7441
7439 I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE); 7442 I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE);
7440 7443
7441 for_each_pipe(pipe) 7444 for_each_pipe(pipe) {
7442 I915_WRITE(DSPCNTR(pipe), 7445 I915_WRITE(DSPCNTR(pipe),
7443 I915_READ(DSPCNTR(pipe)) | 7446 I915_READ(DSPCNTR(pipe)) |
7444 DISPPLANE_TRICKLE_FEED_DISABLE); 7447 DISPPLANE_TRICKLE_FEED_DISABLE);
7448 intel_flush_display_plane(dev_priv, pipe);
7449 }
7445} 7450}
7446 7451
7447static void g4x_init_clock_gating(struct drm_device *dev) 7452static void g4x_init_clock_gating(struct drm_device *dev)