Skip to content

Commit

Permalink
drm: Zero out invalid vblank timestamp in drm_update_vblank_count. (v2)
Browse files Browse the repository at this point in the history
Since commit 844b03f we make
sure that after vblank irq off, we return the last valid
(vblank count, vblank timestamp) pair to clients, e.g., during
modesets, which is good.

An overlooked side effect of that commit for kms drivers without
support for precise vblank timestamping is that at vblank irq
enable, when we update the vblank counter from the hw counter, we
can't update the corresponding vblank timestamp, so now we have a
totally mismatched timestamp for the new count to confuse clients.

Restore old client visible behaviour from before Linux 3.18, but
zero out the timestamp at vblank counter update (instead of disable
as in original implementation) if we can't generate a meaningful
timestamp immediately for the new vblank counter. This will fix
this regression, so callers know they need to retry again later
if they need a valid timestamp, but at the same time preserves
the improvements made in the commit mentioned above.

v2: Rebased on top of Daniel Vetter's fixup and documentation
    patch for timestamp updates. Drop request for stable kernel
    backport as this would be more difficult, unless the original
    patch would get applied to stable kernels.

Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Daniel Vetter <daniel@ffwll.ch>
Cc: Dave Airlie <airlied@redhat.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
  • Loading branch information
Mario Kleiner authored and Daniel Vetter committed May 4, 2015
1 parent 5a8b21b commit d66a1e3
Showing 1 changed file with 6 additions and 3 deletions.
9 changes: 6 additions & 3 deletions drivers/gpu/drm/drm_irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -161,10 +161,13 @@ static void drm_update_vblank_count(struct drm_device *dev, int crtc)

/*
* Only reinitialize corresponding vblank timestamp if high-precision query
* available and didn't fail. Will reinitialize delayed at next vblank
* interrupt in that case.
* available and didn't fail. Otherwise reinitialize delayed at next vblank
* interrupt and assign 0 for now, to mark the vblanktimestamp as invalid.
*/
store_vblank(dev, crtc, diff, rc ? &t_vblank : NULL);
if (!rc)
t_vblank = (struct timeval) {0, 0};

store_vblank(dev, crtc, diff, &t_vblank);
}

/*
Expand Down

0 comments on commit d66a1e3

Please sign in to comment.