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