|
@@ -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),
|
|
@@ -4983,6 +5029,22 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
|
|
|
if (!(tmp & PIPECONF_ENABLE))
|
|
|
return false;
|
|
|
|
|
|
+ if (IS_G4X(dev) || IS_VALLEYVIEW(dev)) {
|
|
|
+ switch (tmp & PIPECONF_BPC_MASK) {
|
|
|
+ case PIPECONF_6BPC:
|
|
|
+ pipe_config->pipe_bpp = 18;
|
|
|
+ break;
|
|
|
+ case PIPECONF_8BPC:
|
|
|
+ pipe_config->pipe_bpp = 24;
|
|
|
+ break;
|
|
|
+ case PIPECONF_10BPC:
|
|
|
+ pipe_config->pipe_bpp = 30;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
intel_get_pipe_timings(crtc, pipe_config);
|
|
|
|
|
|
i9xx_get_pfit_config(crtc, pipe_config);
|
|
@@ -5576,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)
|
|
|
{
|
|
|
/*
|
|
@@ -5811,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 */
|
|
@@ -5881,6 +5898,23 @@ static bool ironlake_get_pipe_config(struct intel_crtc *crtc,
|
|
|
if (!(tmp & PIPECONF_ENABLE))
|
|
|
return false;
|
|
|
|
|
|
+ switch (tmp & PIPECONF_BPC_MASK) {
|
|
|
+ case PIPECONF_6BPC:
|
|
|
+ pipe_config->pipe_bpp = 18;
|
|
|
+ break;
|
|
|
+ case PIPECONF_8BPC:
|
|
|
+ pipe_config->pipe_bpp = 24;
|
|
|
+ break;
|
|
|
+ case PIPECONF_10BPC:
|
|
|
+ pipe_config->pipe_bpp = 30;
|
|
|
+ break;
|
|
|
+ case PIPECONF_12BPC:
|
|
|
+ pipe_config->pipe_bpp = 36;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
if (I915_READ(PCH_TRANSCONF(crtc->pipe)) & TRANS_ENABLE) {
|
|
|
struct intel_shared_dpll *pll;
|
|
|
|
|
@@ -8612,6 +8646,9 @@ intel_pipe_config_compare(struct drm_device *dev,
|
|
|
PIPE_CONF_CHECK_X(dpll_hw_state.fp0);
|
|
|
PIPE_CONF_CHECK_X(dpll_hw_state.fp1);
|
|
|
|
|
|
+ if (IS_G4X(dev) || INTEL_INFO(dev)->gen >= 5)
|
|
|
+ PIPE_CONF_CHECK_I(pipe_bpp);
|
|
|
+
|
|
|
#undef PIPE_CONF_CHECK_X
|
|
|
#undef PIPE_CONF_CHECK_I
|
|
|
#undef PIPE_CONF_CHECK_FLAGS
|