i915: fix vblank pipe setup
authorDave Airlie <airlied@linux.ie>
Thu, 26 Apr 2007 04:50:00 +0000 (14:50 +1000)
committerDave Airlie <airlied@linux.ie>
Thu, 26 Apr 2007 04:50:00 +0000 (14:50 +1000)
linux-core/intel_display.c
shared-core/i915_drv.h
shared-core/i915_irq.c

index a6f94fb..7d58117 100644 (file)
@@ -334,6 +334,24 @@ static bool intel_find_best_PLL(struct drm_crtc *crtc, int target,
 }
 
 void
+intel_set_vblank(drm_device_t *dev)
+{
+       drm_i915_private_t *dev_priv = dev->dev_private;
+       struct drm_crtc *crtc;
+       struct intel_crtc *intel_crtc;
+       int vbl_pipe = 0;
+
+       list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
+               intel_crtc = crtc->driver_private;
+
+               if (crtc->enabled)
+                       vbl_pipe |= (1<<intel_crtc->pipe);
+       }
+
+       dev_priv->vblank_pipe = vbl_pipe;
+       i915_enable_interrupt(dev);
+}
+void
 intel_wait_for_vblank(drm_device_t *dev)
 {
        /* Wait for 20ms, i.e. one cycle at 50hz. */
@@ -910,10 +928,8 @@ static void intel_crtc_mode_set(struct drm_crtc *crtc,
        /* Flush the plane changes */
        intel_pipe_set_base(crtc, x, y);
        
-#ifdef XF86DRI // TODO
-//   I830DRISetVBlankInterrupt (pScrn, TRUE);
-#endif
-       
+       intel_set_vblank(dev);
+
        intel_wait_for_vblank(dev);    
 }
 
index 2dd76d3..946e464 100644 (file)
@@ -237,6 +237,7 @@ extern int i915_vblank_pipe_get(DRM_IOCTL_ARGS);
 extern int i915_emit_irq(drm_device_t * dev);
 extern void i915_user_irq_on(drm_i915_private_t *dev_priv);
 extern void i915_user_irq_off(drm_i915_private_t *dev_priv);
+extern void i915_enable_interrupt (drm_device_t *dev);
 extern int i915_vblank_swap(DRM_IOCTL_ARGS);
 
 /* i915_mem.c */
index 4047e77..870fe40 100644 (file)
@@ -489,7 +489,7 @@ int i915_irq_wait(DRM_IOCTL_ARGS)
        return i915_wait_irq(dev, irqwait.irq_seq);
 }
 
-static void i915_enable_interrupt (drm_device_t *dev)
+void i915_enable_interrupt (drm_device_t *dev)
 {
        drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private;