From a993a8f3ce3a2079c5b5ebaca2ec2564047d7d4e Mon Sep 17 00:00:00 2001 From: Tomas Carnecky Date: Fri, 6 Jun 2008 10:03:23 +0800 Subject: [PATCH 1/5] Fix compile error in LeaveVT --- src/i830_driver.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/i830_driver.c b/src/i830_driver.c index 03bfe7e0..b28b4de8 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -3225,6 +3225,7 @@ I830LeaveVT(int scrnIndex, int flags) ScrnInfoPtr pScrn = xf86Screens[scrnIndex]; I830Ptr pI830 = I830PTR(pScrn); #ifndef HAVE_FREE_SHADOW + xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn); int o; #endif From 64a8f2433d7774d06119793b57cec6d3be6389c1 Mon Sep 17 00:00:00 2001 From: Robert Lowery Date: Tue, 20 May 2008 21:09:23 +1000 Subject: [PATCH 2/5] Fix TV out connection type detection Make sure we wait for vblank when using the TV DAC to detect the connection type. Fixes FDO bug #14000. --- src/i830_tv.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/i830_tv.c b/src/i830_tv.c index 6adb9f2f..2fc6199b 100644 --- a/src/i830_tv.c +++ b/src/i830_tv.c @@ -1303,6 +1303,7 @@ i830_tv_detect_type (xf86CrtcPtr crtc, tv_dac = INREG(TV_DAC); OUTREG(TV_DAC, save_tv_dac); OUTREG(TV_CTL, save_tv_ctl); + i830WaitForVblank(pScrn); } /* * A B C From 1142be53eb8d2ee8a9b60ace5d49f0ba27332275 Mon Sep 17 00:00:00 2001 From: Jesse Barnes Date: Mon, 9 Jun 2008 08:52:59 -0700 Subject: [PATCH 3/5] Fix TV programming: add vblank wait after TV_CTL writes Fxies FDO bug #14000; we need to wait for vblank after writing TV_CTL or followi ng "DPMS on" calls may not actually enable the output. --- src/i830_tv.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/i830_tv.c b/src/i830_tv.c index 2fc6199b..cde929a7 100644 --- a/src/i830_tv.c +++ b/src/i830_tv.c @@ -788,6 +788,7 @@ i830_tv_dpms(xf86OutputPtr output, int mode) OUTREG(TV_CTL, INREG(TV_CTL) & ~TV_ENC_ENABLE); break; } + i830WaitForVblank(pScrn); } static void @@ -920,6 +921,7 @@ i830_tv_restore(xf86OutputPtr output) OUTREG(TV_DAC, dev_priv->save_TV_DAC); OUTREG(TV_CTL, dev_priv->save_TV_CTL); + i830WaitForVblank(pScrn); } static const tv_mode_t * @@ -1237,6 +1239,7 @@ i830_tv_mode_set(xf86OutputPtr output, DisplayModePtr mode, OUTREG(TV_V_CHROMA_0 + (i<<2), tv_mode->filter_table[j++]); OUTREG(TV_DAC, 0); OUTREG(TV_CTL, tv_ctl); + i830WaitForVblank(pScrn); } static const DisplayModeRec reported_modes[] = { From 231a302013981cc597ba09ee89b367c8ab56e8ba Mon Sep 17 00:00:00 2001 From: Bryce Harrington Date: Tue, 10 Jun 2008 14:10:39 +0800 Subject: [PATCH 4/5] Two more Dell quirks fd.o #16160 --- src/i830_quirks.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/i830_quirks.c b/src/i830_quirks.c index b1c14238..1bd8885c 100644 --- a/src/i830_quirks.c +++ b/src/i830_quirks.c @@ -237,6 +237,8 @@ static i830_quirk i830_quirk_list[] = { { PCI_CHIP_I965_GM, 0x1028, 0x0256, quirk_ignore_tv }, /* Dell Inspiron 1318 */ { PCI_CHIP_I965_GM, 0x1028, 0x0286, quirk_ignore_tv }, + /* Dell Vostro A840 (LP: #235155) */ + { PCI_CHIP_I965_GM, 0x1028, 0x0298, quirk_ignore_tv }, /* Lenovo Napa TV (use dmi)*/ { PCI_CHIP_I945_GM, 0x17aa, SUBSYS_ANY, quirk_lenovo_tv_dmi }, @@ -272,6 +274,8 @@ static i830_quirk i830_quirk_list[] = { { PCI_CHIP_I855_GM, 0x1028, 0x0139, quirk_pipea_force }, /* Dell Latitude D500 needs pipe A force quirk */ { PCI_CHIP_I855_GM, 0x1028, 0x0152, quirk_pipea_force }, + /* Dell Latitude D505 needs pipe A force quirk (LP: #235643) */ + { PCI_CHIP_I855_GM, 0x1028, 0x0163, quirk_pipea_force }, /* Dell Latitude X300 needs pipe A force quirk */ { PCI_CHIP_I855_GM, 0x1028, 0x014f, quirk_pipea_force }, /* Dell Inspiron 510m needs pipe A force quirk */ From 79f94ee3c4652019395b9c329d94f7779c558571 Mon Sep 17 00:00:00 2001 From: Eric Anholt Date: Tue, 10 Jun 2008 11:31:22 -0700 Subject: [PATCH 5/5] 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. --- src/i830.h | 1 + src/i830_driver.c | 16 ++++++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/i830.h b/src/i830.h index 62e645ab..2a804abb 100644 --- a/src/i830.h +++ b/src/i830.h @@ -653,6 +653,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 b28b4de8..091b5ca6 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -2099,6 +2099,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); @@ -2165,6 +2168,10 @@ RestoreHWState(ScrnInfoPtr pScrn) OUTREG(RENCLK_GATE_D2, pI830->saveRENCLK_GATE_D2); 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, @@ -2896,9 +2903,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); @@ -3367,6 +3371,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); @@ -3522,9 +3529,6 @@ I830CloseScreen(int scrnIndex, ScreenPtr pScreen) } #endif - if (IS_I965GM(pI830) || IS_IGD_GM(pI830)) - OUTREG(PWRCTXA, 0); - if (I830IsPrimary(pScrn)) { xf86GARTCloseScreen(scrnIndex);