[PATCH v3 6/8] drm/panthor: Add a panthor_vm_pre_fault_range() helper
Boris Brezillon
boris.brezillon at collabora.com
Fri Apr 4 09:26:32 UTC 2025
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 at collabora.com>
---
drivers/gpu/drm/panthor/panthor_mmu.c | 25 +++++++++++++++++++++++++
drivers/gpu/drm/panthor/panthor_mmu.h | 2 ++
2 files changed, 27 insertions(+)
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);
--
2.49.0
More information about the dri-devel
mailing list