aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_display.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/i915/intel_display.c')
-rw-r--r--drivers/gpu/drm/i915/intel_display.c133
1 files changed, 50 insertions, 83 deletions
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 40a8f59fa418..f34252d134b6 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2421,9 +2421,10 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc)
2421 FDI_FE_ERRC_ENABLE); 2421 FDI_FE_ERRC_ENABLE);
2422} 2422}
2423 2423
2424static bool pipe_has_enabled_pch(struct intel_crtc *intel_crtc) 2424static bool pipe_has_enabled_pch(struct intel_crtc *crtc)
2425{ 2425{
2426 return intel_crtc->base.enabled && intel_crtc->config.has_pch_encoder; 2426 return crtc->base.enabled && crtc->active &&
2427 crtc->config.has_pch_encoder;
2427} 2428}
2428 2429
2429static void ivb_modeset_global_resources(struct drm_device *dev) 2430static void ivb_modeset_global_resources(struct drm_device *dev)
@@ -3074,6 +3075,48 @@ static void ironlake_pch_transcoder_set_timings(struct intel_crtc *crtc,
3074 I915_READ(VSYNCSHIFT(cpu_transcoder))); 3075 I915_READ(VSYNCSHIFT(cpu_transcoder)));
3075} 3076}
3076 3077
3078static void cpt_enable_fdi_bc_bifurcation(struct drm_device *dev)
3079{
3080 struct drm_i915_private *dev_priv = dev->dev_private;
3081 uint32_t temp;
3082
3083 temp = I915_READ(SOUTH_CHICKEN1);
3084 if (temp & FDI_BC_BIFURCATION_SELECT)
3085 return;
3086
3087 WARN_ON(I915_READ(FDI_RX_CTL(PIPE_B)) & FDI_RX_ENABLE);
3088 WARN_ON(I915_READ(FDI_RX_CTL(PIPE_C)) & FDI_RX_ENABLE);
3089
3090 temp |= FDI_BC_BIFURCATION_SELECT;
3091 DRM_DEBUG_KMS("enabling fdi C rx\n");
3092 I915_WRITE(SOUTH_CHICKEN1, temp);
3093 POSTING_READ(SOUTH_CHICKEN1);
3094}
3095
3096static void ivybridge_update_fdi_bc_bifurcation(struct intel_crtc *intel_crtc)
3097{
3098 struct drm_device *dev = intel_crtc->base.dev;
3099 struct drm_i915_private *dev_priv = dev->dev_private;
3100
3101 switch (intel_crtc->pipe) {
3102 case PIPE_A:
3103 break;
3104 case PIPE_B:
3105 if (intel_crtc->config.fdi_lanes > 2)
3106 WARN_ON(I915_READ(SOUTH_CHICKEN1) & FDI_BC_BIFURCATION_SELECT);
3107 else
3108 cpt_enable_fdi_bc_bifurcation(dev);
3109
3110 break;
3111 case PIPE_C:
3112 cpt_enable_fdi_bc_bifurcation(dev);
3113
3114 break;
3115 default:
3116 BUG();
3117 }
3118}
3119
3077/* 3120/*
3078 * Enable PCH resources required for PCH ports: 3121 * Enable PCH resources required for PCH ports:
3079 * - PCH PLLs 3122 * - PCH PLLs
@@ -3092,6 +3135,9 @@ static void ironlake_pch_enable(struct drm_crtc *crtc)
3092 3135
3093 assert_pch_transcoder_disabled(dev_priv, pipe); 3136 assert_pch_transcoder_disabled(dev_priv, pipe);
3094 3137
3138 if (IS_IVYBRIDGE(dev))
3139 ivybridge_update_fdi_bc_bifurcation(intel_crtc);
3140
3095 /* Write the TU size bits before fdi link training, so that error 3141 /* Write the TU size bits before fdi link training, so that error
3096 * detection works. */ 3142 * detection works. */
3097 I915_WRITE(FDI_RX_TUSIZE1(pipe), 3143 I915_WRITE(FDI_RX_TUSIZE1(pipe),
@@ -4156,8 +4202,6 @@ static void intel_connector_check_state(struct intel_connector *connector)
4156 * consider. */ 4202 * consider. */
4157void intel_connector_dpms(struct drm_connector *connector, int mode) 4203void intel_connector_dpms(struct drm_connector *connector, int mode)
4158{ 4204{
4159 struct intel_encoder *encoder = intel_attached_encoder(connector);
4160
4161 /* All the simple cases only support two dpms states. */ 4205 /* All the simple cases only support two dpms states. */
4162 if (mode != DRM_MODE_DPMS_ON) 4206 if (mode != DRM_MODE_DPMS_ON)
4163 mode = DRM_MODE_DPMS_OFF; 4207 mode = DRM_MODE_DPMS_OFF;
@@ -4168,10 +4212,8 @@ void intel_connector_dpms(struct drm_connector *connector, int mode)
4168 connector->dpms = mode; 4212 connector->dpms = mode;
4169 4213
4170 /* Only need to change hw state when actually enabled */ 4214 /* Only need to change hw state when actually enabled */
4171 if (encoder->base.crtc) 4215 if (connector->encoder)
4172 intel_encoder_dpms(encoder, mode); 4216 intel_encoder_dpms(to_intel_encoder(connector->encoder), mode);
4173 else
4174 WARN_ON(encoder->connectors_active != false);
4175 4217
4176 intel_modeset_check_state(connector->dev); 4218 intel_modeset_check_state(connector->dev);
4177} 4219}
@@ -5849,48 +5891,6 @@ static bool ironlake_compute_clocks(struct drm_crtc *crtc,
5849 return true; 5891 return true;
5850} 5892}
5851 5893
5852static void cpt_enable_fdi_bc_bifurcation(struct drm_device *dev)
5853{
5854 struct drm_i915_private *dev_priv = dev->dev_private;
5855 uint32_t temp;
5856
5857 temp = I915_READ(SOUTH_CHICKEN1);
5858 if (temp & FDI_BC_BIFURCATION_SELECT)
5859 return;
5860
5861 WARN_ON(I915_READ(FDI_RX_CTL(PIPE_B)) & FDI_RX_ENABLE);
5862 WARN_ON(I915_READ(FDI_RX_CTL(PIPE_C)) & FDI_RX_ENABLE);
5863
5864 temp |= FDI_BC_BIFURCATION_SELECT;
5865 DRM_DEBUG_KMS("enabling fdi C rx\n");
5866 I915_WRITE(SOUTH_CHICKEN1, temp);
5867 POSTING_READ(SOUTH_CHICKEN1);
5868}
5869
5870static void ivybridge_update_fdi_bc_bifurcation(struct intel_crtc *intel_crtc)
5871{
5872 struct drm_device *dev = intel_crtc->base.dev;
5873 struct drm_i915_private *dev_priv = dev->dev_private;
5874
5875 switch (intel_crtc->pipe) {
5876 case PIPE_A:
5877 break;
5878 case PIPE_B:
5879 if (intel_crtc->config.fdi_lanes > 2)
5880 WARN_ON(I915_READ(SOUTH_CHICKEN1) & FDI_BC_BIFURCATION_SELECT);
5881 else
5882 cpt_enable_fdi_bc_bifurcation(dev);
5883
5884 break;
5885 case PIPE_C:
5886 cpt_enable_fdi_bc_bifurcation(dev);
5887
5888 break;
5889 default:
5890 BUG();
5891 }
5892}
5893
5894int ironlake_get_lanes_required(int target_clock, int link_bw, int bpp) 5894int ironlake_get_lanes_required(int target_clock, int link_bw, int bpp)
5895{ 5895{
5896 /* 5896 /*
@@ -6079,9 +6079,6 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
6079 &intel_crtc->config.fdi_m_n); 6079 &intel_crtc->config.fdi_m_n);
6080 } 6080 }
6081 6081
6082 if (IS_IVYBRIDGE(dev))
6083 ivybridge_update_fdi_bc_bifurcation(intel_crtc);
6084
6085 ironlake_set_pipeconf(crtc); 6082 ironlake_set_pipeconf(crtc);
6086 6083
6087 /* Set up the display plane register */ 6084 /* Set up the display plane register */
@@ -10498,33 +10495,6 @@ static void i915_disable_vga(struct drm_device *dev)
10498 POSTING_READ(vga_reg); 10495 POSTING_READ(vga_reg);
10499} 10496}
10500 10497
10501static void i915_enable_vga_mem(struct drm_device *dev)
10502{
10503 /* Enable VGA memory on Intel HD */
10504 if (HAS_PCH_SPLIT(dev)) {
10505 vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO);
10506 outb(inb(VGA_MSR_READ) | VGA_MSR_MEM_EN, VGA_MSR_WRITE);
10507 vga_set_legacy_decoding(dev->pdev, VGA_RSRC_LEGACY_IO |
10508 VGA_RSRC_LEGACY_MEM |
10509 VGA_RSRC_NORMAL_IO |
10510 VGA_RSRC_NORMAL_MEM);
10511 vga_put(dev->pdev, VGA_RSRC_LEGACY_IO);
10512 }
10513}
10514
10515void i915_disable_vga_mem(struct drm_device *dev)
10516{
10517 /* Disable VGA memory on Intel HD */
10518 if (HAS_PCH_SPLIT(dev)) {
10519 vga_get_uninterruptible(dev->pdev, VGA_RSRC_LEGACY_IO);
10520 outb(inb(VGA_MSR_READ) & ~VGA_MSR_MEM_EN, VGA_MSR_WRITE);
10521 vga_set_legacy_decoding(dev->pdev, VGA_RSRC_LEGACY_IO |
10522 VGA_RSRC_NORMAL_IO |
10523 VGA_RSRC_NORMAL_MEM);
10524 vga_put(dev->pdev, VGA_RSRC_LEGACY_IO);
10525 }
10526}
10527
10528void intel_modeset_init_hw(struct drm_device *dev) 10498void intel_modeset_init_hw(struct drm_device *dev)
10529{ 10499{
10530 struct drm_i915_private *dev_priv = dev->dev_private; 10500 struct drm_i915_private *dev_priv = dev->dev_private;
@@ -10810,7 +10780,6 @@ void i915_redisable_vga(struct drm_device *dev)
10810 if (!(I915_READ(vga_reg) & VGA_DISP_DISABLE)) { 10780 if (!(I915_READ(vga_reg) & VGA_DISP_DISABLE)) {
10811 DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n"); 10781 DRM_DEBUG_KMS("Something enabled VGA plane, disabling it\n");
10812 i915_disable_vga(dev); 10782 i915_disable_vga(dev);
10813 i915_disable_vga_mem(dev);
10814 } 10783 }
10815} 10784}
10816 10785
@@ -11017,8 +10986,6 @@ void intel_modeset_cleanup(struct drm_device *dev)
11017 10986
11018 intel_disable_fbc(dev); 10987 intel_disable_fbc(dev);
11019 10988
11020 i915_enable_vga_mem(dev);
11021
11022 intel_disable_gt_powersave(dev); 10989 intel_disable_gt_powersave(dev);
11023 10990
11024 ironlake_teardown_rc6(dev); 10991 ironlake_teardown_rc6(dev);