|
@@ -2327,9 +2327,10 @@ static void intel_fdi_normal_train(struct drm_crtc *crtc)
|
|
|
FDI_FE_ERRC_ENABLE);
|
|
|
}
|
|
|
|
|
|
-static bool pipe_has_enabled_pch(struct intel_crtc *intel_crtc)
|
|
|
+static bool pipe_has_enabled_pch(struct intel_crtc *crtc)
|
|
|
{
|
|
|
- return intel_crtc->base.enabled && intel_crtc->config.has_pch_encoder;
|
|
|
+ return crtc->base.enabled && crtc->active &&
|
|
|
+ crtc->config.has_pch_encoder;
|
|
|
}
|
|
|
|
|
|
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,
|
|
|
I915_READ(VSYNCSHIFT(cpu_transcoder)));
|
|
|
}
|
|
|
|
|
|
+static void cpt_enable_fdi_bc_bifurcation(struct drm_device *dev)
|
|
|
+{
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+ uint32_t temp;
|
|
|
+
|
|
|
+ temp = I915_READ(SOUTH_CHICKEN1);
|
|
|
+ if (temp & FDI_BC_BIFURCATION_SELECT)
|
|
|
+ return;
|
|
|
+
|
|
|
+ WARN_ON(I915_READ(FDI_RX_CTL(PIPE_B)) & FDI_RX_ENABLE);
|
|
|
+ WARN_ON(I915_READ(FDI_RX_CTL(PIPE_C)) & FDI_RX_ENABLE);
|
|
|
+
|
|
|
+ temp |= FDI_BC_BIFURCATION_SELECT;
|
|
|
+ DRM_DEBUG_KMS("enabling fdi C rx\n");
|
|
|
+ I915_WRITE(SOUTH_CHICKEN1, temp);
|
|
|
+ POSTING_READ(SOUTH_CHICKEN1);
|
|
|
+}
|
|
|
+
|
|
|
+static void ivybridge_update_fdi_bc_bifurcation(struct intel_crtc *intel_crtc)
|
|
|
+{
|
|
|
+ struct drm_device *dev = intel_crtc->base.dev;
|
|
|
+ struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
+
|
|
|
+ switch (intel_crtc->pipe) {
|
|
|
+ case PIPE_A:
|
|
|
+ break;
|
|
|
+ case PIPE_B:
|
|
|
+ if (intel_crtc->config.fdi_lanes > 2)
|
|
|
+ WARN_ON(I915_READ(SOUTH_CHICKEN1) & FDI_BC_BIFURCATION_SELECT);
|
|
|
+ else
|
|
|
+ cpt_enable_fdi_bc_bifurcation(dev);
|
|
|
+
|
|
|
+ break;
|
|
|
+ case PIPE_C:
|
|
|
+ cpt_enable_fdi_bc_bifurcation(dev);
|
|
|
+
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ BUG();
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Enable PCH resources required for PCH ports:
|
|
|
* - PCH PLLs
|
|
@@ -2997,6 +3040,9 @@ static void ironlake_pch_enable(struct drm_crtc *crtc)
|
|
|
|
|
|
assert_pch_transcoder_disabled(dev_priv, pipe);
|
|
|
|
|
|
+ if (IS_IVYBRIDGE(dev))
|
|
|
+ ivybridge_update_fdi_bc_bifurcation(intel_crtc);
|
|
|
+
|
|
|
/* Write the TU size bits before fdi link training, so that error
|
|
|
* detection works. */
|
|
|
I915_WRITE(FDI_RX_TUSIZE1(pipe),
|
|
@@ -5592,48 +5638,6 @@ static bool ironlake_compute_clocks(struct drm_crtc *crtc,
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
-static void cpt_enable_fdi_bc_bifurcation(struct drm_device *dev)
|
|
|
-{
|
|
|
- struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
- uint32_t temp;
|
|
|
-
|
|
|
- temp = I915_READ(SOUTH_CHICKEN1);
|
|
|
- if (temp & FDI_BC_BIFURCATION_SELECT)
|
|
|
- return;
|
|
|
-
|
|
|
- WARN_ON(I915_READ(FDI_RX_CTL(PIPE_B)) & FDI_RX_ENABLE);
|
|
|
- WARN_ON(I915_READ(FDI_RX_CTL(PIPE_C)) & FDI_RX_ENABLE);
|
|
|
-
|
|
|
- temp |= FDI_BC_BIFURCATION_SELECT;
|
|
|
- DRM_DEBUG_KMS("enabling fdi C rx\n");
|
|
|
- I915_WRITE(SOUTH_CHICKEN1, temp);
|
|
|
- POSTING_READ(SOUTH_CHICKEN1);
|
|
|
-}
|
|
|
-
|
|
|
-static void ivybridge_update_fdi_bc_bifurcation(struct intel_crtc *intel_crtc)
|
|
|
-{
|
|
|
- struct drm_device *dev = intel_crtc->base.dev;
|
|
|
- struct drm_i915_private *dev_priv = dev->dev_private;
|
|
|
-
|
|
|
- switch (intel_crtc->pipe) {
|
|
|
- case PIPE_A:
|
|
|
- break;
|
|
|
- case PIPE_B:
|
|
|
- if (intel_crtc->config.fdi_lanes > 2)
|
|
|
- WARN_ON(I915_READ(SOUTH_CHICKEN1) & FDI_BC_BIFURCATION_SELECT);
|
|
|
- else
|
|
|
- cpt_enable_fdi_bc_bifurcation(dev);
|
|
|
-
|
|
|
- break;
|
|
|
- case PIPE_C:
|
|
|
- cpt_enable_fdi_bc_bifurcation(dev);
|
|
|
-
|
|
|
- break;
|
|
|
- default:
|
|
|
- BUG();
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
int ironlake_get_lanes_required(int target_clock, int link_bw, int bpp)
|
|
|
{
|
|
|
/*
|
|
@@ -5827,9 +5831,6 @@ static int ironlake_crtc_mode_set(struct drm_crtc *crtc,
|
|
|
&intel_crtc->config.fdi_m_n);
|
|
|
}
|
|
|
|
|
|
- if (IS_IVYBRIDGE(dev))
|
|
|
- ivybridge_update_fdi_bc_bifurcation(intel_crtc);
|
|
|
-
|
|
|
ironlake_set_pipeconf(crtc);
|
|
|
|
|
|
/* Set up the display plane register */
|