aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2011-07-08 07:22:39 -0400
committerKeith Packard <keithp@keithp.com>2011-07-08 13:23:09 -0400
commitde568510cd410d82d370d3000808aca63ef28a22 (patch)
treeedff697f71023b729eba78bd2622b8ae8d364e93 /drivers/gpu
parentf19a079a800dfd365fa8ed422acf29ca7a036ea3 (diff)
drm/i915: Use of a CPU fence is mandatory to update FBC regions upon CPU writes
...and this requirement is enforced by intel_update_fbc() so we can remove the later check from g4x_enable_fbc() and ironlake_enable_fbc(). Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Jesse Barnes <jbarnes@virtuousgeek.org> Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c33
1 files changed, 14 insertions, 19 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 5c359e59d325..31c75266a456 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -1441,9 +1441,8 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1441 I915_WRITE(FBC_TAG + (i * 4), 0); 1441 I915_WRITE(FBC_TAG + (i * 4), 0);
1442 1442
1443 /* Set it up... */ 1443 /* Set it up... */
1444 fbc_ctl2 = FBC_CTL_FENCE_DBL | FBC_CTL_IDLE_IMM | plane; 1444 fbc_ctl2 = FBC_CTL_FENCE_DBL | FBC_CTL_IDLE_IMM | FBC_CTL_CPU_FENCE;
1445 if (obj->tiling_mode != I915_TILING_NONE) 1445 fbc_ctl2 |= plane;
1446 fbc_ctl2 |= FBC_CTL_CPU_FENCE;
1447 I915_WRITE(FBC_CONTROL2, fbc_ctl2); 1446 I915_WRITE(FBC_CONTROL2, fbc_ctl2);
1448 I915_WRITE(FBC_FENCE_OFF, crtc->y); 1447 I915_WRITE(FBC_FENCE_OFF, crtc->y);
1449 1448
@@ -1453,8 +1452,7 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1453 fbc_ctl |= FBC_CTL_C3_IDLE; /* 945 needs special SR handling */ 1452 fbc_ctl |= FBC_CTL_C3_IDLE; /* 945 needs special SR handling */
1454 fbc_ctl |= (dev_priv->cfb_pitch & 0xff) << FBC_CTL_STRIDE_SHIFT; 1453 fbc_ctl |= (dev_priv->cfb_pitch & 0xff) << FBC_CTL_STRIDE_SHIFT;
1455 fbc_ctl |= (interval & 0x2fff) << FBC_CTL_INTERVAL_SHIFT; 1454 fbc_ctl |= (interval & 0x2fff) << FBC_CTL_INTERVAL_SHIFT;
1456 if (obj->tiling_mode != I915_TILING_NONE) 1455 fbc_ctl |= dev_priv->cfb_fence;
1457 fbc_ctl |= dev_priv->cfb_fence;
1458 I915_WRITE(FBC_CONTROL, fbc_ctl); 1456 I915_WRITE(FBC_CONTROL, fbc_ctl);
1459 1457
1460 DRM_DEBUG_KMS("enabled FBC, pitch %ld, yoff %d, plane %d, ", 1458 DRM_DEBUG_KMS("enabled FBC, pitch %ld, yoff %d, plane %d, ",
@@ -1496,12 +1494,8 @@ static void g4x_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1496 dev_priv->cfb_y = crtc->y; 1494 dev_priv->cfb_y = crtc->y;
1497 1495
1498 dpfc_ctl = plane | DPFC_SR_EN | DPFC_CTL_LIMIT_1X; 1496 dpfc_ctl = plane | DPFC_SR_EN | DPFC_CTL_LIMIT_1X;
1499 if (obj->tiling_mode != I915_TILING_NONE) { 1497 dpfc_ctl |= DPFC_CTL_FENCE_EN | dev_priv->cfb_fence;
1500 dpfc_ctl |= DPFC_CTL_FENCE_EN | dev_priv->cfb_fence; 1498 I915_WRITE(DPFC_CHICKEN, DPFC_HT_MODIFY);
1501 I915_WRITE(DPFC_CHICKEN, DPFC_HT_MODIFY);
1502 } else {
1503 I915_WRITE(DPFC_CHICKEN, ~DPFC_HT_MODIFY);
1504 }
1505 1499
1506 I915_WRITE(DPFC_RECOMP_CTL, DPFC_RECOMP_STALL_EN | 1500 I915_WRITE(DPFC_RECOMP_CTL, DPFC_RECOMP_STALL_EN |
1507 (stall_watermark << DPFC_RECOMP_STALL_WM_SHIFT) | 1501 (stall_watermark << DPFC_RECOMP_STALL_WM_SHIFT) |
@@ -1587,12 +1581,8 @@ static void ironlake_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
1587 1581
1588 dpfc_ctl &= DPFC_RESERVED; 1582 dpfc_ctl &= DPFC_RESERVED;
1589 dpfc_ctl |= (plane | DPFC_CTL_LIMIT_1X); 1583 dpfc_ctl |= (plane | DPFC_CTL_LIMIT_1X);
1590 if (obj->tiling_mode != I915_TILING_NONE) { 1584 dpfc_ctl |= (DPFC_CTL_FENCE_EN | dev_priv->cfb_fence);
1591 dpfc_ctl |= (DPFC_CTL_FENCE_EN | dev_priv->cfb_fence); 1585 I915_WRITE(ILK_DPFC_CHICKEN, DPFC_HT_MODIFY);
1592 I915_WRITE(ILK_DPFC_CHICKEN, DPFC_HT_MODIFY);
1593 } else {
1594 I915_WRITE(ILK_DPFC_CHICKEN, ~DPFC_HT_MODIFY);
1595 }
1596 1586
1597 I915_WRITE(ILK_DPFC_RECOMP_CTL, DPFC_RECOMP_STALL_EN | 1587 I915_WRITE(ILK_DPFC_RECOMP_CTL, DPFC_RECOMP_STALL_EN |
1598 (stall_watermark << DPFC_RECOMP_STALL_WM_SHIFT) | 1588 (stall_watermark << DPFC_RECOMP_STALL_WM_SHIFT) |
@@ -1760,8 +1750,13 @@ static void intel_update_fbc(struct drm_device *dev)
1760 dev_priv->no_fbc_reason = FBC_BAD_PLANE; 1750 dev_priv->no_fbc_reason = FBC_BAD_PLANE;
1761 goto out_disable; 1751 goto out_disable;
1762 } 1752 }
1763 if (obj->tiling_mode != I915_TILING_X) { 1753
1764 DRM_DEBUG_KMS("framebuffer not tiled, disabling compression\n"); 1754 /* The use of a CPU fence is mandatory in order to detect writes
1755 * by the CPU to the scanout and trigger updates to the FBC.
1756 */
1757 if (obj->tiling_mode != I915_TILING_X ||
1758 obj->fence_reg == I915_FENCE_REG_NONE) {
1759 DRM_DEBUG_KMS("framebuffer not tiled or fenced, disabling compression\n");
1765 dev_priv->no_fbc_reason = FBC_NOT_TILED; 1760 dev_priv->no_fbc_reason = FBC_NOT_TILED;
1766 goto out_disable; 1761 goto out_disable;
1767 } 1762 }