xf86-video-intel: Branch 'xf86-video-intel-2.3-branch' - 19 commits - src/bios_reader/bios_dumper.c src/i810_reg.h src/i830_accel.c src/i830_display.c src/i830_driver.c src/i830.h src/i830_memory.c src/i830_quirks.c src/i830_ring.h src/i830_sdvo.c src/i830_tv.c src/i915_hwmc.c src/i915_hwmc.h src/xvmc/driDrawable.c src/xvmc/driDrawable.h src/xvmc/i915_xvmc.c src/xvmc/intel_xvmc.h src/xvmc/Makefile.am

Zhenyu Wang zhen at kemper.freedesktop.org
Thu Jun 12 18:55:00 PDT 2008


 src/bios_reader/bios_dumper.c |    4 
 src/i810_reg.h                |    7 +
 src/i830.h                    |   22 ++++-
 src/i830_accel.c              |    2 
 src/i830_display.c            |   18 ++--
 src/i830_driver.c             |  143 +++++++++++++++++++---------------
 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/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.h         |    1 
 18 files changed, 184 insertions(+), 357 deletions(-)

New commits:
commit df0bbdc7cbb6ff357a81ed28d12e56c9c7d643f7
Author: Zhenyu Wang <zhenyu.z.wang at intel.com>
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 <eric at anholt.net>
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 <bryce at bryceharrington.org>
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 <jbarnes at hobbes.lan>
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 <rglowery at exemail.com.au>
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 <eric at anholt.net>
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 <eric at anholt.net>
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 <eric at anholt.net>
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 <eric at anholt.net>
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 <eric at anholt.net>
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 <eric at anholt.net>
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 <eric at anholt.net>
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 <eric at anholt.net>
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 <hong.liu at intel.com>
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 <zhenyu.z.wang at intel.com>
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 <zhenyu.z.wang at intel.com>
Date:   Tue Jun 3 16:13:52 2008 +0800

    xvmc: remove unused dri drawable
    (cherry picked from commit 96955003557686469c7ae9f7d42620d2851e6fad)

diff --git a/src/xvmc/Makefile.am b/src/xvmc/Makefile.am
index f571743..f2dab22 100644
--- a/src/xvmc/Makefile.am
+++ b/src/xvmc/Makefile.am
@@ -19,9 +19,8 @@ libIntelXvMC_la_SOURCES = intel_xvmc.c \
                          intel_batchbuffer.h \
                          xf86dri.c \
                          xf86dri.h \
-                         xf86dristr.h \
-                         driDrawable.c \
-                         driDrawable.h
+                         xf86dristr.h
+
 libIntelXvMC_la_CFLAGS = @XORG_CFLAGS@ @DRI_CFLAGS@ @XVMCLIB_CFLAGS@ -I$(top_srcdir)/src -DTRUE=1 -DFALSE=0
 libIntelXvMC_la_LDFLAGS = -version-number 1:0:0
 libIntelXvMC_la_LIBADD = @DRI_LIBS@
