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

Reply via email to