• Mario Kleiner's avatar
    drm: No-Op redundant calls to drm_vblank_off() (v2) · e8235891
    Mario Kleiner authored
    Otherwise if a kms driver calls into drm_vblank_off() more than once
    before calling drm_vblank_on() again, the redundant calls to
    vblank_disable_and_save() will call drm_update_vblank_count()
    while hw vblank counters and vblank timestamping are in a undefined
    state during modesets, dpms off etc.
    
    At least with the legacy drm helpers it is not unusual to
    get multiple calls to drm_vblank_off and drm_vblank_on, e.g.,
    half a dozen calls to drm_vblank_off and two calls to drm_vblank_on
    were observed on radeon-kms during dpms-off -> dpms-on transition.
    
    We don't no-op calls from atomic modesetting drivers, as they
    should do a proper job of tracking hw state.
    
    Fixes large jumps of the software maintained vblank counter due to
    the hardware vblank counter resetting to zero during dpms off or
    modeset, e.g., if radeon-kms is modified to use drm_vblank_off/on
    instead of drm_vblank_pre/post_modeset().
    
    This fixes a regression caused by the changes made to
    drm_update_vblank_count() in Linux 4.4.
    
    v2: Don't no-op on atomic modesetting drivers, per suggestion
        of Daniel Vetter.
    Signed-off-by: default avatarMario Kleiner <mario.kleiner.de@gmail.com>
    Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    Cc: <stable@vger.kernel.org> # 4.4+
    Cc: michel@daenzer.net
    Cc: vbabka@suse.cz
    Cc: ville.syrjala@linux.intel.com
    Cc: alexander.deucher@amd.com
    Cc: christian.koenig@amd.com
    Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
    e8235891
drm_irq.c 55.6 KB