drm/i965: On I965, use correct 3DSTATE_DRAWING_RECTANGLE command in vblank
authorKeith Packard <keithp@keithp.com>
Mon, 21 Apr 2008 06:27:24 +0000 (16:27 +1000)
committerDave Airlie <airlied@linux.ie>
Sat, 26 Apr 2008 07:48:47 +0000 (17:48 +1000)
The batchbuffer submission paths were fixed to use the 965-specific command,
but the vblank tasklet was not. When the older version is sent, the 965 will
lock up.

Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/char/drm/i915_irq.c

index 92653b38e64c5e26b5306811f6e32be1d54e16a1..5a6f8309d8be9e1cb7f64cf5f9de5c4a7de87871 100644 (file)
@@ -125,16 +125,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;