diff --git a/src/i830.h b/src/i830.h index 00a5059..6017815 100644 --- a/src/i830.h +++ b/src/i830.h @@ -654,6 +654,7 @@ typedef struct _I830Rec { uint32_t saveRENCLK_GATE_D2; uint32_t saveDSPCLK_GATE_D; uint32_t saveRAMCLK_GATE_D; + uint32_t saveCACHE_MODE_0; uint32_t savePWRCTXA; enum last_3d *last_3d; diff --git a/src/i830_driver.c b/src/i830_driver.c index 28505c8..62bafd6 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -2143,6 +2143,9 @@ SaveHWState(ScrnInfoPtr pScrn) pI830->saveRAMCLK_GATE_D = INREG(RAMCLK_GATE_D); } + if (IS_I965GM(pI830)) + pI830->saveCACHE_MODE_0 = INREG(CACHE_MODE_0); + if (IS_I965GM(pI830) || IS_IGD_GM(pI830)) pI830->savePWRCTXA = INREG(PWRCTXA); @@ -2208,6 +2211,9 @@ RestoreHWState(ScrnInfoPtr pScrn) OUTREG(DSPCLK_GATE_D, pI830->saveDSPCLK_GATE_D); OUTREG(RENCLK_GATE_D1, pI830->saveRENCLK_GATE_D1); + if (IS_I965GM(pI830)) + OUTREG(CACHE_MODE_0, pI830->saveCACHE_MODE_0); + if (IS_I965G(pI830)) { OUTREG(RENCLK_GATE_D2, pI830->saveRENCLK_GATE_D2); OUTREG(RAMCLK_GATE_D, pI830->saveRAMCLK_GATE_D); @@ -3415,6 +3421,9 @@ I830EnterVT(int scrnIndex, int flags) i830_init_clock_gating(pScrn); + if (IS_I965GM(pI830)) + OUTREG(CACHE_MODE_0, 0x6801); /* enable RC workaround */ + if (pI830->power_context) OUTREG(PWRCTXA, pI830->power_context->offset | PWRCTX_EN);