diff --git a/src/xvmc/driDrawable.c b/src/xvmc/driDrawable.c
deleted file mode 100644
index 8386334..0000000
--- a/src/xvmc/driDrawable.c
+++ /dev/null
@@ -1,174 +0,0 @@
-/*****************************************************************************
- * driDrawable.c: Lean Version of DRI utilities.
- *
- * Copyright (c) 2005 Thomas Hellstrom. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHOR(S) OR COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-
-#include <X11/Xlibint.h>
-#include <X11/Xutil.h>
-#include "xf86drm.h"
-#include "drm.h"
-#include "xf86dri.h"
-#include "drm_sarea.h"
-#include "driDrawable.h"
-
-static unsigned
-drawStamp(volatile drm_sarea_t * pSarea, int index)
-{
-    return pSarea->drawableTable[index].stamp;
-}
-
-int
-getDRIDrawableInfoLocked(void *drawHash, Display * display, int screen,
-    Drawable draw, unsigned lockFlags, int drmFD, drm_context_t drmContext,
-    drmAddress sarea, Bool updateInfo, drawableInfo ** info,
-    unsigned long infoSize)
-{
-    drawableInfo *drawInfo;
-    void *res;
-    drm_drawable_t drmDraw = 0;
-    volatile drm_sarea_t *pSarea = (drm_sarea_t *) sarea;
-    drm_clip_rect_t *clipFront, *clipBack;
-
-    int ret;
-
-    if (drmHashLookup(drawHash, (unsigned long)draw, &res)) {
-
-	/*
-	 * The drawable is unknown to us. Create it and put it in the
-	 * hash table.
-	 */
-
-	DRM_UNLOCK(drmFD, &pSarea->lock, drmContext);
-	if (!uniDRICreateDrawable(display, screen, draw, &drmDraw)) {
-	    DRM_LOCK(drmFD, &pSarea->lock, drmContext, lockFlags);
-	    return 1;
-	}
-	DRM_LOCK(drmFD, &pSarea->lock, drmContext, lockFlags);
-
-	drawInfo = (drawableInfo *) malloc(infoSize);
-	if (!drawInfo)
-	    return 1;
-
-	drawInfo->drmDraw = drmDraw;
-	drawInfo->stamp = 0;
-	drawInfo->clipFront = 0;
-	drawInfo->clipBack = 0;
-
-	drmHashInsert(drawHash, (unsigned long)draw, drawInfo);
-
-    } else {
-	drawInfo = res;
-    }
-
-    drawInfo->touched = FALSE;
-    while (!drawInfo->clipFront
-	|| drawInfo->stamp != drawStamp(pSarea, drawInfo->index)) {
-
-	/*
-	 * The drawable has been touched since we last got info about it.
-	 * obtain new info from the X server.
-	 */
-
-	drawInfo->touched = TRUE;
-
-	if (updateInfo || !drawInfo->clipFront) {
-	    DRM_UNLOCK(drmFD, &pSarea->lock, drmContext);
-
-	    ret = uniDRIGetDrawableInfo(display, screen, draw,
-		&drawInfo->index, &drawInfo->stamp, &drawInfo->x,
-		&drawInfo->y, &drawInfo->w, &drawInfo->h,
-		&drawInfo->numClipFront, &clipFront,
-		&drawInfo->backX, &drawInfo->backY,
-		&drawInfo->numClipBack, &clipBack);
-
-	    DRM_LIGHT_LOCK(drmFD, &pSarea->lock, drmContext);
-
-	    /*
-	     * Error. Probably the drawable is destroyed. Return error and old values.
-	     */
-
-	    if (!ret) {
-		free(drawInfo);
-		drawInfo = NULL;
-		drmHashDelete(drawHash, (unsigned long)draw);
-
-		DRM_UNLOCK(drmFD, &pSarea->lock, drmContext);
-		uniDRIDestroyDrawable(display, screen, draw);
-		DRM_LOCK(drmFD, &pSarea->lock, drmContext, lockFlags);
-
-		return 1;
-	    }
-
-	    if (drawInfo->stamp != drawStamp(pSarea, drawInfo->index)) {
-
-		/*
-		 * The info is already outdated. Sigh. Have another go.
-		 */
-
-		XFree(clipFront);
-		XFree(clipBack);
-		continue;
-	    }
-
-	    if (drawInfo->clipFront)
-		XFree(drawInfo->clipFront);
-	    drawInfo->clipFront = clipFront;
-	    if (drawInfo->clipBack)
-		XFree(drawInfo->clipBack);
-	    drawInfo->clipBack = clipBack;
-	} else {
-	    if (!drawInfo->clipFront)
-		drawInfo->clipFront = (drm_clip_rect_t *) ~ 0UL;
-	    drawInfo->stamp = drawStamp(pSarea, drawInfo->index);
-	}
-    }
-    *info = drawInfo;
-    return 0;
-}
-
-void
-driDestroyHashContents(void *drawHash)
-{
-    unsigned long key;
-    void *content;
-    drawableInfo *drawInfo;
-
-    if (drmHashFirst(drawHash, &key, &content) < 1)
-	return;
-    drawInfo = (drawableInfo *) content;
-    if (drawInfo->clipBack)
-	XFree(drawInfo->clipBack);
-    if (drawInfo->clipFront)
-	XFree(drawInfo->clipFront);
-    free(drawInfo);
-    while (drmHashNext(drawHash, &key, &content) == 1) {
-	drawInfo = (drawableInfo *) content;
-	if (drawInfo->clipBack)
-	    XFree(drawInfo->clipBack);
-	if (drawInfo->clipFront)
-	    XFree(drawInfo->clipFront);
-	free(drawInfo);
-    }
-
-    return;
-}
diff --git a/src/xvmc/driDrawable.h b/src/xvmc/driDrawable.h
deleted file mode 100644
index a758c7c..0000000
--- a/src/xvmc/driDrawable.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*****************************************************************************
- * driDrawable.h: Lean Version of DRI utilities.
- *
- * Copyright (c) 2005 Thomas Hellstrom. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHOR(S) OR COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef _DRIDRAWABLE_H
-#define _DRIDRAWABLE_H
-
-typedef struct _drawableInfo
-{
-    drm_drawable_t drmDraw;
-    unsigned stamp;
-    unsigned index;
-    drm_clip_rect_t *clipFront;
-    drm_clip_rect_t *clipBack;
-    int x;
-    int y;
-    int w;
-    int h;
-    int backX;
-    int backY;
-    int numClipFront;
-    int numClipBack;
-    Bool touched;
-} drawableInfo;
-
-/*
- * Get updated info about the drawable "draw". The drawableInfo record returned is malloced
- * and administrated internally. Never free it unless you know exactly what you are doing.
- * The drm hash table "drawHash" needs to be initialized externally.
- */
-
-extern int
-getDRIDrawableInfoLocked(void *drawHash, Display * display, int screen,
-    Drawable draw, unsigned lockFlags, int drmFD, drm_context_t drmContext,
-    drmAddress sarea, Bool updateInfo, drawableInfo ** info,
-    unsigned long infoSize);
-
-/*
- * Free all resources created by the above function. Typically done on exit.
- */
-
-extern void driDestroyHashContents(void *drawHash);
-
-#endif
diff --git a/src/xvmc/i915_xvmc.c b/src/xvmc/i915_xvmc.c
index 20b2e61..f2d8ded 100644
--- a/src/xvmc/i915_xvmc.c
+++ b/src/xvmc/i915_xvmc.c
@@ -1608,9 +1608,6 @@ static void i915_release_resource(Display *display, XvMCContext *context)
     pI915XvMC->ref--;
     i915_xvmc_unmap_buffers(pI915XvMC);
 
