• Ville Syrjälä's avatar
    drm/i915: Disallow plane x+w>stride on ilk+ with X-tiling · 59fb8218
    Ville Syrjälä authored
    ilk+ planes get notably unhappy when the plane x+w exceeds
    the stride. This wasn't a problem previously because we
    always aligned SURF to the closest tile boundary so the
    x offset never got particularly large. But now with async
    flips we have to align to 256KiB instead and thus this
    becomes a real issue.
    
    On ilk/snb/ivb it looks like the accesses just wrap
    early to the next tile row when scanout goes past the
    SURF+n*stride boundary, hsw/bdw suffer more heavily and
    start to underrun constantly. i965/g4x appear to be immune.
    vlv/chv I've not yet checked.
    
    Let's borrow another trick from the skl+ code and search
    backwards for a better SURF offset in the hopes of getting the
    x offset below the limit. IIRC when I ran into a similar issue
    on skl years ago it was causing the hardware to fall over
    pretty hard as well.
    
    And let's be consistent and include i965/g4x in the check
    as well, just in case I just got super lucky somehow when
    I wasn't able to reproduce the issue. Not that it really
    matters since we still use 4k SURF alignment for i965/g4x
    anyway.
    
    Fixes: 6ede6b06 ("drm/i915: Implement async flips for vlv/chv")
    Fixes: 4bb18054 ("drm/i915: Implement async flip for ilk/snb")
    Fixes: 2a636e24 ("drm/i915: Implement async flip for ivb/hsw")
    Fixes: cda195f1 ("drm/i915: Implement async flips for bdw")
    Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20210209021918.16234-1-ville.syrjala@linux.intel.comReviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    59fb8218
i9xx_plane.c 28.9 KB