From 86f82c429f5d7067c52d3b783988917869e13d1d Mon Sep 17 00:00:00 2001 From: Zhenyu Wang Date: Thu, 11 Sep 2008 15:49:41 +0800 Subject: [PATCH] Disable render standby Render standby is known to cause possible hang issue on some mobile chips, so always disable it. --- src/i810_reg.h | 3 +++ src/i830_driver.c | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 0 deletions(-) diff --git xf86-video-intel-2.4.2/src/i810_reg.h xf86-video-intel-2.4.2/src/i810_reg.h index 8690954..af8c6a3 100644 --- xf86-video-intel-2.4.2/src/i810_reg.h +++ xf86-video-intel-2.4.2/src/i810_reg.h @@ -2815,4 +2815,7 @@ typedef enum { #define PEG_BAND_GAP_DATA 0x14d68 +#define MCHBAR_RENDER_STANDBY 0x111B8 +#define RENDER_STANDBY_ENABLE (1 << 30) + #endif /* _I810_REG_H */ diff --git xf86-video-intel-2.4.2/src/i830_driver.c xf86-video-intel-2.4.2/src/i830_driver.c index 6f87c51..209aa07 100644 --- xf86-video-intel-2.4.2/src/i830_driver.c +++ xf86-video-intel-2.4.2/src/i830_driver.c @@ -2718,6 +2718,23 @@ i830_memory_init(ScrnInfoPtr pScrn) return FALSE; } +static void +i830_disable_render_standby(ScrnInfoPtr pScrn) +{ + I830Ptr pI830 = I830PTR(pScrn); + uint32_t render_standby; + + /* Render Standby might cause hang issue, try always disable it.*/ + if (IS_I965GM(pI830) || IS_GM45(pI830)) { + render_standby = INREG(MCHBAR_RENDER_STANDBY); + if (render_standby & RENDER_STANDBY_ENABLE) { + xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Disable render standby.\n"); + OUTREG(MCHBAR_RENDER_STANDBY, + (render_standby & (~RENDER_STANDBY_ENABLE))); + } + } +} + static Bool I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) { @@ -3053,6 +3070,8 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) if (!vgaHWMapMem(pScrn)) return FALSE; + i830_disable_render_standby(pScrn); + DPRINTF(PFX, "assert( if(!I830EnterVT(scrnIndex, 0)) )\n"); if (!pI830->useEXA) { -- 1.6.0.1