OSDN Git Service

agp/intel: Reinforce the barrier after GTT updates
authorChris Wilson <chris@chris-wilson.co.uk>
Fri, 10 Apr 2020 08:35:35 +0000 (09:35 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Fri, 10 Apr 2020 13:56:11 +0000 (14:56 +0100)
After changing the timing between GTT updates and execution on the GPU,
we started seeing sporadic failures on Ironlake. These were narrowed
down to being an insufficiently strong enough barrier/delay after
updating the GTT and scheduling execution on the GPU. By forcing the
uncached read, and adding the missing barrier for the singular
insert_page (relocation paths), the sporadic failures go away.

Fixes: 983d308cb8f6 ("agp/intel: Serialise after GTT updates")
Fixes: 3497971a71d8 ("agp/intel: Flush chipset writes after updating a single PTE")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Acked-by: Andi Shyti <andi.shyti@intel.com>
Cc: stable@vger.kernel.org # v4.0+
Link: https://patchwork.freedesktop.org/patch/msgid/20200410083535.25464-1-chris@chris-wilson.co.uk
drivers/char/agp/intel-gtt.c

index 66a62d1..3d42fc4 100644 (file)
@@ -846,6 +846,7 @@ void intel_gtt_insert_page(dma_addr_t addr,
                           unsigned int flags)
 {
        intel_private.driver->write_entry(addr, pg, flags);
+       readl(intel_private.gtt + pg);
        if (intel_private.driver->chipset_flush)
                intel_private.driver->chipset_flush();
 }
@@ -871,7 +872,7 @@ void intel_gtt_insert_sg_entries(struct sg_table *st,
                        j++;
                }
        }
-       wmb();
+       readl(intel_private.gtt + j - 1);
        if (intel_private.driver->chipset_flush)
                intel_private.driver->chipset_flush();
 }
@@ -1105,6 +1106,7 @@ static void i9xx_cleanup(void)
 
 static void i9xx_chipset_flush(void)
 {
+       wmb();
        if (intel_private.i9xx_flush_page)
                writel(1, intel_private.i9xx_flush_page);
 }