1 /* SPDX-License-Identifier: GPL-2.0 or MIT */ 2 /* Copyright 2019 Linaro, Ltd, Rob Herring <robh@kernel.org> */ 3 /* Copyright 2023 Collabora ltd. */ 4 /* Copyright 2025 ARM Limited. All rights reserved. */ 5 6 #ifndef __PANTHOR_MMU_H__ 7 #define __PANTHOR_MMU_H__ 8 9 #include <linux/dma-resv.h> 10 11 struct drm_exec; 12 struct drm_sched_job; 13 struct drm_memory_stats; 14 struct panthor_gem_object; 15 struct panthor_heap_pool; 16 struct panthor_vm; 17 struct panthor_vma; 18 struct panthor_mmu; 19 20 int panthor_mmu_init(struct panthor_device *ptdev); 21 void panthor_mmu_unplug(struct panthor_device *ptdev); 22 void panthor_mmu_pre_reset(struct panthor_device *ptdev); 23 void panthor_mmu_post_reset(struct panthor_device *ptdev); 24 void panthor_mmu_suspend(struct panthor_device *ptdev); 25 void panthor_mmu_resume(struct panthor_device *ptdev); 26 27 int panthor_vm_map_bo_range(struct panthor_vm *vm, struct panthor_gem_object *bo, 28 u64 offset, u64 size, u64 va, u32 flags); 29 int panthor_vm_unmap_range(struct panthor_vm *vm, u64 va, u64 size); 30 struct panthor_gem_object * 31 panthor_vm_get_bo_for_va(struct panthor_vm *vm, u64 va, u64 *bo_offset); 32 33 int panthor_vm_active(struct panthor_vm *vm); 34 void panthor_vm_idle(struct panthor_vm *vm); 35 u32 panthor_vm_page_size(struct panthor_vm *vm); 36 int panthor_vm_as(struct panthor_vm *vm); 37 38 struct panthor_heap_pool * 39 panthor_vm_get_heap_pool(struct panthor_vm *vm, bool create); 40 41 void panthor_vm_heaps_sizes(struct panthor_file *pfile, struct drm_memory_stats *stats); 42 43 struct panthor_vm *panthor_vm_get(struct panthor_vm *vm); 44 void panthor_vm_put(struct panthor_vm *vm); 45 struct panthor_vm *panthor_vm_create(struct panthor_device *ptdev, bool for_mcu, 46 u64 kernel_va_start, u64 kernel_va_size, 47 u64 kernel_auto_va_start, 48 u64 kernel_auto_va_size); 49 50 void panthor_vm_update_bo_reclaim_lru_locked(struct panthor_gem_object *bo); 51 int panthor_vm_evict_bo_mappings_locked(struct panthor_gem_object *bo); 52 unsigned long 53 panthor_mmu_reclaim_priv_bos(struct panthor_device *ptdev, 54 unsigned int nr_to_scan, unsigned long *remaining, 55 bool (*shrink)(struct drm_gem_object *, 56 struct ww_acquire_ctx *)); 57 int panthor_vm_prepare_mapped_bos_resvs(struct drm_exec *exec, 58 struct panthor_vm *vm, 59 u32 slot_count); 60 int panthor_vm_add_bos_resvs_deps_to_job(struct panthor_vm *vm, 61 struct drm_sched_job *job); 62 void panthor_vm_add_job_fence_to_bos_resvs(struct panthor_vm *vm, 63 struct drm_sched_job *job); 64 65 struct dma_resv *panthor_vm_resv(struct panthor_vm *vm); 66 struct drm_gem_object *panthor_vm_root_gem(struct panthor_vm *vm); 67 68 void panthor_vm_pool_destroy(struct panthor_file *pfile); 69 int panthor_vm_pool_create(struct panthor_file *pfile); 70 int panthor_vm_pool_create_vm(struct panthor_device *ptdev, 71 struct panthor_vm_pool *pool, 72 struct drm_panthor_vm_create *args); 73 int panthor_vm_pool_destroy_vm(struct panthor_vm_pool *pool, u32 handle); 74 struct panthor_vm *panthor_vm_pool_get_vm(struct panthor_vm_pool *pool, u32 handle); 75 76 bool panthor_vm_has_unhandled_faults(struct panthor_vm *vm); 77 bool panthor_vm_is_unusable(struct panthor_vm *vm); 78 79 /* 80 * PANTHOR_VM_KERNEL_AUTO_VA: Use this magic address when you want the GEM 81 * logic to auto-allocate the virtual address in the reserved kernel VA range. 82 */ 83 #define PANTHOR_VM_KERNEL_AUTO_VA ~0ull 84 85 int panthor_vm_alloc_va(struct panthor_vm *vm, u64 va, u64 size, 86 struct drm_mm_node *va_node); 87 void panthor_vm_free_va(struct panthor_vm *vm, struct drm_mm_node *va_node); 88 89 int panthor_vm_bind_exec_sync_op(struct drm_file *file, 90 struct panthor_vm *vm, 91 struct drm_panthor_vm_bind_op *op); 92 93 struct drm_sched_job * 94 panthor_vm_bind_job_create(struct drm_file *file, 95 struct panthor_vm *vm, 96 const struct drm_panthor_vm_bind_op *op); 97 void panthor_vm_bind_job_put(struct drm_sched_job *job); 98 int panthor_vm_bind_job_prepare_resvs(struct drm_exec *exec, 99 struct drm_sched_job *job); 100 void panthor_vm_bind_job_update_resvs(struct drm_exec *exec, struct drm_sched_job *job); 101 102 void panthor_vm_update_resvs(struct panthor_vm *vm, struct drm_exec *exec, 103 struct dma_fence *fence, 104 enum dma_resv_usage private_usage, 105 enum dma_resv_usage extobj_usage); 106 107 int panthor_mmu_pt_cache_init(void); 108 void panthor_mmu_pt_cache_fini(void); 109 110 #ifdef CONFIG_DEBUG_FS 111 void panthor_mmu_debugfs_init(struct drm_minor *minor); 112 #endif 113 114 #endif 115