• Vladimir Lypak's avatar
    drm/msm/a5xx: workaround early ring-buffer emptiness check · a30f9f65
    Vladimir Lypak authored
    There is another cause for soft lock-up of GPU in empty ring-buffer:
    race between GPU executing last commands and CPU checking ring for
    emptiness. On GPU side IRQ for retire is triggered by CACHE_FLUSH_TS
    event and RPTR shadow (which is used to check ring emptiness) is updated
    a bit later from CP_CONTEXT_SWITCH_YIELD. Thus if GPU is executing its
    last commands slow enough or we check that ring too fast we will miss a
    chance to trigger switch to lower priority ring because current ring isn't
    empty just yet. This can escalate to lock-up situation described in
    previous patch.
    To work-around this issue we keep track of last submit sequence number
    for each ring and compare it with one written to memptrs from GPU during
    execution of CACHE_FLUSH_TS event.
    
    Fixes: b1fc2839 ("drm/msm: Implement preemption for A5XX targets")
    Signed-off-by: default avatarVladimir Lypak <vladimir.lypak@gmail.com>
    Patchwork: https://patchwork.freedesktop.org/patch/612047/Signed-off-by: default avatarRob Clark <robdclark@chromium.org>
    a30f9f65
a5xx_gpu.c 55.7 KB