xref: /linux/drivers/gpu/drm/panthor/panthor_mmu.h (revision b2f1e6301efa4a80becdb0715416c3cbc693fbb4)
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