[PATCH RFC 051/111] staging: etnaviv: implement round-robin GPU MMU allocation
Lucas Stach
l.stach at pengutronix.de
Thu Apr 2 08:29:53 PDT 2015
From: Russell King <rmk+kernel at arm.linux.org.uk>
In order to avoid flushing the GPU MMU every time we unmap and remap,
allocate MMU addresses in a round-robin fashion. When we have to wrap
back to the beginning, indicate that the MMU needs to be flushed.
Signed-off-by: Russell King <rmk+kernel at arm.linux.org.uk>
---
drivers/staging/etnaviv/etnaviv_mmu.c | 23 +++++++++++++++++++++--
drivers/staging/etnaviv/etnaviv_mmu.h | 1 +
2 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/drivers/staging/etnaviv/etnaviv_mmu.c b/drivers/staging/etnaviv/etnaviv_mmu.c
index 4589995b83ff..4fbba26a3f37 100644
--- a/drivers/staging/etnaviv/etnaviv_mmu.c
+++ b/drivers/staging/etnaviv/etnaviv_mmu.c
@@ -117,10 +117,29 @@ int etnaviv_iommu_map_gem(struct etnaviv_iommu *mmu,
if (!node)
return -ENOMEM;
- ret = drm_mm_insert_node(&mmu->mm, node, etnaviv_obj->base.size, 0,
- DRM_MM_SEARCH_DEFAULT);
+ while (1) {
+ ret = drm_mm_insert_node_in_range(&mmu->mm, node,
+ etnaviv_obj->base.size, 0, mmu->last_iova, ~0UL,
+ DRM_MM_SEARCH_DEFAULT);
+
+ if (ret != -ENOSPC)
+ break;
+
+ /*
+ * If we did not search from the start of the MMU region,
+ * try again in case there are free slots.
+ */
+ if (mmu->last_iova) {
+ mmu->last_iova = 0;
+ mmu->need_flush = true;
+ continue;
+ }
+
+ break;
+ }
if (!ret) {
+ mmu->last_iova = node->start + etnaviv_obj->base.size;
offset = node->start;
etnaviv_obj->iova = offset;
etnaviv_obj->gpu_vram_node = node;
diff --git a/drivers/staging/etnaviv/etnaviv_mmu.h b/drivers/staging/etnaviv/etnaviv_mmu.h
index 262c4e26e901..a37affda9590 100644
--- a/drivers/staging/etnaviv/etnaviv_mmu.h
+++ b/drivers/staging/etnaviv/etnaviv_mmu.h
@@ -26,6 +26,7 @@ struct etnaviv_iommu {
/* memory manager for GPU address area */
struct drm_mm mm;
+ uint32_t last_iova;
bool need_flush;
};
--
2.1.4
More information about the dri-devel
mailing list