• Mario Kleiner's avatar
    drm/vc4: Make pageflip completion handling more robust. · 56d1fe09
    Mario Kleiner authored
    Protect both the setup of the pageflip event and the
    latching of the new requested displaylist head pointer
    by the event lock, so we can't get into a situation
    where vc4_atomic_flush latches the new display list via
    HVS_WRITE, then immediately gets preempted before queueing
    the pageflip event, then the page-flip completes in hw and
    the vc4_crtc_handle_page_flip() runs and no-ops due to
    lack of a pending pageflip event, then vc4_atomic_flush
    continues and only then queues the pageflip event - after
    the page flip handling already no-oped. This would cause
    flip completion handling only at the next vblank - one
    frame too late.
    
    In vc4_crtc_handle_page_flip() check the actual DL head
    pointer in SCALER_DISPLACTX against the requested pointer
    for page flip to make sure that the flip actually really
    completed in the current vblank and doesn't get deferred
    to the next one because the DL head pointer was written
    a bit too late into SCALER_DISPLISTX, after start of
    vblank, and missed the boat. This avoids handling a
    pageflip completion too early - one frame too early.
    
    According to Eric, DL head pointer updates which were
    written into the HVS DISPLISTX reg get committed to hardware
    at the last pixel of active scanout. Our vblank interrupt
    handler, as triggered by PV_INT_VFP_START irq, gets to run
    earliest at the first pixel of HBLANK at the end of the
    last scanline of active scanout, ie. vblank irq handling
    runs at least 1 pixel duration after a potential pageflip
    completion happened in hardware.
    
    This ordering of events in the hardware, together with the
    lock protection and SCALER_DISPLACTX sampling of this patch,
    guarantees that pageflip completion handling only runs at
    exactly the vblank irq of actual pageflip completion in all
    cases.
    
    Background info from Eric about the relative timing of
    HVS, PV's and trigger points for interrupts, DL updates:
    
    https://lists.freedesktop.org/archives/dri-devel/2016-May/107510.html
    
    Tested on RPi 2B with hardware timing measurement equipment
    and shown to no longer complete flips too early or too late.
    Signed-off-by: default avatarMario Kleiner <mario.kleiner.de@gmail.com>
    Reviewed-by: default avatarEric Anholt <eric@anholt.net>
    56d1fe09
vc4_regs.h 24.4 KB