summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxim Levitsky <maximlevitsky@gmail.com>2008-03-24 13:24:12 +0800
committerZhenyu Wang <zhenyu.z.wang@intel.com>2008-03-24 15:06:04 +0800
commit40744d88b477a27772c541d73311208f47ba562e (patch)
tree0c81df831e7bef893b82534efe6933158af298f8
parent78d260fe9af068ed0445d28f8458850020bc2a8f (diff)
Fix crash triggered by dpms low power mode with hardware overlay running
When overlay switch crtc, it ignores current crtc dpms mode which might lead to hang.
-rw-r--r--src/i830_video.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/src/i830_video.c b/src/i830_video.c
index 0d0a9a03..59396349 100644
--- a/src/i830_video.c
+++ b/src/i830_video.c
@@ -385,11 +385,13 @@ i830_overlay_switch_to_crtc (ScrnInfoPtr pScrn, xf86CrtcPtr crtc)
I830CrtcPrivatePtr intel_crtc = crtc->driver_private;
int pipeconf_reg = intel_crtc->pipe == 0 ? PIPEACONF : PIPEBCONF;
- if (!IS_I965G(pI830) && (INREG(pipeconf_reg) & PIPEACONF_DOUBLE_WIDE))
+ /* overlay can't be used on pipe with double wide, and pipe must be enabled. */
+ if ((!IS_I965G(pI830) && (INREG(pipeconf_reg) & PIPEACONF_DOUBLE_WIDE))
+ || (intel_crtc->dpms_mode == DPMSModeOff))
pPriv->overlayOK = FALSE;
else
pPriv->overlayOK = TRUE;
-
+
if (!pPriv->overlayOK)
return;
@@ -1829,10 +1831,11 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
if (crtc != pPriv->current_crtc)
{
- pPriv->current_crtc = crtc;
i830_overlay_switch_to_crtc (pScrn, crtc);
- if (pPriv->overlayOK)
+ if (pPriv->overlayOK) {
+ pPriv->current_crtc = crtc;
I830ResetVideo (pScrn);
+ }
}
if (!pPriv->overlayOK)