• Chris Wilson's avatar
    drm/i915: Fix incoherence with fence updates on Sandybridge+ · d18b9619
    Chris Wilson authored
    This hopefully fixes the root cause behind the workaround added in
    
    commit 25ff1195
    Author: Chris Wilson <chris@chris-wilson.co.uk>
    Date:   Thu Apr 4 21:31:03 2013 +0100
    
        drm/i915: Workaround incoherence between fences and LLC across multiple CPUs
    
    Thanks to further investigation by Jon Bloomfield, he realised that
    the 64-bit register might be broken up by the hardware into two 32-bit
    writes (a problem we have encountered elsewhere). This non-atomicity
    would then cause an issue where a second thread would see an
    intermediate register state (new high dword, old low dword), and this
    register would randomly be used in preference to its own thread register.
    This would cause the second thread to read from and write into a fairly
    random tiled location.  Breaking the operation into 3 explicit 32-bit
    updates (first disable the fence, poke the upper bits, then poke the lower
    bits and enable) ensures that, given proper serialisation between the
    32-bit register write and the memory transfer, that the fence value is
    always consistent.
    
    Armed with this knowledge, we can explain how the previous workaround
    work. The key to the corruption is that a second thread sees an
    erroneous fence register that conflicts and overrides its own. By
    serialising the fence update across all CPUs, we have a small window
    where no GTT access is occurring and so hide the potential corruption.
    This also leads to the conclusion that the earlier workaround was
    incomplete.
    
    v2: Be overly paranoid about the order in which fence updates become
    visible to the GPU to make really sure that we turn the fence off before
    doing the update, and then only switch the fence on afterwards.
    Signed-off-by: default avatarJon Bloomfield <jon.bloomfield@intel.com>
    Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
    Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
    Cc: Carsten Emde <C.Emde@osadl.org>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
    d18b9619
i915_gem.c 116 KB