diff options
author | Keith Packard <keithp@keithp.com> | 2011-07-28 17:47:14 -0400 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2011-07-28 19:28:35 -0400 |
commit | d74362c9e45689d8d7e3d4bcf6681c4358ef4f2e (patch) | |
tree | fca86658c69f3a778e1eb39ca58b983c5b36140e /drivers/gpu/drm/i915 | |
parent | 2704cf5fbd248871a745d210733c6319959d2b0c (diff) |
drm/i915: Flush other plane register writes
Writes to the plane control register are buffered in the chip until a
write to the DSPADDR (pre-965) or DSPSURF (post-965) register occurs.
This patch adds flushes in:
intel_enable_plane
gen6_init_clock_gating
ivybridge_init_clock_gating
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 31 |
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 | */ | ||
1297 | static 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 | */ | ||
1323 | static 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 | ||
7427 | static void ivybridge_init_clock_gating(struct drm_device *dev) | 7430 | static 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 | ||
7447 | static void g4x_init_clock_gating(struct drm_device *dev) | 7452 | static void g4x_init_clock_gating(struct drm_device *dev) |