@@ -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;
@@ -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);
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(+)