• Mario Kleiner's avatar
    drm/radeon: Prevent races on pre DCE4 between flip submission and completion. · 363926dc
    Mario Kleiner authored
    Pre DCE4 hw doesn't have reliable pageflip completion
    interrupts, so instead polling for flip completion is
    used from within the vblank irq handler to complete
    page flips.
    
    This causes a race if pageflip ioctl is called close to
    vblank:
    
    1. pageflip ioctl queues execution of radeon_flip_work_func.
    
    2. vblank irq fires, radeon_crtc_handle_vblank checks for
       flip_status == FLIP_SUBMITTED finds none, no-ops.
    
    3. radeon_flip_work_func runs inside vblank, decides to
       set flip_status == FLIP_SUBMITTED and programs the
       flip into hw.
    
    4. hw executes flip immediately (because in vblank), but
       as 2 already happened, the flip completion routine only
       emits the flip completion event one refresh later ->
       wrong vblank count/timestamp for completion and no
       performance gain, as instead of delaying the flip until
       next vblank, we now delay the next flip by 1 refresh
       while waiting for the delayed flip completion event.
    
    Given we often don't gain anything due to this race, but
    lose precision, prevent the programmed flip from executing
    in vblank on pre DCE4 asics to avoid this race.
    
    On pre-AVIVO hw we can't program the hw for edge-triggered
    flips, they always execute anywhere in vblank. Therefore delay
    the actual flip programming until after vblank on pre-AVIVO.
    Reviewed-by: default avatarMichel Dänzer <michel.daenzer@amd.com>
    Signed-off-by: default avatarMario Kleiner <mario.kleiner.de@gmail.com>
    Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
    363926dc
radeon_display.c 61.4 KB