configure.ac | 4 src/bios_reader/bios_dumper.c | 4 src/i810_reg.h | 8 + src/i830.h | 22 ++++- src/i830_accel.c | 2 src/i830_debug.c | 4 src/i830_display.c | 18 ++-- src/i830_driver.c | 143 +++++++++++++++++++--------------- src/i830_lvds.c | 32 ++++++- src/i830_memory.c | 20 ++++ src/i830_quirks.c | 4 src/i830_ring.h | 17 ---- src/i830_sdvo.c | 4 src/i830_tv.c | 4 src/i830_video.c | 20 ++++ src/i915_hwmc.c | 36 ++++++-- src/i915_hwmc.h | 2 src/xvmc/Makefile.am | 5 - src/xvmc/driDrawable.c | 174 ------------------------------------------ src/xvmc/driDrawable.h | 64 --------------- src/xvmc/i915_xvmc.c | 14 --- src/xvmc/intel_xvmc.c | 2 src/xvmc/intel_xvmc.h | 1 23 files changed, 230 insertions(+), 374 deletions(-)
New commits: commit b80bf50f8ebfe70044e66c7e8558e3031ba3cfca Author: Zhenyu Wang <[EMAIL PROTECTED]> Date: Wed Jun 18 10:46:11 2008 +0800 Bump version 2.3.2 diff --git a/configure.ac b/configure.ac index 94562dd..af589de 100644 --- a/configure.ac +++ b/configure.ac @@ -22,7 +22,7 @@ AC_PREREQ(2.57) AC_INIT([xf86-video-intel], - 2.3.1, + 2.3.2, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xf86-video-intel) commit 42a16bd38a0d09e3e6f33b2319b195aeacfa5084 Author: Zhenyu Wang <[EMAIL PROTECTED]> Date: Tue Jun 17 09:46:12 2008 +0800 Fix compiling with server master in LVDS backlight patch (cherry picked from commit 289790c0467d27e96b537598a6589fc6a36da8b8) diff --git a/src/i830_lvds.c b/src/i830_lvds.c index ecb41c9..4f62a2b 100644 --- a/src/i830_lvds.c +++ b/src/i830_lvds.c @@ -1145,6 +1145,8 @@ i830_lvds_set_property(xf86OutputPtr output, Atom property, static Bool i830_lvds_get_property(xf86OutputPtr output, Atom property) { + ScrnInfoPtr pScrn = output->scrn; + I830Ptr pI830 = I830PTR(pScrn); I830OutputPrivatePtr intel_output = output->driver_private; struct i830_lvds_priv *dev_priv = intel_output->dev_priv; int ret; commit 9036c94b28d4f1d65333bc318079f31bf56b3f99 Author: Lukas Hejtmanek <[EMAIL PROTECTED]> Date: Mon Jun 16 02:49:41 2008 +0800 Fix maximum backlight issue (cherry picked from commit 4c4ef27779aebf4df90b6233de05be2bb972de4c) diff --git a/src/i830_lvds.c b/src/i830_lvds.c index 899c6cb..ecb41c9 100644 --- a/src/i830_lvds.c +++ b/src/i830_lvds.c @@ -63,6 +63,9 @@ struct i830_lvds_priv { /* The panel needs dithering enabled */ Bool panel_wants_dither; + /* The panel is in DPMS off */ + Bool dpmsoff; + /* restore backlight to this value */ int backlight_duty_cycle; @@ -334,6 +337,7 @@ i830_lvds_get_backlight_kernel(xf86OutputPtr output) return 0; } + memset(val, 0, sizeof(val)); if (read(fd, val, BACKLIGHT_VALUE_LEN) == -1) goto out_err; @@ -388,6 +392,10 @@ i830SetLVDSPanelPower(xf86OutputPtr output, Bool on) uint32_t pp_status; if (on) { + /* if we're going from on->on, be aware to current level. */ + if ((INREG(PP_CONTROL) & POWER_TARGET_ON) && !dev_priv->dpmsoff) + dev_priv->backlight_duty_cycle = dev_priv->get_backlight(output); + /* * If we're going from off->on we may need to turn on the backlight. * We should use the saved value whenever possible, but on some @@ -405,12 +413,13 @@ i830SetLVDSPanelPower(xf86OutputPtr output, Bool on) } while ((pp_status & PP_ON) == 0); dev_priv->set_backlight(output, dev_priv->backlight_duty_cycle); + dev_priv->dpmsoff = FALSE; } else { /* * Only save the current backlight value if we're going from * on to off. */ - if (INREG(PP_CONTROL) & POWER_TARGET_ON) + if ((INREG(PP_CONTROL) & POWER_TARGET_ON) && !dev_priv->dpmsoff) dev_priv->backlight_duty_cycle = dev_priv->get_backlight(output); dev_priv->set_backlight(output, 0); @@ -418,6 +427,8 @@ i830SetLVDSPanelPower(xf86OutputPtr output, Bool on) do { pp_status = INREG(PP_STATUS); } while (pp_status & PP_ON); + + dev_priv->dpmsoff = TRUE; } } @@ -447,7 +458,8 @@ i830_lvds_save (xf86OutputPtr output) pI830->savePP_CONTROL = INREG(PP_CONTROL); pI830->savePP_CYCLE = INREG(PP_CYCLE); pI830->saveBLC_PWM_CTL = INREG(BLC_PWM_CTL); - dev_priv->backlight_duty_cycle = dev_priv->get_backlight(output); + if ((INREG(PP_CONTROL) & POWER_TARGET_ON) && !dev_priv->dpmsoff) + dev_priv->backlight_duty_cycle = dev_priv->get_backlight(output); } static void @@ -1081,7 +1093,10 @@ i830_lvds_set_property(xf86OutputPtr output, Atom property, "RRConfigureOutputProperty error, %d\n", ret); } /* Set the current value of the backlight property */ - data = dev_priv->get_backlight(output); + if ((INREG(PP_CONTROL) & POWER_TARGET_ON) && !dev_priv->dpmsoff) + data = dev_priv->get_backlight(output); + else + data = dev_priv->backlight_duty_cycle; ret = RRChangeOutputProperty(output->randr_output, backlight_atom, XA_INTEGER, 32, PropModeReplace, 1, &data, FALSE, TRUE); @@ -1140,8 +1155,11 @@ i830_lvds_get_property(xf86OutputPtr output, Atom property) */ if (property == backlight_atom) { int val; - val = dev_priv->get_backlight(output); - dev_priv->backlight_duty_cycle = val; + if ((INREG(PP_CONTROL) & POWER_TARGET_ON) && !dev_priv->dpmsoff) { + val = dev_priv->get_backlight(output); + dev_priv->backlight_duty_cycle = val; + } else + val = dev_priv->backlight_duty_cycle; ret = RRChangeOutputProperty(output->randr_output, backlight_atom, XA_INTEGER, 32, PropModeReplace, 1, &val, FALSE, TRUE); commit df0bbdc7cbb6ff357a81ed28d12e56c9c7d643f7 Author: Zhenyu Wang <[EMAIL PROTECTED]> Date: Thu Jun 12 14:04:41 2008 +0800 Fix compiler warning when disable xvmc config diff --git a/src/i830_memory.c b/src/i830_memory.c index 9ceb254..ccbe7bd 100644 --- a/src/i830_memory.c +++ b/src/i830_memory.c @@ -2020,6 +2020,7 @@ I830CheckAvailableMemory(ScrnInfoPtr pScrn) return maxPages * 4; } +#ifdef INTEL_XVMC /* * Allocate memory for MC compensation */ @@ -2041,3 +2042,4 @@ Bool i830_allocate_xvmc_buffer(ScrnInfoPtr pScrn, const char *name, return TRUE; } +#endif commit d3df74ebb0b61cda347e5e4754f2fc8a4c3110b0 Author: Eric Anholt <[EMAIL PROTECTED]> Date: Tue Jun 10 11:31:22 2008 -0700 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); commit 9d767d62fec724079178844915cd3feb9df93c7e Author: Bryce Harrington <[EMAIL PROTECTED]> Date: Tue Jun 10 14:10:39 2008 +0800 Two more Dell quirks fd.o #16160 (cherry picked from commit 231a302013981cc597ba09ee89b367c8ab56e8ba) diff --git a/src/i830_quirks.c b/src/i830_quirks.c index b1c1423..1bd8885 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 */ commit 9a8d70fe3d1db2e2d34c79b7d0b271127a63e415 Author: Jesse Barnes <[EMAIL PROTECTED]> Date: Mon Jun 9 08:52:59 2008 -0700 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. (cherry picked from commit 1142be53eb8d2ee8a9b60ace5d49f0ba27332275) diff --git a/src/i830_tv.c b/src/i830_tv.c index 2fc6199..cde929a 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[] = { commit 7d9676c8cc309d42c49f82274f7dc43ab327bea3 Author: Robert Lowery <[EMAIL PROTECTED]> Date: Tue May 20 21:09:23 2008 +1000 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. (cherry picked from commit 64a8f2433d7774d06119793b57cec6d3be6389c1) (cherry picked from commit e4e61e8c97c585993b4b69b86350b3987178a47e) diff --git a/src/i830_tv.c b/src/i830_tv.c index 6adb9f2..2fc6199 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 commit 4054725c3cf0956cc1717ad8acc558203a7af40d Author: Eric Anholt <[EMAIL PROTECTED]> Date: Thu Jun 5 14:55:23 2008 -0700 Move debug clock printout from ErrorF to X_INFO. (cherry picked from commit bff180e6cac4452ef491c81855eb12bfa03d0bf3) diff --git a/src/i830_display.c b/src/i830_display.c index 4910d96..df2f1a2 100644 --- a/src/i830_display.c +++ b/src/i830_display.c @@ -241,13 +241,15 @@ static void intel_clock(I830Ptr pI830, int refclk, intel_clock_t *clock) } static void -i830PrintPll(char *prefix, intel_clock_t *clock) +i830PrintPll(ScrnInfoPtr pScrn, char *prefix, intel_clock_t *clock) { - ErrorF("%s: dotclock %d vco %d ((m %d, m1 %d, m2 %d), n %d, (p %d, p1 %d, p2 %d))\n", - prefix, clock->dot, clock->vco, - clock->m, clock->m1, clock->m2, - clock->n, - clock->p, clock->p1, clock->p2); + xf86DrvMsg(pScrn->scrnIndex, X_INFO, + "%s: dotclock %d vco %d ((m %d, m1 %d, m2 %d), n %d, " + "(p %d, p1 %d, p2 %d))\n", + prefix, clock->dot, clock->vco, + clock->m, clock->m1, clock->m2, + clock->n, + clock->p, clock->p1, clock->p2); } /** @@ -1262,7 +1264,7 @@ i830_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, "Adjusted mode for pipe %c:\n", pipe == 0 ? 'A' : 'B'); xf86PrintModeline(pScrn->scrnIndex, adjusted_mode); } - i830PrintPll("chosen", &clock); + i830PrintPll(pScrn, "chosen", &clock); } if (dpll & DPLL_VCO_ENABLE) @@ -1755,7 +1757,7 @@ i830_crtc_clock_get(ScrnInfoPtr pScrn, xf86CrtcPtr crtc) * configuration being accurate, which it isn't necessarily. */ if (0) - i830PrintPll("probed", &clock); + i830PrintPll(pScrn, "probed", &clock); return clock.dot; } commit e520316dd5f7bfdffadfa19b3046ba40ca367219 Author: Eric Anholt <[EMAIL PROTECTED]> Date: Thu Jun 5 14:37:59 2008 -0700 Remove SVG_WORK_CONTROL init. The bit set is now reserved -- used to be a workaround for early revisions. (cherry picked from commit ad459b21b7de4a79552ac155803d5930432fb84b) diff --git a/src/i830_driver.c b/src/i830_driver.c index 33c49e3..cff1fe8 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -3126,13 +3126,6 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) if (serverGeneration == 1) xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); - if (IS_I965G(pI830)) { - /* Enable DAP stateless accesses. - * Required for all i965 steppings. - */ - OUTREG(SVG_WORK_CTL, 0x00000010); - } - pI830->starting = FALSE; pI830->closing = FALSE; pI830->suspended = FALSE; commit 34ce546153ce9dd0571ce0a5cec7a481641fbbdd Author: Eric Anholt <[EMAIL PROTECTED]> Date: Thu Jun 5 14:37:26 2008 -0700 Initialize clock gating from EnterVT and save/restore it appropriately. diff --git a/src/i830.h b/src/i830.h index ca7acc9..a96fa5b 100644 --- a/src/i830.h +++ b/src/i830.h @@ -645,6 +645,10 @@ typedef struct _I830Rec { uint32_t saveFBC_CONTROL2; uint32_t saveFBC_CONTROL; uint32_t saveFBC_FENCE_OFF; + uint32_t saveRENCLK_GATE_D1; + uint32_t saveRENCLK_GATE_D2; + uint32_t saveDSPCLK_GATE_D; + uint32_t saveRAMCLK_GATE_D; enum last_3d *last_3d; diff --git a/src/i830_driver.c b/src/i830_driver.c index 862ddde..33c49e3 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -1499,8 +1499,6 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) i830TakeRegSnapshot(pScrn); - i830_init_clock_gating(pScrn); - if (DEVICE_ID(pI830->PciInfo) == PCI_CHIP_E7221_G) num_pipe = 1; else @@ -2063,6 +2061,14 @@ SaveHWState(ScrnInfoPtr pScrn) pI830->saveSWF[15] = INREG(SWF31); pI830->saveSWF[16] = INREG(SWF32); + pI830->saveDSPCLK_GATE_D = INREG(DSPCLK_GATE_D); + pI830->saveRENCLK_GATE_D1 = INREG(RENCLK_GATE_D1); + + if (IS_I965G(pI830)) { + pI830->saveRENCLK_GATE_D2 = INREG(RENCLK_GATE_D2); + pI830->saveRAMCLK_GATE_D = INREG(RAMCLK_GATE_D); + } + if (IS_MOBILE(pI830) && !IS_I830(pI830)) pI830->saveLVDS = INREG(LVDS); pI830->savePFIT_CONTROL = INREG(PFIT_CONTROL); @@ -2120,6 +2126,14 @@ RestoreHWState(ScrnInfoPtr pScrn) if (!IS_I830(pI830) && !IS_845G(pI830)) OUTREG(PFIT_CONTROL, pI830->savePFIT_CONTROL); + OUTREG(DSPCLK_GATE_D, pI830->saveDSPCLK_GATE_D); + OUTREG(RENCLK_GATE_D1, pI830->saveRENCLK_GATE_D1); + + if (IS_I965G(pI830)) { + OUTREG(RENCLK_GATE_D2, pI830->saveRENCLK_GATE_D2); + OUTREG(RAMCLK_GATE_D, pI830->saveRAMCLK_GATE_D); + } + /* * Pipe regs * To restore the saved state, we first need to program the PLL regs, @@ -3113,13 +3127,6 @@ I830ScreenInit(int scrnIndex, ScreenPtr pScreen, int argc, char **argv) xf86ShowUnusedOptions(pScrn->scrnIndex, pScrn->options); if (IS_I965G(pI830)) { - /* turn off clock gating */ -#if 0 - OUTREG(0x6204, 0x70804000); - OUTREG(0x6208, 0x00000001); -#else - OUTREG(0x6204, 0x70000000); -#endif /* Enable DAP stateless accesses. * Required for all i965 steppings. */ @@ -3302,6 +3309,8 @@ I830EnterVT(int scrnIndex, int flags) /* Tell the BIOS that we're in control of mode setting now. */ i830_init_bios_control(pScrn); + i830_init_clock_gating(pScrn); + /* Clear the framebuffer */ memset(pI830->FbBase + pScrn->fbOffset, 0, pScrn->virtualY * pScrn->displayWidth * pI830->cpp); commit 71befe0581bcc7d75ed982b543bbf575c2f48c37 Author: Eric Anholt <[EMAIL PROTECTED]> Date: Thu Jun 5 14:09:45 2008 -0700 Move BIOS scratch register setup to EnterVT instead of PreInit. We want these to always be set when our driver's in control. They are already appropriately save/restored at leave/entervt. (cherry picked from commit 8061e5ac27a5f61f940bccc940be922999cc1d3f) diff --git a/src/i830.h b/src/i830.h index a7cdb8c..ca7acc9 100644 --- a/src/i830.h +++ b/src/i830.h @@ -554,10 +554,6 @@ typedef struct _I830Rec { Bool StolenOnly; - Bool swfSaved; - uint32_t saveSWF0; - uint32_t saveSWF4; - Bool checkDevices; /* Driver phase/state information */ diff --git a/src/i830_driver.c b/src/i830_driver.c index c53d2c3..862ddde 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -963,6 +963,19 @@ i830_init_clock_gating(ScrnInfoPtr pScrn) } } +static void +i830_init_bios_control(ScrnInfoPtr pScrn) +{ + I830Ptr pI830 = I830PTR(pScrn); + + /* Set "extended desktop" */ + OUTREG(SWF0, INREG(SWF0) | (1 << 21)); + + /* Set "driver loaded", "OS unknown", "APM 1.2" */ + OUTREG(SWF4, (INREG(SWF4) & ~((3 << 19) | (7 << 16))) | + (1 << 23) | (2 << 16)); +} + static int I830LVDSPresent(ScrnInfoPtr pScrn) { @@ -1021,10 +1034,6 @@ PreInitCleanup(ScrnInfoPtr pScrn) if (pI830->entityPrivate) pI830->entityPrivate->pScrn_2 = NULL; } - if (pI830->swfSaved) { - OUTREG(SWF0, pI830->saveSWF0); - OUTREG(SWF4, pI830->saveSWF4); - } if (pI830->MMIOBase) I830UnmapMMIO(pScrn); I830FreeRec(pScrn); @@ -1492,19 +1501,6 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) i830_init_clock_gating(pScrn); -#if 1 - pI830->saveSWF0 = INREG(SWF0); - pI830->saveSWF4 = INREG(SWF4); - pI830->swfSaved = TRUE; - - /* Set "extended desktop" */ - OUTREG(SWF0, pI830->saveSWF0 | (1 << 21)); - - /* Set "driver loaded", "OS unknown", "APM 1.2" */ - OUTREG(SWF4, (pI830->saveSWF4 & ~((3 << 19) | (7 << 16))) | - (1 << 23) | (2 << 16)); -#endif - if (DEVICE_ID(pI830->PciInfo) == PCI_CHIP_E7221_G) num_pipe = 1; else @@ -1739,12 +1735,6 @@ I830PreInit(ScrnInfoPtr pScrn, int flags) pI830->noAccel = TRUE; } - /* Don't need MMIO access anymore. */ - if (pI830->swfSaved) { - OUTREG(SWF0, pI830->saveSWF0); - OUTREG(SWF4, pI830->saveSWF4); - } - /* Set display resolution */ xf86SetDpi(pScrn, 0, 0); @@ -3309,6 +3299,9 @@ I830EnterVT(int scrnIndex, int flags) i830_stop_ring(pScrn, FALSE); SetHWOperatingState(pScrn); + /* Tell the BIOS that we're in control of mode setting now. */ + i830_init_bios_control(pScrn); + /* Clear the framebuffer */ memset(pI830->FbBase + pScrn->fbOffset, 0, pScrn->virtualY * pScrn->displayWidth * pI830->cpp); commit ae65ddbbc8064c33febc7608122828998ee15a2e Author: Eric Anholt <[EMAIL PROTECTED]> Date: Thu Jun 5 13:57:54 2008 -0700 Remove gratuitous wait_ring_idle after I830Sync. Syncing implies that. (cherry picked from commit b61cb9283185eb5211e84eb7d8e68beea607c2eb) diff --git a/src/i830_driver.c b/src/i830_driver.c index cf4586b..c53d2c3 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -1851,7 +1851,6 @@ i830_stop_ring(ScrnInfoPtr pScrn, Bool flush) if (temp & RING_VALID) { i830_refresh_ring(pScrn); I830Sync(pScrn); - i830_wait_ring_idle(pScrn); } OUTREG(LP_RING + RING_LEN, 0); @@ -3358,7 +3357,6 @@ I830EnterVT(int scrnIndex, int flags) i830_refresh_ring(pScrn); I830Sync(pScrn); - i830_wait_ring_idle(pScrn); sarea->texAge++; for(i = 0; i < I830_NR_TEX_REGIONS+1 ; i++) commit e0a2b1008f751ee8cddb0d7587514ea574821af6 Author: Eric Anholt <[EMAIL PROTECTED]> Date: Thu Jun 5 13:39:08 2008 -0700 Remove duplicated i830_stop_ring()/SetHWOperatingState() in EnterVT(). (cherry picked from commit adb4f5a5e826e584ab212d23fc8d474c3e7bb8e8) diff --git a/src/i830_driver.c b/src/i830_driver.c index 16092dd..cf4586b 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -3323,9 +3323,6 @@ I830EnterVT(int scrnIndex, int flags) } i830DescribeOutputConfiguration(pScrn); - i830_stop_ring(pScrn, TRUE); - SetHWOperatingState(pScrn); - #ifdef XF86DRI if (pI830->directRenderingEnabled) { /* HW status is fixed, we need to set it up before any drm commit a4e8b188d469c8092d4314be96a697fb4f780276 Author: Eric Anholt <[EMAIL PROTECTED]> Date: Thu Jun 5 11:56:42 2008 -0700 Replace a couple of wait-for-ring-idles with a single function to do so. (cherry picked from commit 7e51384c973a96366b02ea646392c43574674111) diff --git a/src/i830.h b/src/i830.h index db930a0..a7cdb8c 100644 --- a/src/i830.h +++ b/src/i830.h @@ -853,6 +853,14 @@ i830_get_transformed_coordinates_3d(int x, int y, PictTransformPtr transform, void i830_enter_render(ScrnInfoPtr); +static inline void +i830_wait_ring_idle(ScrnInfoPtr pScrn) +{ + I830Ptr pI830 = I830PTR(pScrn); + + I830WaitLpRing(pScrn, pI830->LpRing->mem->size - 8, 0); +} + static inline int i830_fb_compression_supported(I830Ptr pI830) { if (!IS_MOBILE(pI830)) diff --git a/src/i830_accel.c b/src/i830_accel.c index 953a73b..7784c62 100644 --- a/src/i830_accel.c +++ b/src/i830_accel.c @@ -201,7 +201,7 @@ I830Sync(ScrnInfoPtr pScrn) ADVANCE_BATCH(); } - I830WaitLpRing(pScrn, pI830->LpRing->mem->size - 8, 0); + i830_wait_ring_idle(pScrn); pI830->LpRing->space = pI830->LpRing->mem->size - 8; pI830->nextColorExpandBuf = 0; diff --git a/src/i830_driver.c b/src/i830_driver.c index a237374..16092dd 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -1851,7 +1851,7 @@ i830_stop_ring(ScrnInfoPtr pScrn, Bool flush) if (temp & RING_VALID) { i830_refresh_ring(pScrn); I830Sync(pScrn); - DO_RING_IDLE(); + i830_wait_ring_idle(pScrn); } OUTREG(LP_RING + RING_LEN, 0); @@ -3358,10 +3358,10 @@ I830EnterVT(int scrnIndex, int flags) int i; I830DRIResume(screenInfo.screens[scrnIndex]); - + i830_refresh_ring(pScrn); I830Sync(pScrn); - DO_RING_IDLE(); + i830_wait_ring_idle(pScrn); sarea->texAge++; for(i = 0; i < I830_NR_TEX_REGIONS+1 ; i++) diff --git a/src/i830_ring.h b/src/i830_ring.h index cf789eb..c2078fb 100644 --- a/src/i830_ring.h +++ b/src/i830_ring.h @@ -75,28 +75,13 @@ union intfloat { pI830->ring_emitting = 0; \ } while (0) -/* - * XXX Note: the head/tail masks are different for 810 and i830. - * If the i810 always sets the higher bits to 0, then this shouldn't be - * a problem. Check this! - */ -#define DO_RING_IDLE() do { \ - int _head; \ - int _tail; \ - do { \ - _head = INREG(LP_RING + RING_HEAD) & I830_HEAD_MASK; \ - _tail = INREG(LP_RING + RING_TAIL) & I830_TAIL_MASK; \ - DELAY(10); \ - } while (_head != _tail); \ -} while (0) - #define BEGIN_LP_RING(n) \ do { \ if (pI830->ring_emitting != 0) \ FatalError("%s: BEGIN_LP_RING called without closing " \ "ADVANCE_LP_RING\n", __FUNCTION__); \ if ((n) > 2 && (I810_DEBUG&DEBUG_ALWAYS_SYNC)) \ - DO_RING_IDLE(); \ + i830_wait_ring_idle(pScrn); \ pI830->ring_emitting = (n) * 4; \ if ((n) & 1) \ pI830->ring_emitting += 4; \ commit 7d267e27c152a4935ec5301d9fbbfd6eff8816d4 Author: Eric Anholt <[EMAIL PROTECTED]> Date: Thu Jun 5 11:26:02 2008 -0700 Just remove the mprotect kludge. Besides not being #ifdef __linux__ed as requested, some linux kernels break in exciting new ways when you try to mprotect from PROT_NONE back to PROT_READ|PROT_WRITE. Yes, there are bugs in the code we're calling in a bug-exploiting bug workaround. If you want this workaround for the original bug exposed when moving to libpciaccess, it's already in libpciaccess. (cherry picked from commit 65306cdd71dad71e4ca7229764f81a0880dd70bf) diff --git a/src/i830_driver.c b/src/i830_driver.c index f1efa7b..a237374 100644 --- a/src/i830_driver.c +++ b/src/i830_driver.c @@ -692,11 +692,6 @@ I830MapMem(ScrnInfoPtr pScrn) (void **) &pI830->FbBase); if (err) return FALSE; - /* KLUDGE ALERT -- rewrite the PTEs to turn off the CD and WT bits */ -#if HAVE_MPROTECT - mprotect (pI830->FbBase, pI830->FbMapSize, PROT_NONE); - mprotect (pI830->FbBase, pI830->FbMapSize, PROT_READ|PROT_WRITE); -#endif #else pI830->FbBase = xf86MapPciMem(pScrn->scrnIndex, VIDMEM_FRAMEBUFFER, pI830->PciTag, commit 85308ab8aaf58b6620a41621128eba0b7e1ffb44 Author: Hong Liu <[EMAIL PROTECTED]> Date: Wed Jun 4 16:58:05 2008 +0800 Set SDVO sync polarity to default on 965 Fix fd.o bug 15766 (cherry picked from commit beb72ae5aa053303f5cc419e9c9d7c6db964f160) diff --git a/src/i810_reg.h b/src/i810_reg.h index 5ca8ca9..79a5b1e 100644 --- a/src/i810_reg.h +++ b/src/i810_reg.h @@ -1222,6 +1222,10 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #define SDVO_CLOCK_OUTPUT_INVERT (1 << 18) #define SDVOC_GANG_MODE (1 << 16) #define SDVO_BORDER_ENABLE (1 << 7) +/** new with 965, default is to be set */ +#define SDVO_VSYNC_ACTIVE_HIGH (1 << 4) +#define SDVO_HSYNC_ACTIVE_HIGH (1 << 3) +/** 915/945 only, read-only bit */ #define SDVOB_PCIE_CONCURRENCY (1 << 3) #define SDVO_DETECTED (1 << 2) /* Bits to be preserved when writing */ diff --git a/src/i830_sdvo.c b/src/i830_sdvo.c index f60e38c..0dc6dca 100644 --- a/src/i830_sdvo.c +++ b/src/i830_sdvo.c @@ -730,7 +730,9 @@ i830_sdvo_mode_set(xf86OutputPtr output, DisplayModePtr mode, /* Set the SDVO control regs. */ if (IS_I965G(pI830)) { - sdvox = SDVO_BORDER_ENABLE; + sdvox = SDVO_BORDER_ENABLE | + SDVO_VSYNC_ACTIVE_HIGH | + SDVO_HSYNC_ACTIVE_HIGH; } else { sdvox = INREG(dev_priv->output_device); switch (dev_priv->output_device) { commit 14dc93cb4dabdd83ee62a2a497c210aeb52f6c30 Author: Zhenyu Wang <[EMAIL PROTECTED]> Date: Thu Jun 12 13:47:04 2008 +0800 xvmc: a little cleanup Also safe check context size to not exceed surface max. diff --git a/src/i830.h b/src/i830.h index 755c773..db930a0 100644 --- a/src/i830.h +++ b/src/i830.h @@ -660,6 +660,8 @@ typedef struct _I830Rec { #define I830PTR(p) ((I830Ptr)((p)->driverPrivate)) +#define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0])) + #define I830_SELECT_FRONT 0 #define I830_SELECT_BACK 1 #define I830_SELECT_DEPTH 2 diff --git a/src/i915_hwmc.c b/src/i915_hwmc.c index c3d3c75..50e1106 100644 --- a/src/i915_hwmc.c +++ b/src/i915_hwmc.c @@ -95,8 +95,6 @@ typedef struct _I915XvMC PutImageFuncPtr savePutImage; } I915XvMC, *I915XvMCPtr; -#define ARRARY_SIZE(a) (sizeof(a) / sizeof(a[0])) - /* static int yv12_subpicture_index_list[2] = { @@ -161,6 +159,22 @@ static XF86ImagePtr i915_subpicture_list[2] = }; #endif +/* Check context size not exceed surface type max */ +static void +i915_check_context_size(XvMCContextPtr ctx) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(ppSI); i++) { + if (ctx->surface_type_id == ppSI[i]->surface_type_id) { + if (ctx->width > ppSI[i]->max_width) + ctx->width = ppSI[i]->max_width; + if (ctx->height > ppSI[i]->max_height) + ctx->height = ppSI[i]->max_height; + } + } +} + /* * Init and clean up the screen private parts of XvMC. */ @@ -430,6 +444,8 @@ static int i915_xvmc_create_context (ScrnInfoPtr pScrn, XvMCContextPtr pContext, return BadAlloc; } + i915_check_context_size(pContext); + *priv = xcalloc(1, sizeof(I915XvMCCreateContextRec)); contextRec = (I915XvMCCreateContextRec *)*priv; @@ -776,10 +792,9 @@ static int i915_xvmc_put_image(ScrnInfoPtr pScrn, struct intel_xvmc_command *xvmc_cmd = (struct intel_xvmc_command *)buf; int ret; - if (pI830->XvMCEnabled) { - if (FOURCC_XVMC == id) { - switch (xvmc_cmd->command) { - case INTEL_XVMC_COMMAND_DISPLAY: + if (FOURCC_XVMC == id) { + switch (xvmc_cmd->command) { + case INTEL_XVMC_COMMAND_DISPLAY: if ((xvmc_cmd->srfNo >= I915_XVMC_MAX_SURFACES) || !pXvMC->surfaces[xvmc_cmd->srfNo] || !pXvMC->sfprivs[xvmc_cmd->srfNo]) { @@ -793,10 +808,9 @@ static int i915_xvmc_put_image(ScrnInfoPtr pScrn, id = xvmc_cmd->real_id; pI830->IsXvMCSurface = 1; break; - default: - return 0; - } - } + default: + return 0; + } } ret = pXvMC->savePutImage(pScrn, src_x, src_y, drw_x, drw_y, src_w, src_h, @@ -850,7 +864,7 @@ static void i915_xvmc_fini(ScrnInfoPtr pScrn) static XF86MCAdaptorRec pAdapt = { .name = "Intel(R) Textured Video", - .num_surfaces = ARRARY_SIZE(ppSI), + .num_surfaces = ARRAY_SIZE(ppSI), .surfaces = ppSI, #if 0 .num_subpictures = ARRARY_SIZE(i915_subpicture_list), diff --git a/src/i915_hwmc.h b/src/i915_hwmc.h index 0141fb2..7d90afc 100644 --- a/src/i915_hwmc.h +++ b/src/i915_hwmc.h @@ -32,7 +32,7 @@ #define STRIDE(w) (((w) + 0x3ff) & ~0x3ff) #define SIZE_Y420(w, h) (h * STRIDE(w)) #define SIZE_UV420(w, h) ((h >> 1) * STRIDE(w >> 1)) -#define SIZE_YUV420(w, h) (h * (STRIDE(w) + STRIDE(w >> 1))) +#define SIZE_YUV420(w, h) (SIZE_Y420(w,h) + SIZE_UV420(w,h) * 2) #define SIZE_XX44(w, h) (h * STRIDE(w)) #define I915_NUM_XVMC_ATTRIBUTES 0x02 diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c index f2d8ded..b1a17b4 100644 --- a/src/xvmc/i915_xvmc.c +++ b/src/xvmc/i915_xvmc.c @@ -1987,7 +1987,7 @@ static int i915_xvmc_mc_render_surface(Display *display, XvMCContext *context, XVMC_ERR("Invalid Macroblock Parameters found."); break; } - } else { /* Frame Picture */ + } else { /* Field Picture */ switch (mb->motion_type & 3) { case XVMC_PREDICTION_FIELD: /* Field Based */ i915_mc_mpeg_macroblock_1fbmv(context, mb); @@ -2005,7 +2005,7 @@ static int i915_xvmc_mc_render_surface(Display *display, XvMCContext *context, XVMC_ERR("Invalid Macroblock Parameters found."); break; } - } /* Field Picture */ + } } intelFlushBatch(TRUE); commit ce674bd39c2fe2844b449fad6cfe83b4d18adad6 Author: Zhenyu Wang <[EMAIL PROTECTED]> -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]