|
@@ -1591,9 +1591,27 @@ static void chv_enable_pll(struct intel_crtc *crtc,
|
|
|
if (wait_for(((I915_READ(DPLL(pipe)) & DPLL_LOCK_VLV) == DPLL_LOCK_VLV), 1))
|
|
|
DRM_ERROR("PLL %d failed to lock\n", pipe);
|
|
|
|
|
|
- /* not sure when this should be written */
|
|
|
- I915_WRITE(DPLL_MD(pipe), pipe_config->dpll_hw_state.dpll_md);
|
|
|
- POSTING_READ(DPLL_MD(pipe));
|
|
|
+ if (pipe != PIPE_A) {
|
|
|
+ /*
|
|
|
+ * WaPixelRepeatModeFixForC0:chv
|
|
|
+ *
|
|
|
+ * DPLLCMD is AWOL. Use chicken bits to propagate
|
|
|
+ * the value from DPLLBMD to either pipe B or C.
|
|
|
+ */
|
|
|
+ I915_WRITE(CBR4_VLV, pipe == PIPE_B ? CBR_DPLLBMD_PIPE_B : CBR_DPLLBMD_PIPE_C);
|
|
|
+ I915_WRITE(DPLL_MD(PIPE_B), pipe_config->dpll_hw_state.dpll_md);
|
|
|
+ I915_WRITE(CBR4_VLV, 0);
|
|
|
+ dev_priv->chv_dpll_md[pipe] = pipe_config->dpll_hw_state.dpll_md;
|
|
|
+
|
|
|
+ /*
|
|
|
+ * DPLLB VGA mode also seems to cause problems.
|
|
|
+ * We should always have it disabled.
|
|
|
+ */
|
|
|
+ WARN_ON((I915_READ(DPLL(PIPE_B)) & DPLL_VGA_MODE_DIS) == 0);
|
|
|
+ } else {
|
|
|
+ I915_WRITE(DPLL_MD(pipe), pipe_config->dpll_hw_state.dpll_md);
|
|
|
+ POSTING_READ(DPLL_MD(pipe));
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static int intel_num_dvo_pipes(struct drm_device *dev)
|
|
@@ -8156,7 +8174,11 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
|
|
|
i9xx_get_pfit_config(crtc, pipe_config);
|
|
|
|
|
|
if (INTEL_INFO(dev)->gen >= 4) {
|
|
|
- tmp = I915_READ(DPLL_MD(crtc->pipe));
|
|
|
+ /* No way to read it out on pipes B and C */
|
|
|
+ if (IS_CHERRYVIEW(dev) && crtc->pipe != PIPE_A)
|
|
|
+ tmp = dev_priv->chv_dpll_md[crtc->pipe];
|
|
|
+ else
|
|
|
+ tmp = I915_READ(DPLL_MD(crtc->pipe));
|
|
|
pipe_config->pixel_multiplier =
|
|
|
((tmp & DPLL_MD_UDI_MULTIPLIER_MASK)
|
|
|
>> DPLL_MD_UDI_MULTIPLIER_SHIFT) + 1;
|