*/
        if (i != 0)
                WARN_ON(readl(>t_entries[i-1]) != pte_encode(dev, addr, level));
+
+       /* This next bit makes the above posting read even more important. We
+        * want to flush the TLBs only after we're certain all the PTE updates
+        * have finished.
+        */
+       I915_WRITE(GFX_FLSH_CNTL_GEN6, GFX_FLSH_CNTL_EN);
+       POSTING_READ(GFX_FLSH_CNTL_GEN6);
 }
 
 void i915_gem_gtt_bind_object(struct drm_i915_gem_object *obj,
                goto err_out;
        }
 
-       dev_priv->mm.gtt->gtt = ioremap(gtt_bus_addr,
-                                       dev_priv->mm.gtt->gtt_total_entries * sizeof(gtt_pte_t));
+       dev_priv->mm.gtt->gtt = ioremap_wc(gtt_bus_addr,
+                                          dev_priv->mm.gtt->gtt_total_entries * sizeof(gtt_pte_t));
        if (!dev_priv->mm.gtt->gtt) {
                DRM_ERROR("Failed to map the gtt page table\n");
                teardown_scratch_page(dev);
 
 #define   CM0_RC_OP_FLUSH_DISABLE (1<<0)
 #define BB_ADDR                0x02140 /* 8 bytes */
 #define GFX_FLSH_CNTL  0x02170 /* 915+ only */
+#define GFX_FLSH_CNTL_GEN6     0x101008
+#define   GFX_FLSH_CNTL_EN     (1<<0)
 #define ECOSKPD                0x021d0
 #define   ECO_GATING_CX_ONLY   (1<<3)
 #define   ECO_FLIP_DONE                (1<<0)