Allow vblank interrupts to remain disabled across VT switch.
authorKeith Packard <keithp@neko.keithp.com>
Mon, 7 May 2007 13:07:48 +0000 (09:07 -0400)
committerKeith Packard <keithp@neko.keithp.com>
Thu, 10 May 2007 20:15:32 +0000 (13:15 -0700)
i915_driver_irq_postinstall was forcing vblank interrupts to pipe A when
called with vblank interrupts disabled. This caused vblank interrupts to be
accidentally re-enabled when VT switching the X server. Instead, start the
driver with vblank interrupts enabled on pipe A to support older X servers,
but then leave control over the state to the X server if it is able to do so.

shared-core/i915_dma.c
shared-core/i915_irq.c

index cb5dcea8cc4dd2a4deb3c55c4df4f61b49651f3a..8991a3ce9bd39beaefa308a5b7ba61450a3aa836 100644 (file)
@@ -177,6 +177,10 @@ static int i915_initialize(drm_device_t * dev,
         */
        dev_priv->allow_batchbuffer = 1;
 
+       /* Enable vblank on pipe A for older X servers
+        */
+       dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A;
+
        /* Program Hardware Status Page */
        dev_priv->status_page_dmah = drm_pci_alloc(dev, PAGE_SIZE, PAGE_SIZE, 
            0xffffffff);
index 8748b647adea4cf06320360217b9347d618ae7df..e3335458d02b10afc0ceb24acc4d18e9b07cf3ae 100644 (file)
@@ -726,9 +726,6 @@ void i915_driver_irq_postinstall(drm_device_t * dev)
        INIT_LIST_HEAD(&dev_priv->vbl_swaps.head);
        dev_priv->swaps_pending = 0;
 
-       if (!dev_priv->vblank_pipe)
-               dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A;
-
        dev_priv->swaps_lock = SPIN_LOCK_UNLOCKED;
        INIT_LIST_HEAD(&dev_priv->vbl_swaps.head);
        dev_priv->swaps_pending = 0;
@@ -736,8 +733,6 @@ void i915_driver_irq_postinstall(drm_device_t * dev)
        dev_priv->user_irq_lock = SPIN_LOCK_UNLOCKED;
        dev_priv->user_irq_refcount = 0;
 
-       if (!dev_priv->vblank_pipe)
-               dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A;
        i915_enable_interrupt(dev);
        DRM_INIT_WAITQUEUE(&dev_priv->irq_queue);