|
@@ -3604,6 +3604,30 @@ static void intel_crtc_dpms_overlay(struct intel_crtc *intel_crtc, bool enable)
|
|
|
*/
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * i9xx_fixup_plane - ugly workaround for G45 to fire up the hardware
|
|
|
+ * cursor plane briefly if not already running after enabling the display
|
|
|
+ * plane.
|
|
|
+ * This workaround avoids occasional blank screens when self refresh is
|
|
|
+ * enabled.
|
|
|
+ */
|
|
|
+static void
|
|
|
+g4x_fixup_plane(struct drm_i915_private *dev_priv, enum pipe pipe)
|
|
|
+{
|
|
|
+ u32 cntl = I915_READ(CURCNTR(pipe));
|
|
|
+
|
|
|
+ if ((cntl & CURSOR_MODE) == 0) {
|
|
|
+ u32 fw_bcl_self = I915_READ(FW_BLC_SELF);
|
|
|
+
|
|
|
+ I915_WRITE(FW_BLC_SELF, fw_bcl_self & ~FW_BLC_SELF_EN);
|
|
|
+ I915_WRITE(CURCNTR(pipe), CURSOR_MODE_64_ARGB_AX);
|
|
|
+ intel_wait_for_vblank(dev_priv->dev, pipe);
|
|
|
+ I915_WRITE(CURCNTR(pipe), cntl);
|
|
|
+ I915_WRITE(CURBASE(pipe), I915_READ(CURBASE(pipe)));
|
|
|
+ I915_WRITE(FW_BLC_SELF, fw_bcl_self);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void i9xx_crtc_enable(struct drm_crtc *crtc)
|
|
|
{
|
|
|
struct drm_device *dev = crtc->dev;
|
|
@@ -3629,6 +3653,8 @@ static void i9xx_crtc_enable(struct drm_crtc *crtc)
|
|
|
|
|
|
intel_enable_pipe(dev_priv, pipe, false);
|
|
|
intel_enable_plane(dev_priv, plane, pipe);
|
|
|
+ if (IS_G4X(dev))
|
|
|
+ g4x_fixup_plane(dev_priv, pipe);
|
|
|
|
|
|
intel_crtc_load_lut(crtc);
|
|
|
intel_update_fbc(dev);
|