-    driDestroyHashContents(pI915XvMC->drawHash);
-    drmHashDestroy(pI915XvMC->drawHash);
-
     free(pI915XvMC);
     context->privData = NULL;
 }
@@ -1683,13 +1680,6 @@ static Status i915_xvmc_mc_create_context(Display *display, XvMCContext *context
     pSAREA = (drm_sarea_t *)xvmc_driver->sarea_address;
     pI915XvMC->sarea = (drmI830Sarea*)((char*)pSAREA + pI915XvMC->sarea_priv_offset);
 
-    if (NULL == (pI915XvMC->drawHash = drmHashCreate())) {
-	XVMC_ERR("Could not allocate drawable hash table.");
-        free(pI915XvMC);
-        context->privData = NULL;
-        return BadAlloc;
-    }
-
     if (i915_xvmc_map_buffers(pI915XvMC)) {
         i915_xvmc_unmap_buffers(pI915XvMC);
         free(pI915XvMC);
diff --git a/src/xvmc/intel_xvmc.h b/src/xvmc/intel_xvmc.h
index 5506683..bc863c4 100644
--- a/src/xvmc/intel_xvmc.h
+++ b/src/xvmc/intel_xvmc.h
@@ -53,7 +53,6 @@
 #include <drm_sarea.h>
 
 #include "xf86dri.h"
-#include "driDrawable.h"
 
 #include "intel_batchbuffer.h"
 
commit 88232a9b9af2c73460eec206c4971679af9dcb43
Author: Jesse Barnes <jbarnes at hobbes.lan>
Date:   Mon May 26 09:34:34 2008 -0700

    Fixup power saving registers
    
    Update clock gating disable bits to match docs and allocate a power context
    memory area so that newer chips can save state and power down the render unit.
    (cherry picked from commit 89bb53cc7a853d88fc34a0ca65ae2b6227a8dd24)

diff --git a/src/i810_reg.h b/src/i810_reg.h
index 834b948..5ca8ca9 100644
--- a/src/i810_reg.h
+++ b/src/i810_reg.h
@@ -460,6 +460,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  *   - new bits for i810
  *   - new register hwstam (mask)
  */
+#define PWRCTXA		     0x2088 /* 965GM+ only */
+#define   PWRCTX_EN	     (1<<0)
 #define HWSTAM               0x2098 /* p290 */
 #define IER                  0x20a0 /* p291 */
 #define IIR                  0x20a4 /* p292 */
@@ -1120,6 +1122,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #define RENCLK_GATE_D2		0x6208
 #define RAMCLK_GATE_D		0x6210		/* CRL only */
+#define DEUC			0x6214          /* CRL only */
 
 /*
  * This is a PCI config space register to manipulate backlight brightness
diff --git a/src/i830.h b/src/i830.h
index 0ae8270..755c773 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;
@@ -768,6 +770,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 7a08522..f1efa7b 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -934,6 +934,40 @@ I830SetupOutputs(ScrnInfoPtr pScrn)
    }
 }
 
+static void
+i830_init_clock_gating(ScrnInfoPtr pScrn)
+{
+    I830Ptr pI830 = I830PTR(pScrn);
+
+    /* Disable clock gating reported to work incorrectly according to the specs.
+     */
+    if (IS_IGD_GM(pI830)) {
+	OUTREG(RENCLK_GATE_D1, 0);
+	OUTREG(RENCLK_GATE_D2, 0);
+	OUTREG(RAMCLK_GATE_D, 0);
+	OUTREG(DSPCLK_GATE_D, VRHUNIT_CLOCK_GATE_DISABLE |
+	       OVRUNIT_CLOCK_GATE_DISABLE |
+	       OVCUNIT_CLOCK_GATE_DISABLE);
+    } else if (IS_I965GM(pI830)) {
+	OUTREG(RENCLK_GATE_D1, I965_RCC_CLOCK_GATE_DISABLE);
+	OUTREG(RENCLK_GATE_D2, 0);
+	OUTREG(DSPCLK_GATE_D, 0);
+	OUTREG(RAMCLK_GATE_D, 0);
+	OUTREG16(DEUC, 0);
+    } else if (IS_I965G(pI830)) {
+	OUTREG(RENCLK_GATE_D1, I965_RCZ_CLOCK_GATE_DISABLE |
+	       I965_RCC_CLOCK_GATE_DISABLE |
+	       I965_RCPB_CLOCK_GATE_DISABLE |
+	       I965_ISC_CLOCK_GATE_DISABLE |
+	       I965_FBC_CLOCK_GATE_DISABLE);
+	OUTREG(RENCLK_GATE_D2, 0);
+    } else if (IS_I855(pI830) || IS_I865G(pI830)) {
+	OUTREG(RENCLK_GATE_D1, SV_CLOCK_GATE_DISABLE);
+    } else if (IS_I830(pI830)) {
+	OUTREG(DSPCLK_GATE_D, OVRUNIT_CLOCK_GATE_DISABLE);
+    }
+}
+
 static int
 I830LVDSPresent(ScrnInfoPtr pScrn)
 {
@@ -1461,6 +1495,8 @@ I830PreInit(ScrnInfoPtr pScrn, int flags)
 
    i830TakeRegSnapshot(pScrn);
 
+   i830_init_clock_gating(pScrn);
+
 #if 1
    pI830->saveSWF0 = INREG(SWF0);
    pI830->saveSWF4 = INREG(SWF4);
@@ -1901,23 +1937,6 @@ SetHWOperatingState(ScrnInfoPtr pScrn)
 
    DPRINTF(PFX, "SetHWOperatingState\n");
 
-   /* Disable clock gating reported to work incorrectly according to the specs.
-    */
-   if (IS_IGD_GM(pI830)) {
-      OUTREG(RENCLK_GATE_D1, 0);
-      OUTREG(RENCLK_GATE_D2, 0);
-      OUTREG(DSPCLK_GATE_D, VRHUNIT_CLOCK_GATE_DISABLE);
-   } else if (IS_I965GM(pI830)) {
-      OUTREG(RENCLK_GATE_D1, I965_RCC_CLOCK_GATE_DISABLE);
-   } else if (IS_I965G(pI830)) {
-      OUTREG(RENCLK_GATE_D1,
-	     I965_RCC_CLOCK_GATE_DISABLE | I965_ISC_CLOCK_GATE_DISABLE);
-   } else if (IS_I855(pI830) || IS_I865G(pI830)) {
-      OUTREG(RENCLK_GATE_D1, SV_CLOCK_GATE_DISABLE);
-   } else if (IS_I830(pI830)) {
-      OUTREG(DSPCLK_GATE_D, OVRUNIT_CLOCK_GATE_DISABLE);
-   }
-
    i830_start_ring(pScrn);
    if (!pI830->SWCursor)
       I830InitHWCursor(pScrn);
@@ -2504,6 +2523,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;
 
@@ -2825,6 +2848,9 @@ 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);
@@ -3448,6 +3474,9 @@ 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_memory.c b/src/i830_memory.c
index 6835a6f..9ceb254 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,
@@ -337,6 +338,7 @@ i830_reset_allocations(ScrnInfoPtr pScrn)
     pI830->exa_965_state = NULL;
     pI830->overlay_regs = NULL;
     pI830->logical_context = NULL;
+    pI830->power_context = NULL;
 #ifdef XF86DRI
     pI830->back_buffer = NULL;
     pI830->third_buffer = NULL;
@@ -1654,6 +1656,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);
commit 0deedbcc98a831284f6e9db2510e88e90e01c286
Author: Eric Anholt <eric at anholt.net>
Date:   Mon Mar 24 13:25:37 2008 -0700

    Disable a bunch of clock gating disables on IGD_GM, which doesn't need them.
    
    Besides our driver having fallen through to the GM965 path for
    RENCLK_GATE_D1, the BIOS was turning some of these on.  It may be relevant
    for previous platforms as well to zero out the fields that should be zero
    in the other registers.
    (cherry picked from commit 552a1b824db31a234d7c5cb71057ed0e0ce64477)

