drm/etnaviv: space out IOVA layout for cmdbufs on MMUv2
authorLucas Stach <l.stach@pengutronix.de>
Thu, 15 Sep 2016 11:06:43 +0000 (13:06 +0200)
committerLucas Stach <l.stach@pengutronix.de>
Thu, 15 Sep 2016 13:29:44 +0000 (15:29 +0200)
At least on the GC3000 the FE MMU is not properly flushing stale TLB
entries. Make sure to map the cmdbufs with a big enough spacing in
the IOVAs to not hit old/prefetched TLB entries when jumping to a
newly mapped cmdbuf.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
drivers/gpu/drm/etnaviv/etnaviv_mmu.c

index 304c0b4..d3796ed 100644 (file)
@@ -342,7 +342,12 @@ u32 etnaviv_iommu_get_cmdbuf_va(struct etnaviv_gpu *gpu,
                        mutex_unlock(&mmu->lock);
                        return 0;
                }
-               mmu->last_iova = buf->vram_node.start + buf->size;
+               /*
+                * At least on GC3000 the FE MMU doesn't properly flush old TLB
+                * entries. Make sure to space the command buffers out in a way
+                * that the FE MMU prefetch won't load invalid entries.
+                */
+               mmu->last_iova = buf->vram_node.start + buf->size + SZ_64K;
                gpu->mmu->need_flush = true;
                mutex_unlock(&mmu->lock);