1 1.1 riastrad /* $NetBSD: amdgpu_amdkfd.h,v 1.3 2021/12/18 23:44:58 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * Copyright 2014 Advanced Micro Devices, Inc. 5 1.1 riastrad * 6 1.1 riastrad * Permission is hereby granted, free of charge, to any person obtaining a 7 1.1 riastrad * copy of this software and associated documentation files (the "Software"), 8 1.1 riastrad * to deal in the Software without restriction, including without limitation 9 1.1 riastrad * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 1.1 riastrad * and/or sell copies of the Software, and to permit persons to whom the 11 1.1 riastrad * Software is furnished to do so, subject to the following conditions: 12 1.1 riastrad * 13 1.1 riastrad * The above copyright notice and this permission notice shall be included in 14 1.1 riastrad * all copies or substantial portions of the Software. 15 1.1 riastrad * 16 1.1 riastrad * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 1.1 riastrad * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 1.1 riastrad * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 1.1 riastrad * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 1.1 riastrad * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 1.1 riastrad * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 1.1 riastrad * OTHER DEALINGS IN THE SOFTWARE. 23 1.1 riastrad */ 24 1.1 riastrad 25 1.1 riastrad /* amdgpu_amdkfd.h defines the private interface between amdgpu and amdkfd. */ 26 1.1 riastrad 27 1.1 riastrad #ifndef AMDGPU_AMDKFD_H_INCLUDED 28 1.1 riastrad #define AMDGPU_AMDKFD_H_INCLUDED 29 1.1 riastrad 30 1.1 riastrad #include <linux/types.h> 31 1.3 riastrad #include <linux/mm.h> 32 1.3 riastrad #include <linux/workqueue.h> 33 1.1 riastrad #include <kgd_kfd_interface.h> 34 1.3 riastrad #include <drm/ttm/ttm_execbuf_util.h> 35 1.3 riastrad #include "amdgpu_sync.h" 36 1.3 riastrad #include "amdgpu_vm.h" 37 1.3 riastrad 38 1.3 riastrad extern uint64_t amdgpu_amdkfd_total_mem_size; 39 1.1 riastrad 40 1.1 riastrad struct amdgpu_device; 41 1.1 riastrad 42 1.3 riastrad struct kfd_bo_va_list { 43 1.3 riastrad struct list_head bo_list; 44 1.3 riastrad struct amdgpu_bo_va *bo_va; 45 1.3 riastrad void *kgd_dev; 46 1.3 riastrad bool is_mapped; 47 1.3 riastrad uint64_t va; 48 1.3 riastrad uint64_t pte_flags; 49 1.3 riastrad }; 50 1.3 riastrad 51 1.1 riastrad struct kgd_mem { 52 1.3 riastrad struct mutex lock; 53 1.1 riastrad struct amdgpu_bo *bo; 54 1.3 riastrad struct list_head bo_va_list; 55 1.3 riastrad /* protected by amdkfd_process_info.lock */ 56 1.3 riastrad struct ttm_validate_buffer validate_list; 57 1.3 riastrad struct ttm_validate_buffer resv_list; 58 1.3 riastrad uint32_t domain; 59 1.3 riastrad unsigned int mapped_to_gpu_memory; 60 1.3 riastrad uint64_t va; 61 1.3 riastrad 62 1.3 riastrad uint32_t alloc_flags; 63 1.3 riastrad 64 1.3 riastrad atomic_t invalid; 65 1.3 riastrad struct amdkfd_process_info *process_info; 66 1.3 riastrad 67 1.3 riastrad struct amdgpu_sync sync; 68 1.3 riastrad 69 1.3 riastrad bool aql_queue; 70 1.3 riastrad }; 71 1.3 riastrad 72 1.3 riastrad /* KFD Memory Eviction */ 73 1.3 riastrad struct amdgpu_amdkfd_fence { 74 1.3 riastrad struct dma_fence base; 75 1.3 riastrad struct mm_struct *mm; 76 1.3 riastrad spinlock_t lock; 77 1.3 riastrad char timeline_name[TASK_COMM_LEN]; 78 1.3 riastrad }; 79 1.3 riastrad 80 1.3 riastrad struct amdgpu_kfd_dev { 81 1.3 riastrad struct kfd_dev *dev; 82 1.3 riastrad uint64_t vram_used; 83 1.3 riastrad }; 84 1.3 riastrad 85 1.3 riastrad enum kgd_engine_type { 86 1.3 riastrad KGD_ENGINE_PFP = 1, 87 1.3 riastrad KGD_ENGINE_ME, 88 1.3 riastrad KGD_ENGINE_CE, 89 1.3 riastrad KGD_ENGINE_MEC1, 90 1.3 riastrad KGD_ENGINE_MEC2, 91 1.3 riastrad KGD_ENGINE_RLC, 92 1.3 riastrad KGD_ENGINE_SDMA1, 93 1.3 riastrad KGD_ENGINE_SDMA2, 94 1.3 riastrad KGD_ENGINE_MAX 95 1.3 riastrad }; 96 1.3 riastrad 97 1.3 riastrad struct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context, 98 1.3 riastrad struct mm_struct *mm); 99 1.3 riastrad bool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm); 100 1.3 riastrad struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f); 101 1.3 riastrad 102 1.3 riastrad struct amdkfd_process_info { 103 1.3 riastrad /* List head of all VMs that belong to a KFD process */ 104 1.3 riastrad struct list_head vm_list_head; 105 1.3 riastrad /* List head for all KFD BOs that belong to a KFD process. */ 106 1.3 riastrad struct list_head kfd_bo_list; 107 1.3 riastrad /* List of userptr BOs that are valid or invalid */ 108 1.3 riastrad struct list_head userptr_valid_list; 109 1.3 riastrad struct list_head userptr_inval_list; 110 1.3 riastrad /* Lock to protect kfd_bo_list */ 111 1.3 riastrad struct mutex lock; 112 1.3 riastrad 113 1.3 riastrad /* Number of VMs */ 114 1.3 riastrad unsigned int n_vms; 115 1.3 riastrad /* Eviction Fence */ 116 1.3 riastrad struct amdgpu_amdkfd_fence *eviction_fence; 117 1.3 riastrad 118 1.3 riastrad /* MMU-notifier related fields */ 119 1.3 riastrad atomic_t evicted_bos; 120 1.3 riastrad struct delayed_work restore_userptr_work; 121 1.3 riastrad struct pid *pid; 122 1.1 riastrad }; 123 1.1 riastrad 124 1.3 riastrad int amdgpu_amdkfd_init(void); 125 1.1 riastrad void amdgpu_amdkfd_fini(void); 126 1.1 riastrad 127 1.3 riastrad void amdgpu_amdkfd_suspend(struct amdgpu_device *adev); 128 1.3 riastrad int amdgpu_amdkfd_resume(struct amdgpu_device *adev); 129 1.3 riastrad void amdgpu_amdkfd_interrupt(struct amdgpu_device *adev, 130 1.3 riastrad const void *ih_ring_entry); 131 1.3 riastrad void amdgpu_amdkfd_device_probe(struct amdgpu_device *adev); 132 1.3 riastrad void amdgpu_amdkfd_device_init(struct amdgpu_device *adev); 133 1.3 riastrad void amdgpu_amdkfd_device_fini(struct amdgpu_device *adev); 134 1.3 riastrad 135 1.3 riastrad int amdgpu_amdkfd_evict_userptr(struct kgd_mem *mem, struct mm_struct *mm); 136 1.3 riastrad int amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine, 137 1.3 riastrad uint32_t vmid, uint64_t gpu_addr, 138 1.3 riastrad uint32_t *ib_cmd, uint32_t ib_len); 139 1.3 riastrad void amdgpu_amdkfd_set_compute_idle(struct kgd_dev *kgd, bool idle); 140 1.3 riastrad bool amdgpu_amdkfd_have_atomics_support(struct kgd_dev *kgd); 141 1.3 riastrad int amdgpu_amdkfd_flush_gpu_tlb_vmid(struct kgd_dev *kgd, uint16_t vmid); 142 1.3 riastrad int amdgpu_amdkfd_flush_gpu_tlb_pasid(struct kgd_dev *kgd, uint16_t pasid); 143 1.3 riastrad 144 1.3 riastrad bool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid); 145 1.3 riastrad 146 1.3 riastrad int amdgpu_amdkfd_pre_reset(struct amdgpu_device *adev); 147 1.1 riastrad 148 1.3 riastrad int amdgpu_amdkfd_post_reset(struct amdgpu_device *adev); 149 1.1 riastrad 150 1.3 riastrad void amdgpu_amdkfd_gpu_reset(struct kgd_dev *kgd); 151 1.1 riastrad 152 1.1 riastrad /* Shared API */ 153 1.3 riastrad int amdgpu_amdkfd_alloc_gtt_mem(struct kgd_dev *kgd, size_t size, 154 1.3 riastrad void **mem_obj, uint64_t *gpu_addr, 155 1.3 riastrad void **cpu_ptr, bool mqd_gfx9); 156 1.3 riastrad void amdgpu_amdkfd_free_gtt_mem(struct kgd_dev *kgd, void *mem_obj); 157 1.3 riastrad int amdgpu_amdkfd_alloc_gws(struct kgd_dev *kgd, size_t size, void **mem_obj); 158 1.3 riastrad void amdgpu_amdkfd_free_gws(struct kgd_dev *kgd, void *mem_obj); 159 1.3 riastrad int amdgpu_amdkfd_add_gws_to_process(void *info, void *gws, struct kgd_mem **mem); 160 1.3 riastrad int amdgpu_amdkfd_remove_gws_from_process(void *info, void *mem); 161 1.3 riastrad uint32_t amdgpu_amdkfd_get_fw_version(struct kgd_dev *kgd, 162 1.3 riastrad enum kgd_engine_type type); 163 1.3 riastrad void amdgpu_amdkfd_get_local_mem_info(struct kgd_dev *kgd, 164 1.3 riastrad struct kfd_local_mem_info *mem_info); 165 1.3 riastrad uint64_t amdgpu_amdkfd_get_gpu_clock_counter(struct kgd_dev *kgd); 166 1.3 riastrad 167 1.3 riastrad uint32_t amdgpu_amdkfd_get_max_engine_clock_in_mhz(struct kgd_dev *kgd); 168 1.3 riastrad void amdgpu_amdkfd_get_cu_info(struct kgd_dev *kgd, struct kfd_cu_info *cu_info); 169 1.3 riastrad int amdgpu_amdkfd_get_dmabuf_info(struct kgd_dev *kgd, int dma_buf_fd, 170 1.3 riastrad struct kgd_dev **dmabuf_kgd, 171 1.3 riastrad uint64_t *bo_size, void *metadata_buffer, 172 1.3 riastrad size_t buffer_size, uint32_t *metadata_size, 173 1.3 riastrad uint32_t *flags); 174 1.3 riastrad uint64_t amdgpu_amdkfd_get_vram_usage(struct kgd_dev *kgd); 175 1.3 riastrad uint64_t amdgpu_amdkfd_get_hive_id(struct kgd_dev *kgd); 176 1.3 riastrad uint64_t amdgpu_amdkfd_get_mmio_remap_phys_addr(struct kgd_dev *kgd); 177 1.3 riastrad uint32_t amdgpu_amdkfd_get_num_gws(struct kgd_dev *kgd); 178 1.3 riastrad uint8_t amdgpu_amdkfd_get_xgmi_hops_count(struct kgd_dev *dst, struct kgd_dev *src); 179 1.3 riastrad 180 1.3 riastrad /* Read user wptr from a specified user address space with page fault 181 1.3 riastrad * disabled. The memory must be pinned and mapped to the hardware when 182 1.3 riastrad * this is called in hqd_load functions, so it should never fault in 183 1.3 riastrad * the first place. This resolves a circular lock dependency involving 184 1.3 riastrad * four locks, including the DQM lock and mmap_sem. 185 1.3 riastrad */ 186 1.3 riastrad #define read_user_wptr(mmptr, wptr, dst) \ 187 1.3 riastrad ({ \ 188 1.3 riastrad bool valid = false; \ 189 1.3 riastrad if ((mmptr) && (wptr)) { \ 190 1.3 riastrad pagefault_disable(); \ 191 1.3 riastrad if ((mmptr) == current->mm) { \ 192 1.3 riastrad valid = !get_user((dst), (wptr)); \ 193 1.3 riastrad } else if (current->mm == NULL) { \ 194 1.3 riastrad use_mm(mmptr); \ 195 1.3 riastrad valid = !get_user((dst), (wptr)); \ 196 1.3 riastrad unuse_mm(mmptr); \ 197 1.3 riastrad } \ 198 1.3 riastrad pagefault_enable(); \ 199 1.3 riastrad } \ 200 1.3 riastrad valid; \ 201 1.3 riastrad }) 202 1.3 riastrad 203 1.3 riastrad /* GPUVM API */ 204 1.3 riastrad int amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, unsigned int pasid, 205 1.3 riastrad void **vm, void **process_info, 206 1.3 riastrad struct dma_fence **ef); 207 1.3 riastrad int amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd, 208 1.3 riastrad struct file *filp, unsigned int pasid, 209 1.3 riastrad void **vm, void **process_info, 210 1.3 riastrad struct dma_fence **ef); 211 1.3 riastrad void amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev, 212 1.3 riastrad struct amdgpu_vm *vm); 213 1.3 riastrad void amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm); 214 1.3 riastrad void amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm); 215 1.3 riastrad uint64_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm); 216 1.3 riastrad int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( 217 1.3 riastrad struct kgd_dev *kgd, uint64_t va, uint64_t size, 218 1.3 riastrad void *vm, struct kgd_mem **mem, 219 1.3 riastrad uint64_t *offset, uint32_t flags); 220 1.3 riastrad int amdgpu_amdkfd_gpuvm_free_memory_of_gpu( 221 1.3 riastrad struct kgd_dev *kgd, struct kgd_mem *mem); 222 1.3 riastrad int amdgpu_amdkfd_gpuvm_map_memory_to_gpu( 223 1.3 riastrad struct kgd_dev *kgd, struct kgd_mem *mem, void *vm); 224 1.3 riastrad int amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu( 225 1.3 riastrad struct kgd_dev *kgd, struct kgd_mem *mem, void *vm); 226 1.3 riastrad int amdgpu_amdkfd_gpuvm_sync_memory( 227 1.3 riastrad struct kgd_dev *kgd, struct kgd_mem *mem, bool intr); 228 1.3 riastrad int amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(struct kgd_dev *kgd, 229 1.3 riastrad struct kgd_mem *mem, void **kptr, uint64_t *size); 230 1.3 riastrad int amdgpu_amdkfd_gpuvm_restore_process_bos(void *process_info, 231 1.3 riastrad struct dma_fence **ef); 232 1.3 riastrad 233 1.3 riastrad int amdgpu_amdkfd_gpuvm_get_vm_fault_info(struct kgd_dev *kgd, 234 1.3 riastrad struct kfd_vm_fault_info *info); 235 1.3 riastrad 236 1.3 riastrad int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, 237 1.3 riastrad struct dma_buf *dmabuf, 238 1.3 riastrad uint64_t va, void *vm, 239 1.3 riastrad struct kgd_mem **mem, uint64_t *size, 240 1.3 riastrad uint64_t *mmap_offset); 241 1.3 riastrad 242 1.3 riastrad void amdgpu_amdkfd_gpuvm_init_mem_limits(void); 243 1.3 riastrad void amdgpu_amdkfd_unreserve_memory_limit(struct amdgpu_bo *bo); 244 1.3 riastrad 245 1.3 riastrad /* KGD2KFD callbacks */ 246 1.3 riastrad int kgd2kfd_init(void); 247 1.3 riastrad void kgd2kfd_exit(void); 248 1.3 riastrad struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, struct pci_dev *pdev, 249 1.3 riastrad unsigned int asic_type, bool vf); 250 1.3 riastrad bool kgd2kfd_device_init(struct kfd_dev *kfd, 251 1.3 riastrad struct drm_device *ddev, 252 1.3 riastrad const struct kgd2kfd_shared_resources *gpu_resources); 253 1.3 riastrad void kgd2kfd_device_exit(struct kfd_dev *kfd); 254 1.3 riastrad void kgd2kfd_suspend(struct kfd_dev *kfd); 255 1.3 riastrad int kgd2kfd_resume(struct kfd_dev *kfd); 256 1.3 riastrad int kgd2kfd_pre_reset(struct kfd_dev *kfd); 257 1.3 riastrad int kgd2kfd_post_reset(struct kfd_dev *kfd); 258 1.3 riastrad void kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry); 259 1.3 riastrad int kgd2kfd_quiesce_mm(struct mm_struct *mm); 260 1.3 riastrad int kgd2kfd_resume_mm(struct mm_struct *mm); 261 1.3 riastrad int kgd2kfd_schedule_evict_and_restore_process(struct mm_struct *mm, 262 1.3 riastrad struct dma_fence *fence); 263 1.3 riastrad void kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd); 264 1.1 riastrad 265 1.1 riastrad #endif /* AMDGPU_AMDKFD_H_INCLUDED */ 266