@@ -1813,12 +1813,14 @@
#define DSPFW_SR_SHIFT 23
#define DSPFW_CURSORB_SHIFT 16
#define DSPFW_PLANEB_SHIFT 8
+#define DSPFW_SR_MASK (0x1ff << 23)
#define DSPFW2 0x70038
#define DSPFW_CURSORA_MASK 0x00003f00
#define DSPFW_CURSORA_SHIFT 8
#define DSPFW3 0x7003c
#define DSPFW_HPLL_SR_EN (1<<31)
#define DSPFW_CURSOR_SR_SHIFT 24
+#define DSPFW_CURSOR_SR_MASK (0x3f << 24)
#define PINEVIEW_SELF_REFRESH_EN (1<<30)
/* FIFO watermark sizes etc */
@@ -2649,6 +2649,7 @@ static void g4x_update_wm(struct drm_device *dev,
int planea_wm, planeb_wm, cursora_wm, cursorb_wm, cursor_sr;
struct intel_watermark_params planea_params, planeb_params;
int sr_entries = 0;
+ u32 reg_value;
/* Create copies of the base settings for each pipe */
planea_params = planeb_params = g4x_wm_info;
@@ -2678,7 +2679,6 @@ static void g4x_update_wm(struct drm_device *dev,
planeb_wm = 16;
cursora_wm = cursorb_wm = 16;
- cursor_sr = 32;
DRM_DEBUG("FIFO watermarks - A: %d, B: %d\n", planea_wm, planeb_wm);
@@ -2702,24 +2702,34 @@ static void g4x_update_wm(struct drm_device *dev,
sr_latency_ns, 1);
DRM_DEBUG_KMS("Display plane self-refresh entries: %d\n",
sr_entries);
+ reg_value = I915_READ(DSPFW1);
+ reg_value &= ~DSPFW_SR_MASK;
+ reg_value |= (sr_entries << DSPFW_SR_SHIFT);
+ I915_WRITE(DSPFW1, reg_value);
DRM_DEBUG_KMS("cursor self-refresh entries: %d\n",
cursor_sr);
+ reg_value = I915_READ(DSPFW3);
+ reg_value &= ~DSPFW_CURSOR_SR_MASK;
+ reg_value |= (cursor_sr << DSPFW_CURSOR_SR_SHIFT);
+ I915_WRITE(DSPFW3, reg_value);
I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN);
}
- DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d, SR %d\n",
- planea_wm, planeb_wm, sr_entries);
+ DRM_DEBUG_KMS("Setting FIFO watermarks - A: %d, B: %d\n",
+ planea_wm, planeb_wm);
+
+ reg_value = I915_READ(DSPFW1);
+ reg_value &= DSPFW_SR_MASK;
+ reg_value |= (cursorb_wm << DSPFW_CURSORB_SHIFT) |
+ (planeb_wm << DSPFW_PLANEB_SHIFT) | planea_wm;
+ I915_WRITE(DSPFW1, reg_value);
- I915_WRITE(DSPFW1, (sr_entries << DSPFW_SR_SHIFT) |
- (cursorb_wm << DSPFW_CURSORB_SHIFT) |
- (planeb_wm << DSPFW_PLANEB_SHIFT) | planea_wm);
/* Only update cursor A watermark in FW2 */
I915_WRITE(DSPFW2, (I915_READ(DSPFW2) & ~DSPFW_CURSORA_MASK) |
(cursora_wm << DSPFW_CURSORA_SHIFT));
/* HPLL off in SR has some issues on G4x... disable it */
- I915_WRITE(DSPFW3, (I915_READ(DSPFW3) & ~DSPFW_HPLL_SR_EN) |
- (cursor_sr << DSPFW_CURSOR_SR_SHIFT));
+ I915_WRITE(DSPFW3, (I915_READ(DSPFW3) & ~DSPFW_HPLL_SR_EN));
}
static void i965_update_wm(struct drm_device *dev,
@@ -2729,6 +2739,7 @@ static void i965_update_wm(struct drm_device *dev,
{
struct drm_i915_private *dev_priv = dev->dev_private;
int srwm = 1, cursor_sr;
+ u32 reg_value;
cursor_sr = 32;
/* Calc sr entries for one plane configs */
@@ -2750,18 +2761,32 @@ static void i965_update_wm(struct drm_device *dev,
pixel_size, WM_TYPE_CURSOR, crtc_mode,
sr_latency_ns, 1);
+ DRM_DEBUG_KMS("Display plane self-refresh entries: %d\n",
+ srwm);
+ reg_value = I915_READ(DSPFW1);
+ reg_value &= ~DSPFW_SR_MASK;
+ reg_value |= (srwm << DSPFW_SR_SHIFT);
+ I915_WRITE(DSPFW1, reg_value);
+ DRM_DEBUG_KMS("cursor self-refresh entries: %d\n",
+ cursor_sr);
+ reg_value = I915_READ(DSPFW3);
+ reg_value &= ~DSPFW_CURSOR_SR_MASK;
+ reg_value |= (cursor_sr << DSPFW_CURSOR_SR_SHIFT);
+ I915_WRITE(DSPFW3, reg_value);
+
I915_WRITE(FW_BLC_SELF, FW_BLC_SELF_EN);
}
- DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8, SR %d\n",
- srwm);
+ DRM_DEBUG_KMS("Setting FIFO watermarks - A: 8, B: 8, C: 8\n");
/* 965 has limitations... */
- I915_WRITE(DSPFW1, (srwm << DSPFW_SR_SHIFT) | (8 << 16) | (8 << 8) |
+ reg_value = I915_READ(DSPFW1);
+ reg_value &= DSPFW_SR_MASK;
+ I915_WRITE(DSPFW1, reg_value | (8 << 16) | (8 << 8) |
(8 << 0));
I915_WRITE(DSPFW2, (8 << 8) | (8 << 0));
- /* update the cursor self-refresh watermark */
- I915_WRITE(DSPFW3, (cursor_sr << 24));
+ /* Disable HPLL off in SR*/
+ I915_WRITE(DSPFW3, (I915_READ(DSPFW3) & ~DSPFW_HPLL_SR_EN));
}
static void i9xx_update_wm(struct drm_device *dev,