|
@@ -5051,6 +5051,20 @@ static void g4x_disable_trickle_feed(struct drm_device *dev)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void ilk_init_lp_watermarks(struct drm_device *dev)
|
|
|
|
+{
|
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
|
+
|
|
|
|
+ I915_WRITE(WM3_LP_ILK, I915_READ(WM3_LP_ILK) & ~WM1_LP_SR_EN);
|
|
|
|
+ I915_WRITE(WM2_LP_ILK, I915_READ(WM2_LP_ILK) & ~WM1_LP_SR_EN);
|
|
|
|
+ I915_WRITE(WM1_LP_ILK, I915_READ(WM1_LP_ILK) & ~WM1_LP_SR_EN);
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * Don't touch WM1S_LP_EN here.
|
|
|
|
+ * Doing so could cause underruns.
|
|
|
|
+ */
|
|
|
|
+}
|
|
|
|
+
|
|
static void ironlake_init_clock_gating(struct drm_device *dev)
|
|
static void ironlake_init_clock_gating(struct drm_device *dev)
|
|
{
|
|
{
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
@@ -5084,9 +5098,8 @@ static void ironlake_init_clock_gating(struct drm_device *dev)
|
|
I915_WRITE(DISP_ARB_CTL,
|
|
I915_WRITE(DISP_ARB_CTL,
|
|
(I915_READ(DISP_ARB_CTL) |
|
|
(I915_READ(DISP_ARB_CTL) |
|
|
DISP_FBC_WM_DIS));
|
|
DISP_FBC_WM_DIS));
|
|
- I915_WRITE(WM3_LP_ILK, 0);
|
|
|
|
- I915_WRITE(WM2_LP_ILK, 0);
|
|
|
|
- I915_WRITE(WM1_LP_ILK, 0);
|
|
|
|
|
|
+
|
|
|
|
+ ilk_init_lp_watermarks(dev);
|
|
|
|
|
|
/*
|
|
/*
|
|
* Based on the document from hardware guys the following bits
|
|
* Based on the document from hardware guys the following bits
|
|
@@ -5193,9 +5206,7 @@ static void gen6_init_clock_gating(struct drm_device *dev)
|
|
I915_WRITE(GEN6_GT_MODE,
|
|
I915_WRITE(GEN6_GT_MODE,
|
|
_MASKED_BIT_ENABLE(GEN6_TD_FOUR_ROW_DISPATCH_DISABLE));
|
|
_MASKED_BIT_ENABLE(GEN6_TD_FOUR_ROW_DISPATCH_DISABLE));
|
|
|
|
|
|
- I915_WRITE(WM3_LP_ILK, 0);
|
|
|
|
- I915_WRITE(WM2_LP_ILK, 0);
|
|
|
|
- I915_WRITE(WM1_LP_ILK, 0);
|
|
|
|
|
|
+ ilk_init_lp_watermarks(dev);
|
|
|
|
|
|
I915_WRITE(CACHE_MODE_0,
|
|
I915_WRITE(CACHE_MODE_0,
|
|
_MASKED_BIT_DISABLE(CM0_STC_EVICT_DISABLE_LRA_SNB));
|
|
_MASKED_BIT_DISABLE(CM0_STC_EVICT_DISABLE_LRA_SNB));
|
|
@@ -5369,9 +5380,7 @@ static void haswell_init_clock_gating(struct drm_device *dev)
|
|
{
|
|
{
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
|
|
|
- I915_WRITE(WM3_LP_ILK, 0);
|
|
|
|
- I915_WRITE(WM2_LP_ILK, 0);
|
|
|
|
- I915_WRITE(WM1_LP_ILK, 0);
|
|
|
|
|
|
+ ilk_init_lp_watermarks(dev);
|
|
|
|
|
|
/* According to the spec, bit 13 (RCZUNIT) must be set on IVB.
|
|
/* According to the spec, bit 13 (RCZUNIT) must be set on IVB.
|
|
* This implements the WaDisableRCZUnitClockGating:hsw workaround.
|
|
* This implements the WaDisableRCZUnitClockGating:hsw workaround.
|
|
@@ -5420,9 +5429,7 @@ static void ivybridge_init_clock_gating(struct drm_device *dev)
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
uint32_t snpcr;
|
|
uint32_t snpcr;
|
|
|
|
|
|
- I915_WRITE(WM3_LP_ILK, 0);
|
|
|
|
- I915_WRITE(WM2_LP_ILK, 0);
|
|
|
|
- I915_WRITE(WM1_LP_ILK, 0);
|
|
|
|
|
|
+ ilk_init_lp_watermarks(dev);
|
|
|
|
|
|
I915_WRITE(ILK_DSPCLK_GATE_D, ILK_VRHUNIT_CLOCK_GATE_DISABLE);
|
|
I915_WRITE(ILK_DSPCLK_GATE_D, ILK_VRHUNIT_CLOCK_GATE_DISABLE);
|
|
|
|
|