• Ville Syrjälä's avatar
    drm/i915: Fix vblank timestamps with VRR · 7a2ec4a0
    Ville Syrjälä authored
    To get sensible vblank timestamping behaviour we need to feed
    the vmax based timings to the vblank code, otherwise it'll chop
    off the scanline counter when it exceeds the minumum vtotal.
    
    Additionally with VRR we have three cases to consider when we
    generate the vblank timestamp:
    1) we are in vertical active
      -> nothing special needs to be done, just return the current
         scanout position and the core will calculate the timestamp
         corresponding to the past time when the current vertical
         active started
    2) we are in vertical blank and no push has been sent
      -> the hardware will keep extending the vblank presumably
         to its maximum length, so we make the timestmap match the
         expected time when the max length vblank will end. Since
         the timings used for this are now based on vmax nothing
         special actually needs to be done
    3) we are in vblank and a push has been sent so the vblank is
       about to terminate
      -> presumably we want the timestmap to accurately reflect
         when the vblank will terminate, so we use the sampled
         frame timestamp vs. current timestamp to guesstimate
         how far along the vblank exit we are, and then we
         adjust the reported scanout position accordingly so
         that the core will see that the vblank is close to
         ending.
    
    v2:
    * Fix the else if (use_scanline_Counter) (Manasi)
    Signed-off-by: default avatarManasi Navare <manasi.d.navare@intel.com>
    Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Reviewed-by: default avatarManasi Navare <manasi.d.navare@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210122232647.22688-17-manasi.d.navare@intel.com
    7a2ec4a0
intel_display.c 467 KB