[Intel-gfx] [PATCH 7/9] drm: Disable vblank interrupt immediately when drm_vblank_offdelay==0

Daniel Vetter daniel at ffwll.ch
Mon May 26 15:02:28 CEST 2014


On Mon, May 26, 2014 at 02:46:30PM +0300, ville.syrjala at linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
> 
> Make drm_vblank_put() disable the vblank interrupt immediately when the
> refcount drops to zero and drm_vblank_offdelay==0.
> 
> Currently drm_vblank_put() would just leave vblank interrupts enabled all
> the time if drm_vblank_offdelay==0. In case someone might still want that
> behaviour drm_vblank_offdelay is now signed and a negative value will
> allow the user to keep vblank interrupts on all the time. Well, since
> the first drm_vblank_get() anyway.
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala at linux.intel.com>

I think what we actually want is a new dev->vblank_is_race_free or
something which is a boolean. Then we can keep the drm_vblank_offdelay
as-is and seletively kill the entire logic for drivers where this works
correctly.
-Daniel

> ---
>  Documentation/DocBook/drm.tmpl          |  1 +
>  drivers/gpu/drm/drm_irq.c               | 11 +++++++----
>  drivers/gpu/drm/drm_stub.c              |  4 ++--
>  drivers/gpu/drm/exynos/exynos_drm_drv.h |  2 +-
>  include/drm/drmP.h                      |  2 +-
>  5 files changed, 12 insertions(+), 8 deletions(-)
> 
> diff --git a/Documentation/DocBook/drm.tmpl b/Documentation/DocBook/drm.tmpl
> index 9574bf2..25632b0 100644
> --- a/Documentation/DocBook/drm.tmpl
> +++ b/Documentation/DocBook/drm.tmpl
> @@ -2508,6 +2508,7 @@ void (*disable_vblank) (struct drm_device *dev, int crtc);</synopsis>
>        by scheduling a timer. The delay is accessible through the vblankoffdelay
>        module parameter or the <varname>drm_vblank_offdelay</varname> global
>        variable and expressed in milliseconds. Its default value is 5000 ms.
> +      Zero means disable immediately, and a negative value means never disable.
>      </para>
>      <para>
>        When a vertical blanking interrupt occurs drivers only need to call the
> diff --git a/drivers/gpu/drm/drm_irq.c b/drivers/gpu/drm/drm_irq.c
> index 54cb85d..54a56b2 100644
> --- a/drivers/gpu/drm/drm_irq.c
> +++ b/drivers/gpu/drm/drm_irq.c
> @@ -978,10 +978,13 @@ void drm_vblank_put(struct drm_device *dev, int crtc)
>  	BUG_ON(atomic_read(&dev->vblank[crtc].refcount) == 0);
>  
>  	/* Last user schedules interrupt disable */
> -	if (atomic_dec_and_test(&dev->vblank[crtc].refcount) &&
> -	    (drm_vblank_offdelay > 0))
> -		mod_timer(&dev->vblank[crtc].disable_timer,
> -			  jiffies + ((drm_vblank_offdelay * HZ)/1000));
> +	if (atomic_dec_and_test(&dev->vblank[crtc].refcount)) {
> +		if (drm_vblank_offdelay > 0)
> +			mod_timer(&dev->vblank[crtc].disable_timer,
> +				  jiffies + ((drm_vblank_offdelay * HZ)/1000));
> +		else if (drm_vblank_offdelay == 0)
> +			vblank_disable_fn((unsigned long)&dev->vblank[crtc]);
> +	}
>  }
>  EXPORT_SYMBOL(drm_vblank_put);
>  
> diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
> index 3727ac8..8758f81 100644
> --- a/drivers/gpu/drm/drm_stub.c
> +++ b/drivers/gpu/drm/drm_stub.c
> @@ -49,7 +49,7 @@ EXPORT_SYMBOL(drm_rnodes);
>  unsigned int drm_universal_planes = 0;
>  EXPORT_SYMBOL(drm_universal_planes);
>  
> -unsigned int drm_vblank_offdelay = 5000;    /* Default to 5000 msecs. */
> +int drm_vblank_offdelay = 5000;    /* Default to 5000 msecs. */
>  EXPORT_SYMBOL(drm_vblank_offdelay);
>  
>  unsigned int drm_timestamp_precision = 20;  /* Default to 20 usecs. */
> @@ -66,7 +66,7 @@ MODULE_DESCRIPTION(CORE_DESC);
>  MODULE_LICENSE("GPL and additional rights");
>  MODULE_PARM_DESC(debug, "Enable debug output");
>  MODULE_PARM_DESC(rnodes, "Enable experimental render nodes API");
> -MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [msecs]");
> +MODULE_PARM_DESC(vblankoffdelay, "Delay until vblank irq auto-disable [msecs] (< 0 means never disable)");
>  MODULE_PARM_DESC(timestamp_precision_usec, "Max. error on timestamps [usecs]");
>  MODULE_PARM_DESC(timestamp_monotonic, "Use monotonic timestamps");
>  
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.h b/drivers/gpu/drm/exynos/exynos_drm_drv.h
> index ce3e6a3..9734bec 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_drv.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.h
> @@ -40,7 +40,7 @@ struct drm_device;
>  struct exynos_drm_overlay;
>  struct drm_connector;
>  
> -extern unsigned int drm_vblank_offdelay;
> +extern int drm_vblank_offdelay;
>  
>  /* this enumerates display type. */
>  enum exynos_drm_output_type {
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 76ccaab..979a498 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -1404,7 +1404,7 @@ extern unsigned int drm_debug;
>  extern unsigned int drm_rnodes;
>  extern unsigned int drm_universal_planes;
>  
> -extern unsigned int drm_vblank_offdelay;
> +extern int drm_vblank_offdelay;
>  extern unsigned int drm_timestamp_precision;
>  extern unsigned int drm_timestamp_monotonic;
>  
> -- 
> 1.8.5.5
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch



More information about the Intel-gfx mailing list