• Daniel Vetter's avatar
    drm/i915: correctly restore fences with objects attached · 94a335db
    Daniel Vetter authored
    To avoid stalls we delay tiling changes and especially hold of
    committing the new fence state for as long as possible.
    Synchronization points are in the execbuf code and in our gtt fault
    handler.
    
    Unfortunately we've missed that tricky detail when adding proper fence
    restore code in
    
    commit 19b2dbde
    Author: Chris Wilson <chris@chris-wilson.co.uk>
    Date:   Wed Jun 12 10:15:12 2013 +0100
    
        drm/i915: Restore fences after resume and GPU resets
    
    The result was that we've restored fences for objects with no tiling,
    since the object<->fence link still existed after resume. Now that
    wouldn't have been too bad since any subsequent access would have
    fixed things up, but if we've changed from tiled to untiled real havoc
    happened:
    
    The tiling stride is stored -1 in the fence register, so a stride of 0
    resulted in all 1s in the top 32bits, and so a completely bogus fence
    spanning everything from the start of the object to the top of the
    GTT. The tell-tale in the register dumps looks like:
    
                     FENCE START 2: 0x0214d001
                     FENCE END 2: 0xfffff3ff
    
    Bit 11 isn't set since the hw doesn't store it, even when writing all
    1s (at least on my snb here).
    
    To prevent such a gaffle in the future add a sanity check for fences
    with an untiled object attached in i915_gem_write_fence.
    
    v2: Fix the WARN, spotted by Chris.
    
    v3: Trying to reuse get_fences looked ugly and obfuscated the code.
    Instead reuse update_fence and to make it really dtrt also move the
    fence dirty state clearing into update_fence.
    
    Cc: Chris Wilson <chris@chris-wilson.co.uk>
    Cc: Stéphane Marchesin <marcheu@chromium.org>
    Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=60530
    Cc: stable@vger.kernel.org (for 3.10 only)
    Reviewed-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Tested-by: default avatarMatthew Garrett <matthew.garrett@nebula.com>
    Tested-by: default avatarBjörn Bidar <theodorstormgrade@gmail.com>
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    94a335db
i915_gem.c 115 KB