18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright 2014 Advanced Micro Devices, Inc. 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a 58c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the "Software"), 68c2ecf20Sopenharmony_ci * to deal in the Software without restriction, including without limitation 78c2ecf20Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense, 88c2ecf20Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the 98c2ecf20Sopenharmony_ci * Software is furnished to do so, subject to the following conditions: 108c2ecf20Sopenharmony_ci * 118c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice shall be included in 128c2ecf20Sopenharmony_ci * all copies or substantial portions of the Software. 138c2ecf20Sopenharmony_ci * 148c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 158c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 168c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 178c2ecf20Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 188c2ecf20Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 198c2ecf20Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 208c2ecf20Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE. 218c2ecf20Sopenharmony_ci */ 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci/* amdgpu_amdkfd.h defines the private interface between amdgpu and amdkfd. */ 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#ifndef AMDGPU_AMDKFD_H_INCLUDED 268c2ecf20Sopenharmony_ci#define AMDGPU_AMDKFD_H_INCLUDED 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci#include <linux/types.h> 298c2ecf20Sopenharmony_ci#include <linux/mm.h> 308c2ecf20Sopenharmony_ci#include <linux/kthread.h> 318c2ecf20Sopenharmony_ci#include <linux/workqueue.h> 328c2ecf20Sopenharmony_ci#include <kgd_kfd_interface.h> 338c2ecf20Sopenharmony_ci#include <drm/ttm/ttm_execbuf_util.h> 348c2ecf20Sopenharmony_ci#include "amdgpu_sync.h" 358c2ecf20Sopenharmony_ci#include "amdgpu_vm.h" 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ciextern uint64_t amdgpu_amdkfd_total_mem_size; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_cistruct amdgpu_device; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_cistruct kfd_bo_va_list { 428c2ecf20Sopenharmony_ci struct list_head bo_list; 438c2ecf20Sopenharmony_ci struct amdgpu_bo_va *bo_va; 448c2ecf20Sopenharmony_ci void *kgd_dev; 458c2ecf20Sopenharmony_ci bool is_mapped; 468c2ecf20Sopenharmony_ci uint64_t va; 478c2ecf20Sopenharmony_ci uint64_t pte_flags; 488c2ecf20Sopenharmony_ci}; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_cistruct kgd_mem { 518c2ecf20Sopenharmony_ci struct mutex lock; 528c2ecf20Sopenharmony_ci struct amdgpu_bo *bo; 538c2ecf20Sopenharmony_ci struct list_head bo_va_list; 548c2ecf20Sopenharmony_ci /* protected by amdkfd_process_info.lock */ 558c2ecf20Sopenharmony_ci struct ttm_validate_buffer validate_list; 568c2ecf20Sopenharmony_ci struct ttm_validate_buffer resv_list; 578c2ecf20Sopenharmony_ci uint32_t domain; 588c2ecf20Sopenharmony_ci unsigned int mapped_to_gpu_memory; 598c2ecf20Sopenharmony_ci uint64_t va; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci uint32_t alloc_flags; 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci atomic_t invalid; 648c2ecf20Sopenharmony_ci struct amdkfd_process_info *process_info; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci struct amdgpu_sync sync; 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci bool aql_queue; 698c2ecf20Sopenharmony_ci bool is_imported; 708c2ecf20Sopenharmony_ci}; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci/* KFD Memory Eviction */ 738c2ecf20Sopenharmony_cistruct amdgpu_amdkfd_fence { 748c2ecf20Sopenharmony_ci struct dma_fence base; 758c2ecf20Sopenharmony_ci struct mm_struct *mm; 768c2ecf20Sopenharmony_ci spinlock_t lock; 778c2ecf20Sopenharmony_ci char timeline_name[TASK_COMM_LEN]; 788c2ecf20Sopenharmony_ci}; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_cistruct amdgpu_kfd_dev { 818c2ecf20Sopenharmony_ci struct kfd_dev *dev; 828c2ecf20Sopenharmony_ci uint64_t vram_used; 838c2ecf20Sopenharmony_ci}; 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_cienum kgd_engine_type { 868c2ecf20Sopenharmony_ci KGD_ENGINE_PFP = 1, 878c2ecf20Sopenharmony_ci KGD_ENGINE_ME, 888c2ecf20Sopenharmony_ci KGD_ENGINE_CE, 898c2ecf20Sopenharmony_ci KGD_ENGINE_MEC1, 908c2ecf20Sopenharmony_ci KGD_ENGINE_MEC2, 918c2ecf20Sopenharmony_ci KGD_ENGINE_RLC, 928c2ecf20Sopenharmony_ci KGD_ENGINE_SDMA1, 938c2ecf20Sopenharmony_ci KGD_ENGINE_SDMA2, 948c2ecf20Sopenharmony_ci KGD_ENGINE_MAX 958c2ecf20Sopenharmony_ci}; 968c2ecf20Sopenharmony_ci 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_cistruct amdkfd_process_info { 998c2ecf20Sopenharmony_ci /* List head of all VMs that belong to a KFD process */ 1008c2ecf20Sopenharmony_ci struct list_head vm_list_head; 1018c2ecf20Sopenharmony_ci /* List head for all KFD BOs that belong to a KFD process. */ 1028c2ecf20Sopenharmony_ci struct list_head kfd_bo_list; 1038c2ecf20Sopenharmony_ci /* List of userptr BOs that are valid or invalid */ 1048c2ecf20Sopenharmony_ci struct list_head userptr_valid_list; 1058c2ecf20Sopenharmony_ci struct list_head userptr_inval_list; 1068c2ecf20Sopenharmony_ci /* Lock to protect kfd_bo_list */ 1078c2ecf20Sopenharmony_ci struct mutex lock; 1088c2ecf20Sopenharmony_ci 1098c2ecf20Sopenharmony_ci /* Number of VMs */ 1108c2ecf20Sopenharmony_ci unsigned int n_vms; 1118c2ecf20Sopenharmony_ci /* Eviction Fence */ 1128c2ecf20Sopenharmony_ci struct amdgpu_amdkfd_fence *eviction_fence; 1138c2ecf20Sopenharmony_ci 1148c2ecf20Sopenharmony_ci /* MMU-notifier related fields */ 1158c2ecf20Sopenharmony_ci atomic_t evicted_bos; 1168c2ecf20Sopenharmony_ci struct delayed_work restore_userptr_work; 1178c2ecf20Sopenharmony_ci struct pid *pid; 1188c2ecf20Sopenharmony_ci}; 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ciint amdgpu_amdkfd_init(void); 1218c2ecf20Sopenharmony_civoid amdgpu_amdkfd_fini(void); 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_civoid amdgpu_amdkfd_suspend(struct amdgpu_device *adev, bool run_pm); 1248c2ecf20Sopenharmony_ciint amdgpu_amdkfd_resume_iommu(struct amdgpu_device *adev); 1258c2ecf20Sopenharmony_ciint amdgpu_amdkfd_resume(struct amdgpu_device *adev, bool run_pm); 1268c2ecf20Sopenharmony_civoid amdgpu_amdkfd_interrupt(struct amdgpu_device *adev, 1278c2ecf20Sopenharmony_ci const void *ih_ring_entry); 1288c2ecf20Sopenharmony_civoid amdgpu_amdkfd_device_probe(struct amdgpu_device *adev); 1298c2ecf20Sopenharmony_civoid amdgpu_amdkfd_device_init(struct amdgpu_device *adev); 1308c2ecf20Sopenharmony_civoid amdgpu_amdkfd_device_fini(struct amdgpu_device *adev); 1318c2ecf20Sopenharmony_ciint amdgpu_amdkfd_submit_ib(struct kgd_dev *kgd, enum kgd_engine_type engine, 1328c2ecf20Sopenharmony_ci uint32_t vmid, uint64_t gpu_addr, 1338c2ecf20Sopenharmony_ci uint32_t *ib_cmd, uint32_t ib_len); 1348c2ecf20Sopenharmony_civoid amdgpu_amdkfd_set_compute_idle(struct kgd_dev *kgd, bool idle); 1358c2ecf20Sopenharmony_cibool amdgpu_amdkfd_have_atomics_support(struct kgd_dev *kgd); 1368c2ecf20Sopenharmony_ciint amdgpu_amdkfd_flush_gpu_tlb_vmid(struct kgd_dev *kgd, uint16_t vmid); 1378c2ecf20Sopenharmony_ciint amdgpu_amdkfd_flush_gpu_tlb_pasid(struct kgd_dev *kgd, uint16_t pasid); 1388c2ecf20Sopenharmony_ci 1398c2ecf20Sopenharmony_cibool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid); 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ciint amdgpu_amdkfd_pre_reset(struct amdgpu_device *adev); 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_ciint amdgpu_amdkfd_post_reset(struct amdgpu_device *adev); 1448c2ecf20Sopenharmony_ci 1458c2ecf20Sopenharmony_civoid amdgpu_amdkfd_gpu_reset(struct kgd_dev *kgd); 1468c2ecf20Sopenharmony_ci 1478c2ecf20Sopenharmony_ciint amdgpu_queue_mask_bit_to_set_resource_bit(struct amdgpu_device *adev, 1488c2ecf20Sopenharmony_ci int queue_bit); 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_cistruct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context, 1518c2ecf20Sopenharmony_ci struct mm_struct *mm); 1528c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_HSA_AMD) 1538c2ecf20Sopenharmony_cibool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm); 1548c2ecf20Sopenharmony_cistruct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f); 1558c2ecf20Sopenharmony_ciint amdgpu_amdkfd_remove_fence_on_pt_pd_bos(struct amdgpu_bo *bo); 1568c2ecf20Sopenharmony_ciint amdgpu_amdkfd_evict_userptr(struct kgd_mem *mem, struct mm_struct *mm); 1578c2ecf20Sopenharmony_ci#else 1588c2ecf20Sopenharmony_cistatic inline 1598c2ecf20Sopenharmony_cibool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm) 1608c2ecf20Sopenharmony_ci{ 1618c2ecf20Sopenharmony_ci return false; 1628c2ecf20Sopenharmony_ci} 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_cistatic inline 1658c2ecf20Sopenharmony_cistruct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f) 1668c2ecf20Sopenharmony_ci{ 1678c2ecf20Sopenharmony_ci return NULL; 1688c2ecf20Sopenharmony_ci} 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_cistatic inline 1718c2ecf20Sopenharmony_ciint amdgpu_amdkfd_remove_fence_on_pt_pd_bos(struct amdgpu_bo *bo) 1728c2ecf20Sopenharmony_ci{ 1738c2ecf20Sopenharmony_ci return 0; 1748c2ecf20Sopenharmony_ci} 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_cistatic inline 1778c2ecf20Sopenharmony_ciint amdgpu_amdkfd_evict_userptr(struct kgd_mem *mem, struct mm_struct *mm) 1788c2ecf20Sopenharmony_ci{ 1798c2ecf20Sopenharmony_ci return 0; 1808c2ecf20Sopenharmony_ci} 1818c2ecf20Sopenharmony_ci#endif 1828c2ecf20Sopenharmony_ci/* Shared API */ 1838c2ecf20Sopenharmony_ciint amdgpu_amdkfd_alloc_gtt_mem(struct kgd_dev *kgd, size_t size, 1848c2ecf20Sopenharmony_ci void **mem_obj, uint64_t *gpu_addr, 1858c2ecf20Sopenharmony_ci void **cpu_ptr, bool mqd_gfx9); 1868c2ecf20Sopenharmony_civoid amdgpu_amdkfd_free_gtt_mem(struct kgd_dev *kgd, void *mem_obj); 1878c2ecf20Sopenharmony_ciint amdgpu_amdkfd_alloc_gws(struct kgd_dev *kgd, size_t size, void **mem_obj); 1888c2ecf20Sopenharmony_civoid amdgpu_amdkfd_free_gws(struct kgd_dev *kgd, void *mem_obj); 1898c2ecf20Sopenharmony_ciint amdgpu_amdkfd_add_gws_to_process(void *info, void *gws, struct kgd_mem **mem); 1908c2ecf20Sopenharmony_ciint amdgpu_amdkfd_remove_gws_from_process(void *info, void *mem); 1918c2ecf20Sopenharmony_ciuint32_t amdgpu_amdkfd_get_fw_version(struct kgd_dev *kgd, 1928c2ecf20Sopenharmony_ci enum kgd_engine_type type); 1938c2ecf20Sopenharmony_civoid amdgpu_amdkfd_get_local_mem_info(struct kgd_dev *kgd, 1948c2ecf20Sopenharmony_ci struct kfd_local_mem_info *mem_info); 1958c2ecf20Sopenharmony_ciuint64_t amdgpu_amdkfd_get_gpu_clock_counter(struct kgd_dev *kgd); 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ciuint32_t amdgpu_amdkfd_get_max_engine_clock_in_mhz(struct kgd_dev *kgd); 1988c2ecf20Sopenharmony_civoid amdgpu_amdkfd_get_cu_info(struct kgd_dev *kgd, struct kfd_cu_info *cu_info); 1998c2ecf20Sopenharmony_ciint amdgpu_amdkfd_get_dmabuf_info(struct kgd_dev *kgd, int dma_buf_fd, 2008c2ecf20Sopenharmony_ci struct kgd_dev **dmabuf_kgd, 2018c2ecf20Sopenharmony_ci uint64_t *bo_size, void *metadata_buffer, 2028c2ecf20Sopenharmony_ci size_t buffer_size, uint32_t *metadata_size, 2038c2ecf20Sopenharmony_ci uint32_t *flags); 2048c2ecf20Sopenharmony_ciuint64_t amdgpu_amdkfd_get_vram_usage(struct kgd_dev *kgd); 2058c2ecf20Sopenharmony_ciuint64_t amdgpu_amdkfd_get_hive_id(struct kgd_dev *kgd); 2068c2ecf20Sopenharmony_ciuint64_t amdgpu_amdkfd_get_unique_id(struct kgd_dev *kgd); 2078c2ecf20Sopenharmony_ciuint64_t amdgpu_amdkfd_get_mmio_remap_phys_addr(struct kgd_dev *kgd); 2088c2ecf20Sopenharmony_ciuint32_t amdgpu_amdkfd_get_num_gws(struct kgd_dev *kgd); 2098c2ecf20Sopenharmony_ciuint32_t amdgpu_amdkfd_get_asic_rev_id(struct kgd_dev *kgd); 2108c2ecf20Sopenharmony_ciint amdgpu_amdkfd_get_noretry(struct kgd_dev *kgd); 2118c2ecf20Sopenharmony_ciuint8_t amdgpu_amdkfd_get_xgmi_hops_count(struct kgd_dev *dst, struct kgd_dev *src); 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci/* Read user wptr from a specified user address space with page fault 2148c2ecf20Sopenharmony_ci * disabled. The memory must be pinned and mapped to the hardware when 2158c2ecf20Sopenharmony_ci * this is called in hqd_load functions, so it should never fault in 2168c2ecf20Sopenharmony_ci * the first place. This resolves a circular lock dependency involving 2178c2ecf20Sopenharmony_ci * four locks, including the DQM lock and mmap_lock. 2188c2ecf20Sopenharmony_ci */ 2198c2ecf20Sopenharmony_ci#define read_user_wptr(mmptr, wptr, dst) \ 2208c2ecf20Sopenharmony_ci ({ \ 2218c2ecf20Sopenharmony_ci bool valid = false; \ 2228c2ecf20Sopenharmony_ci if ((mmptr) && (wptr)) { \ 2238c2ecf20Sopenharmony_ci pagefault_disable(); \ 2248c2ecf20Sopenharmony_ci if ((mmptr) == current->mm) { \ 2258c2ecf20Sopenharmony_ci valid = !get_user((dst), (wptr)); \ 2268c2ecf20Sopenharmony_ci } else if (current->flags & PF_KTHREAD) { \ 2278c2ecf20Sopenharmony_ci kthread_use_mm(mmptr); \ 2288c2ecf20Sopenharmony_ci valid = !get_user((dst), (wptr)); \ 2298c2ecf20Sopenharmony_ci kthread_unuse_mm(mmptr); \ 2308c2ecf20Sopenharmony_ci } \ 2318c2ecf20Sopenharmony_ci pagefault_enable(); \ 2328c2ecf20Sopenharmony_ci } \ 2338c2ecf20Sopenharmony_ci valid; \ 2348c2ecf20Sopenharmony_ci }) 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ci/* GPUVM API */ 2378c2ecf20Sopenharmony_ciint amdgpu_amdkfd_gpuvm_create_process_vm(struct kgd_dev *kgd, u32 pasid, 2388c2ecf20Sopenharmony_ci void **vm, void **process_info, 2398c2ecf20Sopenharmony_ci struct dma_fence **ef); 2408c2ecf20Sopenharmony_ciint amdgpu_amdkfd_gpuvm_acquire_process_vm(struct kgd_dev *kgd, 2418c2ecf20Sopenharmony_ci struct file *filp, u32 pasid, 2428c2ecf20Sopenharmony_ci void **vm, void **process_info, 2438c2ecf20Sopenharmony_ci struct dma_fence **ef); 2448c2ecf20Sopenharmony_civoid amdgpu_amdkfd_gpuvm_destroy_process_vm(struct kgd_dev *kgd, void *vm); 2458c2ecf20Sopenharmony_civoid amdgpu_amdkfd_gpuvm_release_process_vm(struct kgd_dev *kgd, void *vm); 2468c2ecf20Sopenharmony_ciuint64_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *vm); 2478c2ecf20Sopenharmony_ciint amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( 2488c2ecf20Sopenharmony_ci struct kgd_dev *kgd, uint64_t va, uint64_t size, 2498c2ecf20Sopenharmony_ci void *vm, struct kgd_mem **mem, 2508c2ecf20Sopenharmony_ci uint64_t *offset, uint32_t flags); 2518c2ecf20Sopenharmony_ciint amdgpu_amdkfd_gpuvm_free_memory_of_gpu( 2528c2ecf20Sopenharmony_ci struct kgd_dev *kgd, struct kgd_mem *mem, uint64_t *size); 2538c2ecf20Sopenharmony_ciint amdgpu_amdkfd_gpuvm_map_memory_to_gpu( 2548c2ecf20Sopenharmony_ci struct kgd_dev *kgd, struct kgd_mem *mem, void *vm); 2558c2ecf20Sopenharmony_ciint amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu( 2568c2ecf20Sopenharmony_ci struct kgd_dev *kgd, struct kgd_mem *mem, void *vm); 2578c2ecf20Sopenharmony_ciint amdgpu_amdkfd_gpuvm_sync_memory( 2588c2ecf20Sopenharmony_ci struct kgd_dev *kgd, struct kgd_mem *mem, bool intr); 2598c2ecf20Sopenharmony_ciint amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(struct kgd_dev *kgd, 2608c2ecf20Sopenharmony_ci struct kgd_mem *mem, void **kptr, uint64_t *size); 2618c2ecf20Sopenharmony_ciint amdgpu_amdkfd_gpuvm_restore_process_bos(void *process_info, 2628c2ecf20Sopenharmony_ci struct dma_fence **ef); 2638c2ecf20Sopenharmony_ciint amdgpu_amdkfd_gpuvm_get_vm_fault_info(struct kgd_dev *kgd, 2648c2ecf20Sopenharmony_ci struct kfd_vm_fault_info *info); 2658c2ecf20Sopenharmony_ciint amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, 2668c2ecf20Sopenharmony_ci struct dma_buf *dmabuf, 2678c2ecf20Sopenharmony_ci uint64_t va, void *vm, 2688c2ecf20Sopenharmony_ci struct kgd_mem **mem, uint64_t *size, 2698c2ecf20Sopenharmony_ci uint64_t *mmap_offset); 2708c2ecf20Sopenharmony_ciint amdgpu_amdkfd_get_tile_config(struct kgd_dev *kgd, 2718c2ecf20Sopenharmony_ci struct tile_config *config); 2728c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_HSA_AMD) 2738c2ecf20Sopenharmony_civoid amdgpu_amdkfd_gpuvm_init_mem_limits(void); 2748c2ecf20Sopenharmony_civoid amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev, 2758c2ecf20Sopenharmony_ci struct amdgpu_vm *vm); 2768c2ecf20Sopenharmony_civoid amdgpu_amdkfd_unreserve_memory_limit(struct amdgpu_bo *bo); 2778c2ecf20Sopenharmony_ci#else 2788c2ecf20Sopenharmony_cistatic inline 2798c2ecf20Sopenharmony_civoid amdgpu_amdkfd_gpuvm_init_mem_limits(void) 2808c2ecf20Sopenharmony_ci{ 2818c2ecf20Sopenharmony_ci} 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_cistatic inline 2848c2ecf20Sopenharmony_civoid amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev, 2858c2ecf20Sopenharmony_ci struct amdgpu_vm *vm) 2868c2ecf20Sopenharmony_ci{ 2878c2ecf20Sopenharmony_ci} 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_cistatic inline 2908c2ecf20Sopenharmony_civoid amdgpu_amdkfd_unreserve_memory_limit(struct amdgpu_bo *bo) 2918c2ecf20Sopenharmony_ci{ 2928c2ecf20Sopenharmony_ci} 2938c2ecf20Sopenharmony_ci#endif 2948c2ecf20Sopenharmony_ci/* KGD2KFD callbacks */ 2958c2ecf20Sopenharmony_ciint kgd2kfd_quiesce_mm(struct mm_struct *mm); 2968c2ecf20Sopenharmony_ciint kgd2kfd_resume_mm(struct mm_struct *mm); 2978c2ecf20Sopenharmony_ciint kgd2kfd_schedule_evict_and_restore_process(struct mm_struct *mm, 2988c2ecf20Sopenharmony_ci struct dma_fence *fence); 2998c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_HSA_AMD) 3008c2ecf20Sopenharmony_ciint kgd2kfd_init(void); 3018c2ecf20Sopenharmony_civoid kgd2kfd_exit(void); 3028c2ecf20Sopenharmony_cistruct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, struct pci_dev *pdev, 3038c2ecf20Sopenharmony_ci unsigned int asic_type, bool vf); 3048c2ecf20Sopenharmony_cibool kgd2kfd_device_init(struct kfd_dev *kfd, 3058c2ecf20Sopenharmony_ci struct drm_device *ddev, 3068c2ecf20Sopenharmony_ci const struct kgd2kfd_shared_resources *gpu_resources); 3078c2ecf20Sopenharmony_civoid kgd2kfd_device_exit(struct kfd_dev *kfd); 3088c2ecf20Sopenharmony_civoid kgd2kfd_suspend(struct kfd_dev *kfd, bool run_pm); 3098c2ecf20Sopenharmony_ciint kgd2kfd_resume_iommu(struct kfd_dev *kfd); 3108c2ecf20Sopenharmony_ciint kgd2kfd_resume(struct kfd_dev *kfd, bool run_pm); 3118c2ecf20Sopenharmony_ciint kgd2kfd_pre_reset(struct kfd_dev *kfd); 3128c2ecf20Sopenharmony_ciint kgd2kfd_post_reset(struct kfd_dev *kfd); 3138c2ecf20Sopenharmony_civoid kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry); 3148c2ecf20Sopenharmony_civoid kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd); 3158c2ecf20Sopenharmony_civoid kgd2kfd_smi_event_throttle(struct kfd_dev *kfd, uint32_t throttle_bitmask); 3168c2ecf20Sopenharmony_ci#else 3178c2ecf20Sopenharmony_cistatic inline int kgd2kfd_init(void) 3188c2ecf20Sopenharmony_ci{ 3198c2ecf20Sopenharmony_ci return -ENOENT; 3208c2ecf20Sopenharmony_ci} 3218c2ecf20Sopenharmony_ci 3228c2ecf20Sopenharmony_cistatic inline void kgd2kfd_exit(void) 3238c2ecf20Sopenharmony_ci{ 3248c2ecf20Sopenharmony_ci} 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_cistatic inline 3278c2ecf20Sopenharmony_cistruct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, struct pci_dev *pdev, 3288c2ecf20Sopenharmony_ci unsigned int asic_type, bool vf) 3298c2ecf20Sopenharmony_ci{ 3308c2ecf20Sopenharmony_ci return NULL; 3318c2ecf20Sopenharmony_ci} 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_cistatic inline 3348c2ecf20Sopenharmony_cibool kgd2kfd_device_init(struct kfd_dev *kfd, struct drm_device *ddev, 3358c2ecf20Sopenharmony_ci const struct kgd2kfd_shared_resources *gpu_resources) 3368c2ecf20Sopenharmony_ci{ 3378c2ecf20Sopenharmony_ci return false; 3388c2ecf20Sopenharmony_ci} 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_cistatic inline void kgd2kfd_device_exit(struct kfd_dev *kfd) 3418c2ecf20Sopenharmony_ci{ 3428c2ecf20Sopenharmony_ci} 3438c2ecf20Sopenharmony_ci 3448c2ecf20Sopenharmony_cistatic inline void kgd2kfd_suspend(struct kfd_dev *kfd, bool run_pm) 3458c2ecf20Sopenharmony_ci{ 3468c2ecf20Sopenharmony_ci} 3478c2ecf20Sopenharmony_ci 3488c2ecf20Sopenharmony_cistatic int __maybe_unused kgd2kfd_resume_iommu(struct kfd_dev *kfd) 3498c2ecf20Sopenharmony_ci{ 3508c2ecf20Sopenharmony_ci return 0; 3518c2ecf20Sopenharmony_ci} 3528c2ecf20Sopenharmony_ci 3538c2ecf20Sopenharmony_cistatic inline int kgd2kfd_resume(struct kfd_dev *kfd, bool run_pm) 3548c2ecf20Sopenharmony_ci{ 3558c2ecf20Sopenharmony_ci return 0; 3568c2ecf20Sopenharmony_ci} 3578c2ecf20Sopenharmony_ci 3588c2ecf20Sopenharmony_cistatic inline int kgd2kfd_pre_reset(struct kfd_dev *kfd) 3598c2ecf20Sopenharmony_ci{ 3608c2ecf20Sopenharmony_ci return 0; 3618c2ecf20Sopenharmony_ci} 3628c2ecf20Sopenharmony_ci 3638c2ecf20Sopenharmony_cistatic inline int kgd2kfd_post_reset(struct kfd_dev *kfd) 3648c2ecf20Sopenharmony_ci{ 3658c2ecf20Sopenharmony_ci return 0; 3668c2ecf20Sopenharmony_ci} 3678c2ecf20Sopenharmony_ci 3688c2ecf20Sopenharmony_cistatic inline 3698c2ecf20Sopenharmony_civoid kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry) 3708c2ecf20Sopenharmony_ci{ 3718c2ecf20Sopenharmony_ci} 3728c2ecf20Sopenharmony_ci 3738c2ecf20Sopenharmony_cistatic inline 3748c2ecf20Sopenharmony_civoid kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd) 3758c2ecf20Sopenharmony_ci{ 3768c2ecf20Sopenharmony_ci} 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_cistatic inline 3798c2ecf20Sopenharmony_civoid kgd2kfd_smi_event_throttle(struct kfd_dev *kfd, uint32_t throttle_bitmask) 3808c2ecf20Sopenharmony_ci{ 3818c2ecf20Sopenharmony_ci} 3828c2ecf20Sopenharmony_ci#endif 3838c2ecf20Sopenharmony_ci#endif /* AMDGPU_AMDKFD_H_INCLUDED */ 384