diff mbox series

[v3,6/8] drm/panthor: Add a panthor_vm_pre_fault_range() helper

Message ID 20250404092634.2968115-7-boris.brezillon@collabora.com (mailing list archive)
State New
Headers show
Series drm: Introduce sparse GEM shmem | expand

Commit Message

Boris Brezillon April 4, 2025, 9:26 a.m. UTC
This allows one to pre-allocate resources on a sparse BO to avoid
faulting when the GPU accesses the memory region. Will be used by
the heap logic to pre-populate a heap object with a predefined number
of chunks.

Signed-off-by: Boris Brezillon <boris.brezillon@collabora.com>
---
 drivers/gpu/drm/panthor/panthor_mmu.c | 25 +++++++++++++++++++++++++
 drivers/gpu/drm/panthor/panthor_mmu.h |  2 ++
 2 files changed, 27 insertions(+)
diff mbox series

Patch

diff --git a/drivers/gpu/drm/panthor/panthor_mmu.c b/drivers/gpu/drm/panthor/panthor_mmu.c
index e05aaac10481..aea9b5f2ce64 100644
--- a/drivers/gpu/drm/panthor/panthor_mmu.c
+++ b/drivers/gpu/drm/panthor/panthor_mmu.c
@@ -1770,6 +1770,31 @@  static int panthor_vm_map_on_demand_locked(struct panthor_vm *vm,
 	return 0;
 }
 
+int panthor_vm_pre_fault_range(struct panthor_vm *vm, u64 iova, u64 size,
+			       gfp_t page_gfp, gfp_t other_gfp)
+{
+	struct panthor_gem_object *bo = NULL;
+	struct drm_gpuva *gpuva;
+	struct panthor_vma *vma;
+	int ret;
+
+	mutex_lock(&vm->op_lock);
+	gpuva = drm_gpuva_find_first(&vm->base, iova, 1);
+	vma = gpuva ? container_of(gpuva, struct panthor_vma, base) : NULL;
+	if (vma && vma->base.gem.obj)
+		bo = to_panthor_bo(vma->base.gem.obj);
+
+	if (bo && (bo->flags & DRM_PANTHOR_BO_ALLOC_ON_FAULT)) {
+		ret = panthor_vm_map_on_demand_locked(vm, vma, iova - vma->base.va.addr,
+						      size, page_gfp, other_gfp);
+	} else {
+		ret = -EFAULT;
+	}
+	mutex_unlock(&vm->op_lock);
+
+	return ret;
+}
+
 static void panthor_vm_handle_fault_locked(struct panthor_vm *vm)
 {
 	struct panthor_device *ptdev = vm->ptdev;
diff --git a/drivers/gpu/drm/panthor/panthor_mmu.h b/drivers/gpu/drm/panthor/panthor_mmu.h
index fc274637114e..d57c86d293bd 100644
--- a/drivers/gpu/drm/panthor/panthor_mmu.h
+++ b/drivers/gpu/drm/panthor/panthor_mmu.h
@@ -28,6 +28,8 @@  int panthor_vm_map_bo_range(struct panthor_vm *vm, struct panthor_gem_object *bo
 int panthor_vm_unmap_range(struct panthor_vm *vm, u64 va, u64 size);
 struct panthor_gem_object *
 panthor_vm_get_bo_for_va(struct panthor_vm *vm, u64 va, u64 *bo_offset);
+int panthor_vm_pre_fault_range(struct panthor_vm *vm, u64 iova, u64 size,
+			       gfp_t page_gfp, gfp_t other_gfp);
 
 int panthor_vm_active(struct panthor_vm *vm);
 void panthor_vm_idle(struct panthor_vm *vm);