• Shayenne Moura's avatar
    drm/vkms: Bugfix extra vblank frame · def35e7c
    Shayenne Moura authored
    kms_flip tests are breaking on vkms when simulate vblank because vblank
    event sequence count returns one extra frame after arm vblank event to
    make a page flip.
    
    When vblank interrupt happens, userspace processes the vblank event and
    issues the next page flip command. Kernel calls queue_work to call
    commit_planes and arm the new page flip. The next vblank picks up the
    newly armed vblank event and vblank interrupt happens again.
    
    The arm and vblank event are asynchronous, then, on the next vblank, we
    receive x+2 from `get_vblank_timestamp`, instead x+1, although timestamp
    and vblank seqno matches.
    
    Function `get_vblank_timestamp` is reached by 2 ways:
    
      - from `drm_mode_page_flip_ioctl`: driver is doing one atomic
        operation to synchronize planes in the same output. There is no
        vblank simulation, the `drm_crtc_arm_vblank_event` function adds 1
        on vblank count, and the variable in_vblank_irq is false
      - from `vkms_vblank_simulate`: since the driver is doing a vblank
        simulation, the variable in_vblank_irq is true.
    
    Fix this problem subtracting one vblank period from vblank_time when
    `get_vblank_timestamp` is called from trace `drm_mode_page_flip_ioctl`,
    i.e., is not a real vblank interrupt, and getting the timestamp and
    vblank seqno when it is a real vblank interrupt.
    
    The reason for all this is that get_vblank_timestamp always supplies the
    timestamp for the next vblank event. The hrtimer is the vblank
    simulator, and it needs the correct previous value to present the next
    vblank. Since this is how hw timestamp registers work and what the
    vblank core expects.
    Signed-off-by: default avatarShayenne Moura <shayenneluzmoura@gmail.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
    Reviewed-by: default avatarRodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
    Signed-off-by: default avatarRodrigo Siqueira <rodrigosiqueiramelo@gmail.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/171e6e1c239cbca0c3df7183ed8acdfeeace9cf4.1548856186.git.shayenneluzmoura@gmail.com
    def35e7c
vkms_crtc.c 6.23 KB