drm/i915/selftests: Unconditionally do a chipset flush before emit_bb_start
authorChris Wilson <chris@chris-wilson.co.uk>
Mon, 6 Aug 2018 14:46:04 +0000 (15:46 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Mon, 6 Aug 2018 19:34:49 +0000 (20:34 +0100)
Experience teaches us over and over again that coherency on Baytrail
requires the odd heavy hammer, and in particular clflush alone is not
enough to guarrantee that writes from the CPU are picked up by the CS.
Do as we do elsewhere and ensure we have an unconditional
i915_gem_chipset_flush() after writing to memory and submitting a batch
to HW.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=107499
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180806144604.8346-1-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/selftests/huge_pages.c

index 7efb326badcd677e98ddfe5c6d1e869d201492ba..e272127783fe8abaa0a1fce03ef28cce32beada5 100644 (file)
@@ -906,7 +906,11 @@ gpu_write_dw(struct i915_vma *vma, u64 offset, u32 val)
        if (IS_ERR(obj))
                return ERR_CAST(obj);
 
-       cmd = i915_gem_object_pin_map(obj, I915_MAP_WB);
+       err = i915_gem_object_set_to_wc_domain(obj, true);
+       if (err)
+               goto err;
+
+       cmd = i915_gem_object_pin_map(obj, I915_MAP_WC);
        if (IS_ERR(cmd)) {
                err = PTR_ERR(cmd);
                goto err;
@@ -936,13 +940,10 @@ gpu_write_dw(struct i915_vma *vma, u64 offset, u32 val)
        }
 
        *cmd = MI_BATCH_BUFFER_END;
+       i915_gem_chipset_flush(i915);
 
        i915_gem_object_unpin_map(obj);
 
-       err = i915_gem_object_set_to_gtt_domain(obj, false);
-       if (err)
-               goto err;
-
        batch = i915_vma_instance(obj, vma->vm, NULL);
        if (IS_ERR(batch)) {
                err = PTR_ERR(batch);