diff options
Diffstat (limited to 'x11-drivers/xf86-video-i810/files/2.3.1/0024-Set-up-restore-PWRCTXA-from-enter-leavevt-not-server.patch')
-rw-r--r-- | x11-drivers/xf86-video-i810/files/2.3.1/0024-Set-up-restore-PWRCTXA-from-enter-leavevt-not-server.patch | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/x11-drivers/xf86-video-i810/files/2.3.1/0024-Set-up-restore-PWRCTXA-from-enter-leavevt-not-server.patch b/x11-drivers/xf86-video-i810/files/2.3.1/0024-Set-up-restore-PWRCTXA-from-enter-leavevt-not-server.patch new file mode 100644 index 000000000000..e1f9c08edac6 --- /dev/null +++ b/x11-drivers/xf86-video-i810/files/2.3.1/0024-Set-up-restore-PWRCTXA-from-enter-leavevt-not-server.patch @@ -0,0 +1,77 @@ +From d3df74ebb0b61cda347e5e4754f2fc8a4c3110b0 Mon Sep 17 00:00:00 2001 +From: Eric Anholt <eric@anholt.net> +Date: Tue, 10 Jun 2008 11:31:22 -0700 +Subject: [PATCH] Set up/restore PWRCTXA from enter/leavevt not server start/exit. + +This should improve behavior in the presence of VT switching, but also avoids +a crash on X exit from writing the register after unmapping mmio. + +diff --git a/src/i830.h b/src/i830.h +index a96fa5b..def693f 100644 +--- a/src/i830.h ++++ b/src/i830.h +@@ -649,6 +649,7 @@ typedef struct _I830Rec { + uint32_t saveRENCLK_GATE_D2; + uint32_t saveDSPCLK_GATE_D; + uint32_t saveRAMCLK_GATE_D; ++ uint32_t savePWRCTXA; + + enum last_3d *last_3d; + +diff --git a/src/i830_driver.c b/src/i830_driver.c +index cff1fe8..563d167 100644 +--- a/src/i830_driver.c ++++ b/src/i830_driver.c +@@ -2069,6 +2069,9 @@ SaveHWState(ScrnInfoPtr pScrn) + pI830->saveRAMCLK_GATE_D = INREG(RAMCLK_GATE_D); + } + ++ if (IS_I965GM(pI830) || IS_IGD_GM(pI830)) ++ pI830->savePWRCTXA = INREG(PWRCTXA); ++ + if (IS_MOBILE(pI830) && !IS_I830(pI830)) + pI830->saveLVDS = INREG(LVDS); + pI830->savePFIT_CONTROL = INREG(PFIT_CONTROL); +@@ -2134,6 +2137,9 @@ RestoreHWState(ScrnInfoPtr pScrn) + OUTREG(RAMCLK_GATE_D, pI830->saveRAMCLK_GATE_D); + } + ++ if (IS_I965GM(pI830) || IS_IGD_GM(pI830)) ++ OUTREG(PWRCTXA, pI830->savePWRCTXA); ++ + /* + * Pipe regs + * To restore the saved state, we first need to program the PLL regs, +@@ -2846,9 +2852,6 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) + return FALSE; + } + +- if (pI830->power_context) +- OUTREG(PWRCTXA, pI830->power_context->offset | PWRCTX_EN); +- + I830UnmapMMIO(pScrn); + + i830_fixup_mtrrs(pScrn); +@@ -3304,6 +3307,9 @@ I830EnterVT(int scrnIndex, int flags) + + i830_init_clock_gating(pScrn); + ++ if (pI830->power_context) ++ OUTREG(PWRCTXA, pI830->power_context->offset | PWRCTX_EN); ++ + /* Clear the framebuffer */ + memset(pI830->FbBase + pScrn->fbOffset, 0, + pScrn->virtualY * pScrn->displayWidth * pI830->cpp); +@@ -3459,9 +3465,6 @@ I830CloseScreen(int scrnIndex, ScreenPtr pScreen) + } + #endif + +- if (IS_I965GM(pI830) || IS_IGD_GM(pI830)) +- OUTREG(PWRCTXA, 0); +- + if (I830IsPrimary(pScrn)) { + xf86GARTCloseScreen(scrnIndex); + +-- +1.5.5.3 + |