diff options
author | Maxim Levitsky <maximlevitsky@gmail.com> | 2008-03-24 13:24:12 +0800 |
---|---|---|
committer | Zhenyu Wang <zhenyu.z.wang@intel.com> | 2008-03-24 15:06:04 +0800 |
commit | 40744d88b477a27772c541d73311208f47ba562e (patch) | |
tree | 0c81df831e7bef893b82534efe6933158af298f8 | |
parent | 78d260fe9af068ed0445d28f8458850020bc2a8f (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.c | 11 |
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) |