diff options
author | Jesse Barnes <jbarnes@jbarnes-x200.(none)> | 2009-10-18 21:08:17 -0400 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2009-11-05 17:47:14 -0500 |
commit | 1dc7546d1a73664e5d117715b214bea9cae5951c (patch) | |
tree | 7cc6e9db0152abec368c584da5e0b559f9c25c2c /drivers/gpu/drm/i915/intel_display.c | |
parent | a4f45cf178f0d0ad4e516e020818b5f1c00e3d63 (diff) |
drm/i915: enable self-refresh on 965
Need to calculate the SR watermark and enable it.
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Signed-off-by: Eric Anholt <eric@anholt.net>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 32 |
1 files changed, 28 insertions, 4 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index e4221b8844ce..43af081328fe 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -2551,15 +2551,39 @@ static void g4x_update_wm(struct drm_device *dev, int planea_clock, | |||
2551 | (cursor_sr << DSPFW_CURSOR_SR_SHIFT)); | 2551 | (cursor_sr << DSPFW_CURSOR_SR_SHIFT)); |
2552 | } | 2552 | } |
2553 | 2553 | ||
2554 | static void i965_update_wm(struct drm_device *dev, int unused, int unused2, | 2554 | static void i965_update_wm(struct drm_device *dev, int planea_clock, |
2555 | int unused3, int unused4) | 2555 | int planeb_clock, int sr_hdisplay, int pixel_size) |
2556 | { | 2556 | { |
2557 | struct drm_i915_private *dev_priv = dev->dev_private; | 2557 | struct drm_i915_private *dev_priv = dev->dev_private; |
2558 | unsigned long line_time_us; | ||
2559 | int sr_clock, sr_entries, srwm = 1; | ||
2560 | |||
2561 | /* Calc sr entries for one plane configs */ | ||
2562 | if (sr_hdisplay && (!planea_clock || !planeb_clock)) { | ||
2563 | /* self-refresh has much higher latency */ | ||
2564 | const static int sr_latency_ns = 12000; | ||
2565 | |||
2566 | sr_clock = planea_clock ? planea_clock : planeb_clock; | ||
2567 | line_time_us = ((sr_hdisplay * 1000) / sr_clock); | ||
2568 | |||
2569 | /* Use ns/us then divide to preserve precision */ | ||
2570 | sr_entries = (((sr_latency_ns / line_time_us) + 1) * | ||
2571 | pixel_size * sr_hdisplay) / 1000; | ||
2572 | sr_entries = roundup(sr_entries / I915_FIFO_LINE_SIZE, 1); | ||
2573 | DRM_DEBUG("self-refresh entries: %d\n", sr_entries); | ||
2574 | srwm = I945_FIFO_SIZE - sr_entries; | ||
2575 | if (srwm < 0) | ||
2576 | srwm = 1; | ||
2577 | srwm &= 0x3f; | ||
2578 | I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN); | ||
2579 | } | ||
2558 | 2580 | ||
2559 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR 8\n"); | 2581 | DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n", |
2582 | srwm); | ||
2560 | 2583 | ||
2561 | /* 965 has limitations... */ | 2584 | /* 965 has limitations... */ |
2562 | I915_WRITE(DSPFW1, (8 << 16) | (8 << 8) | (8 << 0)); | 2585 | I915_WRITE(DSPFW1, (srwm << DSPFW_SR_SHIFT) | (8 << 16) | (8 << 8) | |
2586 | (8 << 0)); | ||
2563 | I915_WRITE(DSPFW2, (8 << 8) | (8 << 0)); | 2587 | I915_WRITE(DSPFW2, (8 << 8) | (8 << 0)); |
2564 | } | 2588 | } |
2565 | 2589 | ||