diff --git a/src/i830_driver.c b/src/i830_driver.c
index 0db174b..7a08522 100644
--- a/src/i830_driver.c
+++ b/src/i830_driver.c
@@ -1903,7 +1903,11 @@ SetHWOperatingState(ScrnInfoPtr pScrn)
 
    /* Disable clock gating reported to work incorrectly according to the specs.
     */
-   if (IS_I965GM(pI830)) {
+   if (IS_IGD_GM(pI830)) {
+      OUTREG(RENCLK_GATE_D1, 0);
+      OUTREG(RENCLK_GATE_D2, 0);
+      OUTREG(DSPCLK_GATE_D, VRHUNIT_CLOCK_GATE_DISABLE);
+   } else if (IS_I965GM(pI830)) {
       OUTREG(RENCLK_GATE_D1, I965_RCC_CLOCK_GATE_DISABLE);
    } else if (IS_I965G(pI830)) {
       OUTREG(RENCLK_GATE_D1,
commit 5dd06d08015cf9c0721f34f7005ecd670025c334
Author: Alan Coopersmith <alan.coopersmith at sun.com>
Date:   Wed May 21 14:56:27 2008 -0700

    Define DEFFILEMODE for OS'es that don't have it
    (cherry picked from commit 165c0865d849b7d280a3a119fe9ae0ad34637df0)

diff --git a/src/bios_reader/bios_dumper.c b/src/bios_reader/bios_dumper.c
index e2f3064..1353eda 100644
--- a/src/bios_reader/bios_dumper.c
+++ b/src/bios_reader/bios_dumper.c
@@ -36,6 +36,10 @@
 #include <pciaccess.h>
 #include <err.h>
 
+#ifndef DEFFILEMODE
+#define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) /* 0666*/
+#endif
+
 static void usage(void)
 {
     fprintf(stderr, "usage: bios_dumper <filename>\n");


More information about the xorg-commit mailing list