diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2011-07-08 07:22:39 -0400 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2011-07-08 13:23:09 -0400 |
commit | de568510cd410d82d370d3000808aca63ef28a22 (patch) | |
tree | edff697f71023b729eba78bd2622b8ae8d364e93 /drivers/gpu | |
parent | f19a079a800dfd365fa8ed422acf29ca7a036ea3 (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.c | 33 |
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 | } |