aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
diff options
context:
space:
mode:
authorLucas Stach <l.stach@pengutronix.de>2016-09-15 13:06:43 +0200
committerLucas Stach <l.stach@pengutronix.de>2016-09-15 15:29:44 +0200
commit7c971c62dd543a323a0cabc0c559caea1759f59f (patch)
treefb8404e76bfc26d4c3abf762066d7407686897bf /drivers/gpu/drm/etnaviv/etnaviv_mmu.c
parentdrm/etnaviv: fix up model and revision for GC2000+ (diff)
downloadlinux-dev-7c971c62dd543a323a0cabc0c559caea1759f59f.tar.xz
linux-dev-7c971c62dd543a323a0cabc0c559caea1759f59f.zip
drm/etnaviv: space out IOVA layout for cmdbufs on MMUv2
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>
Diffstat (limited to 'drivers/gpu/drm/etnaviv/etnaviv_mmu.c')
-rw-r--r--drivers/gpu/drm/etnaviv/etnaviv_mmu.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
index 304c0b4a9d58..d3796ed8d8c5 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
@@ -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);