diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 131 |
1 files changed, 84 insertions, 47 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 581fb4b2f766..d78d33f9337d 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -2327,9 +2327,10 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc) | |||
2327 | FDI_FE_ERRC_ENABLE); | 2327 | FDI_FE_ERRC_ENABLE); |
2328 | } | 2328 | } |
2329 | 2329 | ||
2330 | static bool pipe_has_enabled_pch(struct intel_crtc *intel_crtc) | 2330 | static bool pipe_has_enabled_pch(struct intel_crtc *crtc) |
2331 | { | 2331 | { |
2332 | return intel_crtc->base.enabled && intel_crtc->config.has_pch_encoder; | 2332 | return crtc->base.enabled && crtc->active && |
2333 | crtc->config.has_pch_encoder; | ||
2333 | } | 2334 | } |
2334 | 2335 | ||
2335 | static void ivb_modeset_global_resources(struct drm_device *dev) | 2336 | static void ivb_modeset_global_resources(struct drm_device *dev) |
@@ -2979,6 +2980,48 @@ static void ironlake_pch_transcoder_set_timings(struct intel_crtc *crtc, | |||
2979 | I915_READ(VSYNCSHIFT(cpu_transcoder))); | 2980 | I915_READ(VSYNCSHIFT(cpu_transcoder))); |
2980 | } | 2981 | } |
2981 | 2982 | ||
2983 | static void cpt_enable_fdi_bc_bifurcation(struct drm_device *dev) | ||
2984 | { | ||
2985 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
2986 | uint32_t temp; | ||
2987 | |||
2988 | temp = I915_READ(SOUTH_CHICKEN1); | ||
2989 | if (temp & FDI_BC_BIFURCATION_SELECT) | ||
2990 | return; | ||
2991 | |||
2992 | WARN_ON(I915_READ(FDI_RX_CTL(PIPE_B)) & FDI_RX_ENABLE); | ||
2993 | WARN_ON(I915_READ(FDI_RX_CTL(PIPE_C)) & FDI_RX_ENABLE); | ||
2994 | |||
2995 | temp |= FDI_BC_BIFURCATION_SELECT; | ||
2996 | DRM_DEBUG_KMS("enabling fdi C rx\n"); | ||
2997 | I915_WRITE(SOUTH_CHICKEN1, temp); | ||
2998 | POSTING_READ(SOUTH_CHICKEN1); | ||
2999 | } | ||
3000 | |||
3001 | static void ivybridge_update_fdi_bc_bifurcation(struct intel_crtc *intel_crtc) | ||
3002 | { | ||
3003 | struct drm_device *dev = intel_crtc->base.dev; | ||
3004 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
3005 | |||
3006 | switch (intel_crtc->pipe) { | ||
3007 | case PIPE_A: | ||
3008 | break; | ||
3009 | case PIPE_B: | ||
3010 | if (intel_crtc->config.fdi_lanes > 2) | ||
3011 | WARN_ON(I915_READ(SOUTH_CHICKEN1) & FDI_BC_BIFURCATION_SELECT); | ||
3012 | else | ||
3013 | cpt_enable_fdi_bc_bifurcation(dev); | ||
3014 | |||
3015 | break; | ||
3016 | case PIPE_C: | ||
3017 | cpt_enable_fdi_bc_bifurcation(dev); | ||
3018 | |||
3019 | break; | ||
3020 | default: | ||
3021 | BUG(); | ||
3022 | } | ||
3023 | } | ||
3024 | |||
2982 | /* | 3025 | /* |
2983 | * Enable PCH resources required for PCH ports: | 3026 | * Enable PCH resources required for PCH ports: |
2984 | * - PCH PLLs | 3027 | * - PCH PLLs |
@@ -2997,6 +3040,9 @@ static void ironlake_pch_enable(struct drm_crtc *crtc) | |||
2997 | 3040 | ||
2998 | assert_pch_transcoder_disabled(dev_priv, pipe); | 3041 | assert_pch_transcoder_disabled(dev_priv, pipe); |
2999 | 3042 | ||
3043 | if (IS_IVYBRIDGE(dev)) | ||
3044 | ivybridge_update_fdi_bc_bifurcation(intel_crtc); | ||
3045 | |||
3000 | /* Write the TU size bits before fdi link training, so that error | 3046 | /* Write the TU size bits before fdi link training, so that error |
3001 | * detection works. */ | 3047 | * detection works. */ |
3002 | I915_WRITE(FDI_RX_TUSIZE1(pipe), | 3048 | I915_WRITE(FDI_RX_TUSIZE1(pipe), |
@@ -4983,6 +5029,22 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc, | |||
4983 | if (!(tmp & PIPECONF_ENABLE)) | 5029 | if (!(tmp & PIPECONF_ENABLE)) |
4984 | return false; | 5030 | return false; |
4985 | 5031 | ||
5032 | if (IS_G4X(dev) || IS_VALLEYVIEW(dev)) { | ||
5033 | switch (tmp & PIPECONF_BPC_MASK) { | ||
5034 | case PIPECONF_6BPC: | ||
5035 | pipe_config->pipe_bpp = 18; | ||
5036 | break; | ||
5037 | case PIPECONF_8BPC: | ||
5038 | pipe_config->pipe_bpp = 24; | ||
5039 | break; | ||
5040 | case PIPECONF_10BPC: | ||
5041 | pipe_config->pipe_bpp = 30; | ||
5042 | break; | ||
5043 | default: | ||
5044 | break; | ||
5045 | } | ||
5046 | } | ||
5047 | |||
4986 | intel_get_pipe_timings(crtc, pipe_config); | 5048 | intel_get_pipe_timings(crtc, pipe_config); |
4987 | 5049 | ||
4988 | i9xx_get_pfit_config(crtc, pipe_config); | 5050 | i9xx_get_pfit_config(crtc, pipe_config); |
@@ -5576,48 +5638,6 @@ static bool ironlake_compute_clocks(struct drm_crtc *crtc, | |||
5576 | return true; | 5638 | return true; |
5577 | } | 5639 | } |
5578 | 5640 | ||
5579 | static void cpt_enable_fdi_bc_bifurcation(struct drm_device *dev) | ||
5580 | { | ||
5581 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
5582 | uint32_t temp; | ||
5583 | |||
5584 | temp = I915_READ(SOUTH_CHICKEN1); | ||
5585 | if (temp & FDI_BC_BIFURCATION_SELECT) | ||
5586 | return; | ||
5587 | |||
5588 | WARN_ON(I915_READ(FDI_RX_CTL(PIPE_B)) & FDI_RX_ENABLE); | ||
5589 | WARN_ON(I915_READ(FDI_RX_CTL(PIPE_C)) & FDI_RX_ENABLE); | ||
5590 | |||
5591 | temp |= FDI_BC_BIFURCATION_SELECT; | ||
5592 | DRM_DEBUG_KMS("enabling fdi C rx\n"); | ||
5593 | I915_WRITE(SOUTH_CHICKEN1, temp); | ||
5594 | POSTING_READ(SOUTH_CHICKEN1); | ||
5595 | } | ||
5596 | |||
5597 | static void ivybridge_update_fdi_bc_bifurcation(struct intel_crtc *intel_crtc) | ||
5598 | { | ||
5599 | struct drm_device *dev = intel_crtc->base.dev; | ||
5600 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
5601 | |||
5602 | switch (intel_crtc->pipe) { | ||
5603 | case PIPE_A: | ||
5604 | break; | ||
5605 | case PIPE_B: | ||
5606 | if (intel_crtc->config.fdi_lanes > 2) | ||
5607 | WARN_ON(I915_READ(SOUTH_CHICKEN1) & FDI_BC_BIFURCATION_SELECT); | ||
5608 | else | ||
5609 | cpt_enable_fdi_bc_bifurcation(dev); | ||
5610 | |||
5611 | break; | ||
5612 | case PIPE_C: | ||
5613 | cpt_enable_fdi_bc_bifurcation(dev); | ||
5614 | |||
5615 | break; | ||
5616 | default: | ||
5617 | BUG(); | ||
5618 | } | ||
5619 | } | ||
5620 | |||
5621 | int ironlake_get_lanes_required(int target_clock, int link_bw, int bpp) | 5641 | int ironlake_get_lanes_required(int target_clock, int link_bw, int bpp) |
5622 | { | 5642 | { |
5623 | /* | 5643 | /* |
@@ -5811,9 +5831,6 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc, | |||
5811 | &intel_crtc->config.fdi_m_n); | 5831 | &intel_crtc->config.fdi_m_n); |
5812 | } | 5832 | } |
5813 | 5833 | ||
5814 | if (IS_IVYBRIDGE(dev)) | ||
5815 | ivybridge_update_fdi_bc_bifurcation(intel_crtc); | ||
5816 | |||
5817 | ironlake_set_pipeconf(crtc); | 5834 | ironlake_set_pipeconf(crtc); |
5818 | 5835 | ||
5819 | /* Set up the display plane register */ | 5836 | /* Set up the display plane register */ |
@@ -5881,6 +5898,23 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc, | |||
5881 | if (!(tmp & PIPECONF_ENABLE)) | 5898 | if (!(tmp & PIPECONF_ENABLE)) |
5882 | return false; | 5899 | return false; |
5883 | 5900 | ||
5901 | switch (tmp & PIPECONF_BPC_MASK) { | ||
5902 | case PIPECONF_6BPC: | ||
5903 | pipe_config->pipe_bpp = 18; | ||
5904 | break; | ||
5905 | case PIPECONF_8BPC: | ||
5906 | pipe_config->pipe_bpp = 24; | ||
5907 | break; | ||
5908 | case PIPECONF_10BPC: | ||
5909 | pipe_config->pipe_bpp = 30; | ||
5910 | break; | ||
5911 | case PIPECONF_12BPC: | ||
5912 | pipe_config->pipe_bpp = 36; | ||
5913 | break; | ||
5914 | default: | ||
5915 | break; | ||
5916 | } | ||
5917 | |||
5884 | if (I915_READ(PCH_TRANSCONF(crtc->pipe)) & TRANS_ENABLE) { | 5918 | if (I915_READ(PCH_TRANSCONF(crtc->pipe)) & TRANS_ENABLE) { |
5885 | struct intel_shared_dpll *pll; | 5919 | struct intel_shared_dpll *pll; |
5886 | 5920 | ||
@@ -8612,6 +8646,9 @@ intel_pipe_config_compare(struct drm_device *dev, | |||
8612 | PIPE_CONF_CHECK_X(dpll_hw_state.fp0); | 8646 | PIPE_CONF_CHECK_X(dpll_hw_state.fp0); |
8613 | PIPE_CONF_CHECK_X(dpll_hw_state.fp1); | 8647 | PIPE_CONF_CHECK_X(dpll_hw_state.fp1); |
8614 | 8648 | ||
8649 | if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5) | ||
8650 | PIPE_CONF_CHECK_I(pipe_bpp); | ||
8651 | |||
8615 | #undef PIPE_CONF_CHECK_X | 8652 | #undef PIPE_CONF_CHECK_X |
8616 | #undef PIPE_CONF_CHECK_I | 8653 | #undef PIPE_CONF_CHECK_I |
8617 | #undef PIPE_CONF_CHECK_FLAGS | 8654 | #undef PIPE_CONF_CHECK_FLAGS |