drm: Add dev->vblank_disable_immediate flag
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 6 Aug 2014 11:49:54 +0000 (14:49 +0300)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 6 Aug 2014 20:39:28 +0000 (22:39 +0200)
Add a flag to drm_device which will cause the vblank code to bypass the
disable timer and always disable the vblank interrupt immediately when
the last reference is dropped.

v2: Add some notes about the flag to the kernel doc

Reviewed-by: Matt Roper <matthew.d.roper@intel.com>
Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Documentation/DocBook/drm.tmpl
drivers/gpu/drm/drm_irq.c
include/drm/drmP.h

index 55923d00bd52a78b534a842795d65b9e4ff71c8a..583edbffff1a691cb4454797214ae803820cb5d5 100644 (file)
@@ -3387,6 +3387,12 @@ void (*disable_vblank) (struct drm_device *dev, int crtc);</synopsis>
       module parameter or the <varname>drm_vblank_offdelay</varname> global
       variable and expressed in milliseconds. Its default value is 5000 ms.
       Zero means never disable, and a negative value means disable immediately.
+      Drivers may override the behaviour by setting the
+      <structname>drm_device</structname>
+      <structfield>vblank_disable_immediate</structfield> flag, which when set
+      causes vblank interrupts to be disabled immediately regardless of the
+      drm_vblank_offdelay value. The flag should only be set if there's a
+      properly working hardware vblank counter present.
     </para>
     <para>
       When a vertical blanking interrupt occurs drivers only need to call the
index 99145c4d536ba653a178b37f6ed35e8c21310c81..8dbcc3f892d57c96cb3809644f2b7c1781144ead 100644 (file)
@@ -994,7 +994,7 @@ void drm_vblank_put(struct drm_device *dev, int crtc)
 
        /* Last user schedules interrupt disable */
        if (atomic_dec_and_test(&vblank->refcount)) {
-               if (drm_vblank_offdelay < 0)
+               if (dev->vblank_disable_immediate || drm_vblank_offdelay < 0)
                        vblank_disable_fn((unsigned long)vblank);
                else if (drm_vblank_offdelay > 0)
                        mod_timer(&vblank->disable_timer,
index 24b32d453c60da7a855614a1798a3c7b884c5f16..17a5c10474bdc607826bec2b3a9c1f7641775683 100644 (file)
@@ -1074,6 +1074,16 @@ struct drm_device {
         */
        bool vblank_disable_allowed;
 
+       /*
+        * If true, vblank interrupt will be disabled immediately when the
+        * refcount drops to zero, as opposed to via the vblank disable
+        * timer.
+        * This can be set to true it the hardware has a working vblank
+        * counter and the driver uses drm_vblank_on() and drm_vblank_off()
+        * appropriately.
+        */
+       bool vblank_disable_immediate;
+
        /* array of size num_crtcs */
        struct drm_vblank_crtc *vblank;