drm: Disable vblank interrupt immediately when drm_vblank_offdelay<0
Make drm_vblank_put() disable the vblank interrupt immediately when the refcount drops to zero and drm_vblank_offdelay<0. v2: Preserve the current drm_vblank_offdelay==0 'never disable' behaviur Reviewed-by: Matt Roper <matthew.d.roper@intel.com> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
ffe7c73a8d
commit
4ed0ce3d0b
|
@ -3386,6 +3386,7 @@ void (*disable_vblank) (struct drm_device *dev, int crtc);</synopsis>
|
||||||
by scheduling a timer. The delay is accessible through the vblankoffdelay
|
by scheduling a timer. The delay is accessible through the vblankoffdelay
|
||||||
module parameter or the <varname>drm_vblank_offdelay</varname> global
|
module parameter or the <varname>drm_vblank_offdelay</varname> global
|
||||||
variable and expressed in milliseconds. Its default value is 5000 ms.
|
variable and expressed in milliseconds. Its default value is 5000 ms.
|
||||||
|
Zero means never disable, and a negative value means disable immediately.
|
||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
When a vertical blanking interrupt occurs drivers only need to call the
|
When a vertical blanking interrupt occurs drivers only need to call the
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
unsigned int drm_debug = 0; /* 1 to enable debug output */
|
unsigned int drm_debug = 0; /* 1 to enable debug output */
|
||||||
EXPORT_SYMBOL(drm_debug);
|
EXPORT_SYMBOL(drm_debug);
|
||||||
|
|
||||||
unsigned int drm_vblank_offdelay = 5000; /* Default to 5000 msecs. */
|
int drm_vblank_offdelay = 5000; /* Default to 5000 msecs. */
|
||||||
|
|
||||||
unsigned int drm_timestamp_precision = 20; /* Default to 20 usecs. */
|
unsigned int drm_timestamp_precision = 20; /* Default to 20 usecs. */
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ MODULE_AUTHOR(CORE_AUTHOR);
|
||||||
MODULE_DESCRIPTION(CORE_DESC);
|
MODULE_DESCRIPTION(CORE_DESC);
|
||||||
MODULE_LICENSE("GPL and additional rights");
|
MODULE_LICENSE("GPL and additional rights");
|
||||||
MODULE_PARM_DESC(debug, "Enable debug output");
|
MODULE_PARM_DESC(debug, "Enable debug output");
|
||||||
MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [msecs]");
|
MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [msecs] (0: never disable, <0: disable immediately)");
|
||||||
MODULE_PARM_DESC(timestamp_precision_usec, "Max. error on timestamps [usecs]");
|
MODULE_PARM_DESC(timestamp_precision_usec, "Max. error on timestamps [usecs]");
|
||||||
MODULE_PARM_DESC(timestamp_monotonic, "Use monotonic timestamps");
|
MODULE_PARM_DESC(timestamp_monotonic, "Use monotonic timestamps");
|
||||||
|
|
||||||
|
|
|
@ -993,10 +993,13 @@ void drm_vblank_put(struct drm_device *dev, int crtc)
|
||||||
BUG_ON(atomic_read(&vblank->refcount) == 0);
|
BUG_ON(atomic_read(&vblank->refcount) == 0);
|
||||||
|
|
||||||
/* Last user schedules interrupt disable */
|
/* Last user schedules interrupt disable */
|
||||||
if (atomic_dec_and_test(&vblank->refcount) &&
|
if (atomic_dec_and_test(&vblank->refcount)) {
|
||||||
(drm_vblank_offdelay > 0))
|
if (drm_vblank_offdelay < 0)
|
||||||
mod_timer(&vblank->disable_timer,
|
vblank_disable_fn((unsigned long)vblank);
|
||||||
jiffies + ((drm_vblank_offdelay * HZ)/1000));
|
else if (drm_vblank_offdelay > 0)
|
||||||
|
mod_timer(&vblank->disable_timer,
|
||||||
|
jiffies + ((drm_vblank_offdelay * HZ)/1000));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(drm_vblank_put);
|
EXPORT_SYMBOL(drm_vblank_put);
|
||||||
|
|
||||||
|
|
|
@ -1345,7 +1345,7 @@ extern void drm_put_dev(struct drm_device *dev);
|
||||||
extern void drm_unplug_dev(struct drm_device *dev);
|
extern void drm_unplug_dev(struct drm_device *dev);
|
||||||
extern unsigned int drm_debug;
|
extern unsigned int drm_debug;
|
||||||
|
|
||||||
extern unsigned int drm_vblank_offdelay;
|
extern int drm_vblank_offdelay;
|
||||||
extern unsigned int drm_timestamp_precision;
|
extern unsigned int drm_timestamp_precision;
|
||||||
extern unsigned int drm_timestamp_monotonic;
|
extern unsigned int drm_timestamp_monotonic;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue