[PATCH] drm: Use raw monotonic clock

Daniel Vetter daniel at ffwll.ch
Wed Aug 12 02:39:48 PDT 2015


On Tue, Aug 11, 2015 at 11:46:11AM -0400, Abhilash Jindal wrote:
> Wall time obtained from do_gettimeofday is susceptible to sudden jumps due to
> user setting the time or due to NTP.
> 
> Raw monotonic time is constantly increasing time and isn't affected by NTP
> adjustments better suited for comparing two timestamps in short intervals.
> 
> Signed-off-by: Abhilash Jindal <klock.android at gmail.com>

Do you actually have a via card supported by this driver, including the
corresponding userspace stack? Note that the userspace opengl driver for
this has been nuked in upstream mesa years ago ...
-Daniel

> ---
>  drivers/gpu/drm/via/via_drv.h |    2 +-
>  drivers/gpu/drm/via/via_irq.c |   14 +++-----------
>  2 files changed, 4 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/via/via_drv.h b/drivers/gpu/drm/via/via_drv.h
> index ef8c500..7b1b4f2 100644
> --- a/drivers/gpu/drm/via/via_drv.h
> +++ b/drivers/gpu/drm/via/via_drv.h
> @@ -74,7 +74,7 @@ typedef struct drm_via_private {
>  	volatile uint32_t *last_pause_ptr;
>  	volatile uint32_t *hw_addr_ptr;
>  	drm_via_ring_buffer_t ring;
> -	struct timeval last_vblank;
> +	ktime_t last_vblank;
>  	int last_vblank_valid;
>  	unsigned usec_per_vblank;
>  	atomic_t vbl_received;
> diff --git a/drivers/gpu/drm/via/via_irq.c b/drivers/gpu/drm/via/via_irq.c
> index 1319433..5a78117 100644
> --- a/drivers/gpu/drm/via/via_irq.c
> +++ b/drivers/gpu/drm/via/via_irq.c
> @@ -88,13 +88,6 @@ static int via_num_unichrome = ARRAY_SIZE(via_unichrome_irqs);
>  static int via_irqmap_unichrome[] = {-1, -1, -1, 0, -1, 1};
>  
>  
> -static unsigned time_diff(struct timeval *now, struct timeval *then)
> -{
> -	return (now->tv_usec >= then->tv_usec) ?
> -		now->tv_usec - then->tv_usec :
> -		1000000 - (then->tv_usec - now->tv_usec);
> -}
> -
>  u32 via_get_vblank_counter(struct drm_device *dev, int crtc)
>  {
>  	drm_via_private_t *dev_priv = dev->dev_private;
> @@ -110,7 +103,7 @@ irqreturn_t via_driver_irq_handler(int irq, void *arg)
>  	drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
>  	u32 status;
>  	int handled = 0;
> -	struct timeval cur_vblank;
> +	ktime_t cur_vblank;
>  	drm_via_irq_t *cur_irq = dev_priv->via_irqs;
>  	int i;
>  
> @@ -118,11 +111,10 @@ irqreturn_t via_driver_irq_handler(int irq, void *arg)
>  	if (status & VIA_IRQ_VBLANK_PENDING) {
>  		atomic_inc(&dev_priv->vbl_received);
>  		if (!(atomic_read(&dev_priv->vbl_received) & 0x0F)) {
> -			do_gettimeofday(&cur_vblank);
> +			cur_vblank = ktime_get_raw();
>  			if (dev_priv->last_vblank_valid) {
>  				dev_priv->usec_per_vblank =
> -					time_diff(&cur_vblank,
> -						  &dev_priv->last_vblank) >> 4;
> +				ktime_to_us(ktime_sub(cur_vblank, dev_priv->last_vblank)) >> 4;
>  			}
>  			dev_priv->last_vblank = cur_vblank;
>  			dev_priv->last_vblank_valid = 1;
> -- 
> 1.7.9.5
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch


More information about the dri-devel mailing list