Merge commit '900cfa46191a7d87cf1891924cb90499287fd235'; branches 'timers/nohz',...
[cascardo/linux.git] / drivers / char / drm / i915_irq.c
index 92653b3..df03611 100644 (file)
@@ -57,10 +57,20 @@ static void i915_vblank_tasklet(struct drm_device *dev)
                                XY_SRC_COPY_BLT_WRITE_ALPHA |
                                XY_SRC_COPY_BLT_WRITE_RGB)
                             : XY_SRC_COPY_BLT_CMD;
-       u32 pitchropcpp = (sarea_priv->pitch * cpp) | (0xcc << 16) |
-                         (cpp << 23) | (1 << 24);
+       u32 src_pitch = sarea_priv->pitch * cpp;
+       u32 dst_pitch = sarea_priv->pitch * cpp;
+       u32 ropcpp = (0xcc << 16) | ((cpp - 1) << 24);
        RING_LOCALS;
 
+       if (IS_I965G(dev) && sarea_priv->front_tiled) {
+               cmd |= XY_SRC_COPY_BLT_DST_TILED;
+               dst_pitch >>= 2;
+       }
+       if (IS_I965G(dev) && sarea_priv->back_tiled) {
+               cmd |= XY_SRC_COPY_BLT_SRC_TILED;
+               src_pitch >>= 2;
+       }
+
        DRM_DEBUG("\n");
 
        INIT_LIST_HEAD(&hits);
@@ -125,16 +135,26 @@ static void i915_vblank_tasklet(struct drm_device *dev)
 
        i915_kernel_lost_context(dev);
 
-       BEGIN_LP_RING(6);
-
-       OUT_RING(GFX_OP_DRAWRECT_INFO);
-       OUT_RING(0);
-       OUT_RING(0);
-       OUT_RING(sarea_priv->width | sarea_priv->height << 16);
-       OUT_RING(sarea_priv->width | sarea_priv->height << 16);
-       OUT_RING(0);
-
-       ADVANCE_LP_RING();
+       if (IS_I965G(dev)) {
+               BEGIN_LP_RING(4);
+
+               OUT_RING(GFX_OP_DRAWRECT_INFO_I965);
+               OUT_RING(0);
+               OUT_RING(((sarea_priv->width - 1) & 0xffff) | ((sarea_priv->height - 1) << 16));
+               OUT_RING(0);
+               ADVANCE_LP_RING();
+       } else {
+               BEGIN_LP_RING(6);
+
+               OUT_RING(GFX_OP_DRAWRECT_INFO);
+               OUT_RING(0);
+               OUT_RING(0);
+               OUT_RING(sarea_priv->width | sarea_priv->height << 16);
+               OUT_RING(sarea_priv->width | sarea_priv->height << 16);
+               OUT_RING(0);
+
+               ADVANCE_LP_RING();
+       }
 
        sarea_priv->ctxOwner = DRM_KERNEL_CONTEXT;
 
@@ -184,12 +204,12 @@ static void i915_vblank_tasklet(struct drm_device *dev)
                                BEGIN_LP_RING(8);
 
                                OUT_RING(cmd);
-                               OUT_RING(pitchropcpp);
+                               OUT_RING(ropcpp | dst_pitch);
                                OUT_RING((y1 << 16) | rect->x1);
                                OUT_RING((y2 << 16) | rect->x2);
                                OUT_RING(sarea_priv->front_offset);
                                OUT_RING((y1 << 16) | rect->x1);
-                               OUT_RING(pitchropcpp & 0xffff);
+                               OUT_RING(src_pitch);
                                OUT_RING(sarea_priv->back_offset);
 
                                ADVANCE_LP_RING();