diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 54 |
1 files changed, 38 insertions, 16 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 2a3f707caab8..f425b23e3803 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -1872,7 +1872,7 @@ static void intel_update_fbc(struct drm_device *dev) | |||
1872 | if (enable_fbc < 0) { | 1872 | if (enable_fbc < 0) { |
1873 | DRM_DEBUG_KMS("fbc set to per-chip default\n"); | 1873 | DRM_DEBUG_KMS("fbc set to per-chip default\n"); |
1874 | enable_fbc = 1; | 1874 | enable_fbc = 1; |
1875 | if (INTEL_INFO(dev)->gen <= 5) | 1875 | if (INTEL_INFO(dev)->gen <= 6) |
1876 | enable_fbc = 0; | 1876 | enable_fbc = 0; |
1877 | } | 1877 | } |
1878 | if (!enable_fbc) { | 1878 | if (!enable_fbc) { |
@@ -5307,6 +5307,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, | |||
5307 | } | 5307 | } |
5308 | } | 5308 | } |
5309 | 5309 | ||
5310 | pipeconf &= ~PIPECONF_INTERLACE_MASK; | ||
5310 | if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) { | 5311 | if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) { |
5311 | pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION; | 5312 | pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION; |
5312 | /* the chip adds 2 halflines automatically */ | 5313 | /* the chip adds 2 halflines automatically */ |
@@ -5317,7 +5318,7 @@ static int i9xx_crtc_mode_set(struct drm_crtc *crtc, | |||
5317 | adjusted_mode->crtc_vsync_end -= 1; | 5318 | adjusted_mode->crtc_vsync_end -= 1; |
5318 | adjusted_mode->crtc_vsync_start -= 1; | 5319 | adjusted_mode->crtc_vsync_start -= 1; |
5319 | } else | 5320 | } else |
5320 | pipeconf &= ~PIPECONF_INTERLACE_MASK; /* progressive */ | 5321 | pipeconf |= PIPECONF_PROGRESSIVE; |
5321 | 5322 | ||
5322 | I915_WRITE(HTOTAL(pipe), | 5323 | I915_WRITE(HTOTAL(pipe), |
5323 | (adjusted_mode->crtc_hdisplay - 1) | | 5324 | (adjusted_mode->crtc_hdisplay - 1) | |
@@ -5808,12 +5809,15 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, | |||
5808 | if (is_lvds) { | 5809 | if (is_lvds) { |
5809 | temp = I915_READ(PCH_LVDS); | 5810 | temp = I915_READ(PCH_LVDS); |
5810 | temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP; | 5811 | temp |= LVDS_PORT_EN | LVDS_A0A2_CLKA_POWER_UP; |
5811 | if (HAS_PCH_CPT(dev)) | 5812 | if (HAS_PCH_CPT(dev)) { |
5813 | temp &= ~PORT_TRANS_SEL_MASK; | ||
5812 | temp |= PORT_TRANS_SEL_CPT(pipe); | 5814 | temp |= PORT_TRANS_SEL_CPT(pipe); |
5813 | else if (pipe == 1) | 5815 | } else { |
5814 | temp |= LVDS_PIPEB_SELECT; | 5816 | if (pipe == 1) |
5815 | else | 5817 | temp |= LVDS_PIPEB_SELECT; |
5816 | temp &= ~LVDS_PIPEB_SELECT; | 5818 | else |
5819 | temp &= ~LVDS_PIPEB_SELECT; | ||
5820 | } | ||
5817 | 5821 | ||
5818 | /* set the corresponsding LVDS_BORDER bit */ | 5822 | /* set the corresponsding LVDS_BORDER bit */ |
5819 | temp |= dev_priv->lvds_border_bits; | 5823 | temp |= dev_priv->lvds_border_bits; |
@@ -5899,6 +5903,7 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, | |||
5899 | } | 5903 | } |
5900 | } | 5904 | } |
5901 | 5905 | ||
5906 | pipeconf &= ~PIPECONF_INTERLACE_MASK; | ||
5902 | if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) { | 5907 | if (adjusted_mode->flags & DRM_MODE_FLAG_INTERLACE) { |
5903 | pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION; | 5908 | pipeconf |= PIPECONF_INTERLACE_W_FIELD_INDICATION; |
5904 | /* the chip adds 2 halflines automatically */ | 5909 | /* the chip adds 2 halflines automatically */ |
@@ -5909,7 +5914,7 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, | |||
5909 | adjusted_mode->crtc_vsync_end -= 1; | 5914 | adjusted_mode->crtc_vsync_end -= 1; |
5910 | adjusted_mode->crtc_vsync_start -= 1; | 5915 | adjusted_mode->crtc_vsync_start -= 1; |
5911 | } else | 5916 | } else |
5912 | pipeconf &= ~PIPECONF_INTERLACE_W_FIELD_INDICATION; /* progressive */ | 5917 | pipeconf |= PIPECONF_PROGRESSIVE; |
5913 | 5918 | ||
5914 | I915_WRITE(HTOTAL(pipe), | 5919 | I915_WRITE(HTOTAL(pipe), |
5915 | (adjusted_mode->crtc_hdisplay - 1) | | 5920 | (adjusted_mode->crtc_hdisplay - 1) | |
@@ -8179,8 +8184,8 @@ void gen6_enable_rps(struct drm_i915_private *dev_priv) | |||
8179 | I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ | 8184 | I915_WRITE(GEN6_RC6pp_THRESHOLD, 64000); /* unused */ |
8180 | 8185 | ||
8181 | if (intel_enable_rc6(dev_priv->dev)) | 8186 | if (intel_enable_rc6(dev_priv->dev)) |
8182 | rc6_mask = GEN6_RC_CTL_RC6p_ENABLE | | 8187 | rc6_mask = GEN6_RC_CTL_RC6_ENABLE | |
8183 | GEN6_RC_CTL_RC6_ENABLE; | 8188 | (IS_GEN7(dev_priv->dev)) ? GEN6_RC_CTL_RC6p_ENABLE : 0; |
8184 | 8189 | ||
8185 | I915_WRITE(GEN6_RC_CONTROL, | 8190 | I915_WRITE(GEN6_RC_CONTROL, |
8186 | rc6_mask | | 8191 | rc6_mask | |
@@ -8458,12 +8463,32 @@ static void ivybridge_init_clock_gating(struct drm_device *dev) | |||
8458 | I915_WRITE(WM2_LP_ILK, 0); | 8463 | I915_WRITE(WM2_LP_ILK, 0); |
8459 | I915_WRITE(WM1_LP_ILK, 0); | 8464 | I915_WRITE(WM1_LP_ILK, 0); |
8460 | 8465 | ||
8466 | /* According to the spec, bit 13 (RCZUNIT) must be set on IVB. | ||
8467 | * This implements the WaDisableRCZUnitClockGating workaround. | ||
8468 | */ | ||
8469 | I915_WRITE(GEN6_UCGCTL2, GEN6_RCZUNIT_CLOCK_GATE_DISABLE); | ||
8470 | |||
8461 | I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE); | 8471 | I915_WRITE(ILK_DSPCLK_GATE, IVB_VRHUNIT_CLK_GATE); |
8462 | 8472 | ||
8463 | I915_WRITE(IVB_CHICKEN3, | 8473 | I915_WRITE(IVB_CHICKEN3, |
8464 | CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE | | 8474 | CHICKEN3_DGMG_REQ_OUT_FIX_DISABLE | |
8465 | CHICKEN3_DGMG_DONE_FIX_DISABLE); | 8475 | CHICKEN3_DGMG_DONE_FIX_DISABLE); |
8466 | 8476 | ||
8477 | /* Apply the WaDisableRHWOOptimizationForRenderHang workaround. */ | ||
8478 | I915_WRITE(GEN7_COMMON_SLICE_CHICKEN1, | ||
8479 | GEN7_CSC1_RHWO_OPT_DISABLE_IN_RCC); | ||
8480 | |||
8481 | /* WaApplyL3ControlAndL3ChickenMode requires those two on Ivy Bridge */ | ||
8482 | I915_WRITE(GEN7_L3CNTLREG1, | ||
8483 | GEN7_WA_FOR_GEN7_L3_CONTROL); | ||
8484 | I915_WRITE(GEN7_L3_CHICKEN_MODE_REGISTER, | ||
8485 | GEN7_WA_L3_CHICKEN_MODE); | ||
8486 | |||
8487 | /* This is required by WaCatErrorRejectionIssue */ | ||
8488 | I915_WRITE(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG, | ||
8489 | I915_READ(GEN7_SQ_CHICKEN_MBCUNIT_CONFIG) | | ||
8490 | GEN7_SQ_CHICKEN_MBCUNIT_SQINTMOB); | ||
8491 | |||
8467 | for_each_pipe(pipe) { | 8492 | for_each_pipe(pipe) { |
8468 | I915_WRITE(DSPCNTR(pipe), | 8493 | I915_WRITE(DSPCNTR(pipe), |
8469 | I915_READ(DSPCNTR(pipe)) | | 8494 | I915_READ(DSPCNTR(pipe)) | |
@@ -9025,12 +9050,9 @@ void intel_modeset_init(struct drm_device *dev) | |||
9025 | 9050 | ||
9026 | for (i = 0; i < dev_priv->num_pipe; i++) { | 9051 | for (i = 0; i < dev_priv->num_pipe; i++) { |
9027 | intel_crtc_init(dev, i); | 9052 | intel_crtc_init(dev, i); |
9028 | if (HAS_PCH_SPLIT(dev)) { | 9053 | ret = intel_plane_init(dev, i); |
9029 | ret = intel_plane_init(dev, i); | 9054 | if (ret) |
9030 | if (ret) | 9055 | DRM_DEBUG_KMS("plane %d init failed: %d\n", i, ret); |
9031 | DRM_ERROR("plane %d init failed: %d\n", | ||
9032 | i, ret); | ||
9033 | } | ||
9034 | } | 9056 | } |
9035 | 9057 | ||
9036 | /* Just disable it once at startup */ | 9058 | /* Just disable it once at startup */ |