diff --git a/src/i810_reg.h b/src/i810_reg.h index 834b948..b82f45b 100644 --- a/src/i810_reg.h +++ b/src/i810_reg.h @@ -460,6 +460,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * - new bits for i810 * - new register hwstam (mask) */ +#define PWRCTXA 0x2088 /* 965GM+ only */ #define HWSTAM 0x2098 /* p290 */ #define IER 0x20a0 /* p291 */ #define IIR 0x20a4 /* p292 */ diff --git a/src/i830.h b/src/i830.h index 2c6d2b4..659a9a0 100644 --- a/src/i830.h +++ b/src/i830.h @@ -426,6 +426,8 @@ typedef struct _I830Rec { i830_memory *logical_context; + i830_memory *power_context; + #ifdef XF86DRI i830_memory *back_buffer; i830_memory *third_buffer; @@ -766,6 +768,7 @@ void i830_free_memory(ScrnInfoPtr pScrn, i830_memory *mem); extern long I830CheckAvailableMemory(ScrnInfoPtr pScrn); Bool i830_allocate_2d_memory(ScrnInfoPtr pScrn); Bool i830_allocate_texture_memory(ScrnInfoPtr pScrn); +Bool i830_allocate_pwrctx(ScrnInfoPtr pScrn); Bool i830_allocate_3d_memory(ScrnInfoPtr pScrn); #ifdef INTEL_XVMC Bool i830_allocate_xvmc_buffer(ScrnInfoPtr pScrn, const char *name, diff --git a/src/i830_driver.c b/src/i830_driver.c index 6bf3566..625c99c 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -2475,6 +2475,10 @@ i830_try_memory_allocation(ScrnInfoPtr pScrn) if (!i830_allocate_2d_memory(pScrn)) goto failed; + if (IS_I965GM(pI830) || IS_IGD_GM(pI830)) + if (!i830_allocate_pwrctx(pScrn)) + goto failed; + if (dri && !i830_allocate_3d_memory(pScrn)) goto failed; @@ -2796,6 +2800,9 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) return FALSE; } + if (pI830->power_context) + OUTREG(PWRCTXA, pI830->power_context->offset); + I830UnmapMMIO(pScrn); i830_fixup_mtrrs(pScrn); diff --git a/src/i830_memory.c b/src/i830_memory.c index 84db0ef..8dff3c8 100644 --- a/src/i830_memory.c +++ b/src/i830_memory.c @@ -112,6 +112,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. /* Our hardware status area is just a single page */ #define HWSTATUS_PAGE_SIZE GTT_PAGE_SIZE +#define PWRCTX_SIZE GTT_PAGE_SIZE static i830_memory * i830_allocate_aperture(ScrnInfoPtr pScrn, const char *name, @@ -1657,6 +1658,22 @@ i830_allocate_hwstatus(ScrnInfoPtr pScrn) } Bool +i830_allocate_pwrctx(ScrnInfoPtr pScrn) +{ + I830Ptr pI830 = I830PTR(pScrn); + + pI830->power_context = i830_allocate_memory(pScrn, "power context", + PWRCTX_SIZE, GTT_PAGE_SIZE, + NEED_LIFETIME_FIXED); + if (!pI830->power_context) { + xf86DrvMsg(pScrn->scrnIndex, X_WARNING, + "Failed to allocate power context.\n"); + return FALSE; + } + return TRUE; +} + +Bool i830_allocate_3d_memory(ScrnInfoPtr pScrn) { I830Ptr pI830 = I830PTR(pScrn);