summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2008-06-10 11:32:49 -0700
committerEric Anholt <eric@anholt.net>2008-06-10 11:32:49 -0700
commitd0fda9d24c5fe4870cdbd2ba0213091165666a8e (patch)
treeca1597e07d65cacf555ebca1b526cb2d5785a2d9
parentcc98d41df63f1ee2561440fab3aa471a80a12920 (diff)
parent79f94ee3c4652019395b9c329d94f7779c558571 (diff)
Merge branch 'master' into drm-gem
-rw-r--r--src/i830.h1
-rw-r--r--src/i830_driver.c16
-rw-r--r--src/i830_quirks.c4
-rw-r--r--src/i830_tv.c4
4 files changed, 19 insertions, 6 deletions
diff --git a/src/i830.h b/src/i830.h
index 6c7c2303..9cce5bc9 100644
--- a/src/i830.h
+++ b/src/i830.h
@@ -655,6 +655,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 a04cfbca..35df0c75 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);
@@ -3370,6 +3374,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);
@@ -3517,9 +3524,6 @@ I830CloseScreen(int scrnIndex, ScreenPtr pScreen)
}
#endif
- if (IS_I965GM(pI830) || IS_IGD_GM(pI830))
- OUTREG(PWRCTXA, 0);
-
if (I830IsPrimary(pScrn)) {
xf86GARTCloseScreen(scrnIndex);
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 */
diff --git a/src/i830_tv.c b/src/i830_tv.c
index 6adb9f2f..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[] = {
@@ -1303,6 +1306,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