162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright 2014 Advanced Micro Devices, Inc.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
562306a36Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
662306a36Sopenharmony_ci * to deal in the Software without restriction, including without limitation
762306a36Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
862306a36Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
962306a36Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci * The above copyright notice and this permission notice shall be included in
1262306a36Sopenharmony_ci * all copies or substantial portions of the Software.
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1562306a36Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1662306a36Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1762306a36Sopenharmony_ci * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
1862306a36Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
1962306a36Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
2062306a36Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE.
2162306a36Sopenharmony_ci */
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci/* amdgpu_amdkfd.h defines the private interface between amdgpu and amdkfd. */
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#ifndef AMDGPU_AMDKFD_H_INCLUDED
2662306a36Sopenharmony_ci#define AMDGPU_AMDKFD_H_INCLUDED
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#include <linux/list.h>
2962306a36Sopenharmony_ci#include <linux/types.h>
3062306a36Sopenharmony_ci#include <linux/mm.h>
3162306a36Sopenharmony_ci#include <linux/kthread.h>
3262306a36Sopenharmony_ci#include <linux/workqueue.h>
3362306a36Sopenharmony_ci#include <linux/mmu_notifier.h>
3462306a36Sopenharmony_ci#include <linux/memremap.h>
3562306a36Sopenharmony_ci#include <kgd_kfd_interface.h>
3662306a36Sopenharmony_ci#include "amdgpu_sync.h"
3762306a36Sopenharmony_ci#include "amdgpu_vm.h"
3862306a36Sopenharmony_ci#include "amdgpu_xcp.h"
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ciextern uint64_t amdgpu_amdkfd_total_mem_size;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_cienum TLB_FLUSH_TYPE {
4362306a36Sopenharmony_ci	TLB_FLUSH_LEGACY = 0,
4462306a36Sopenharmony_ci	TLB_FLUSH_LIGHTWEIGHT,
4562306a36Sopenharmony_ci	TLB_FLUSH_HEAVYWEIGHT
4662306a36Sopenharmony_ci};
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_cistruct amdgpu_device;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cienum kfd_mem_attachment_type {
5162306a36Sopenharmony_ci	KFD_MEM_ATT_SHARED,	/* Share kgd_mem->bo or another attachment's */
5262306a36Sopenharmony_ci	KFD_MEM_ATT_USERPTR,	/* SG bo to DMA map pages from a userptr bo */
5362306a36Sopenharmony_ci	KFD_MEM_ATT_DMABUF,	/* DMAbuf to DMA map TTM BOs */
5462306a36Sopenharmony_ci	KFD_MEM_ATT_SG		/* Tag to DMA map SG BOs */
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistruct kfd_mem_attachment {
5862306a36Sopenharmony_ci	struct list_head list;
5962306a36Sopenharmony_ci	enum kfd_mem_attachment_type type;
6062306a36Sopenharmony_ci	bool is_mapped;
6162306a36Sopenharmony_ci	struct amdgpu_bo_va *bo_va;
6262306a36Sopenharmony_ci	struct amdgpu_device *adev;
6362306a36Sopenharmony_ci	uint64_t va;
6462306a36Sopenharmony_ci	uint64_t pte_flags;
6562306a36Sopenharmony_ci};
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistruct kgd_mem {
6862306a36Sopenharmony_ci	struct mutex lock;
6962306a36Sopenharmony_ci	struct amdgpu_bo *bo;
7062306a36Sopenharmony_ci	struct dma_buf *dmabuf;
7162306a36Sopenharmony_ci	struct hmm_range *range;
7262306a36Sopenharmony_ci	struct list_head attachments;
7362306a36Sopenharmony_ci	/* protected by amdkfd_process_info.lock */
7462306a36Sopenharmony_ci	struct list_head validate_list;
7562306a36Sopenharmony_ci	uint32_t domain;
7662306a36Sopenharmony_ci	unsigned int mapped_to_gpu_memory;
7762306a36Sopenharmony_ci	uint64_t va;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	uint32_t alloc_flags;
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	uint32_t invalid;
8262306a36Sopenharmony_ci	struct amdkfd_process_info *process_info;
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	struct amdgpu_sync sync;
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci	bool aql_queue;
8762306a36Sopenharmony_ci	bool is_imported;
8862306a36Sopenharmony_ci};
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci/* KFD Memory Eviction */
9162306a36Sopenharmony_cistruct amdgpu_amdkfd_fence {
9262306a36Sopenharmony_ci	struct dma_fence base;
9362306a36Sopenharmony_ci	struct mm_struct *mm;
9462306a36Sopenharmony_ci	spinlock_t lock;
9562306a36Sopenharmony_ci	char timeline_name[TASK_COMM_LEN];
9662306a36Sopenharmony_ci	struct svm_range_bo *svm_bo;
9762306a36Sopenharmony_ci};
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_cistruct amdgpu_kfd_dev {
10062306a36Sopenharmony_ci	struct kfd_dev *dev;
10162306a36Sopenharmony_ci	int64_t vram_used[MAX_XCP];
10262306a36Sopenharmony_ci	uint64_t vram_used_aligned[MAX_XCP];
10362306a36Sopenharmony_ci	bool init_complete;
10462306a36Sopenharmony_ci	struct work_struct reset_work;
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci	/* HMM page migration MEMORY_DEVICE_PRIVATE mapping */
10762306a36Sopenharmony_ci	struct dev_pagemap pgmap;
10862306a36Sopenharmony_ci};
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cienum kgd_engine_type {
11162306a36Sopenharmony_ci	KGD_ENGINE_PFP = 1,
11262306a36Sopenharmony_ci	KGD_ENGINE_ME,
11362306a36Sopenharmony_ci	KGD_ENGINE_CE,
11462306a36Sopenharmony_ci	KGD_ENGINE_MEC1,
11562306a36Sopenharmony_ci	KGD_ENGINE_MEC2,
11662306a36Sopenharmony_ci	KGD_ENGINE_RLC,
11762306a36Sopenharmony_ci	KGD_ENGINE_SDMA1,
11862306a36Sopenharmony_ci	KGD_ENGINE_SDMA2,
11962306a36Sopenharmony_ci	KGD_ENGINE_MAX
12062306a36Sopenharmony_ci};
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_cistruct amdkfd_process_info {
12462306a36Sopenharmony_ci	/* List head of all VMs that belong to a KFD process */
12562306a36Sopenharmony_ci	struct list_head vm_list_head;
12662306a36Sopenharmony_ci	/* List head for all KFD BOs that belong to a KFD process. */
12762306a36Sopenharmony_ci	struct list_head kfd_bo_list;
12862306a36Sopenharmony_ci	/* List of userptr BOs that are valid or invalid */
12962306a36Sopenharmony_ci	struct list_head userptr_valid_list;
13062306a36Sopenharmony_ci	struct list_head userptr_inval_list;
13162306a36Sopenharmony_ci	/* Lock to protect kfd_bo_list */
13262306a36Sopenharmony_ci	struct mutex lock;
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci	/* Number of VMs */
13562306a36Sopenharmony_ci	unsigned int n_vms;
13662306a36Sopenharmony_ci	/* Eviction Fence */
13762306a36Sopenharmony_ci	struct amdgpu_amdkfd_fence *eviction_fence;
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci	/* MMU-notifier related fields */
14062306a36Sopenharmony_ci	struct mutex notifier_lock;
14162306a36Sopenharmony_ci	uint32_t evicted_bos;
14262306a36Sopenharmony_ci	struct delayed_work restore_userptr_work;
14362306a36Sopenharmony_ci	struct pid *pid;
14462306a36Sopenharmony_ci	bool block_mmu_notifications;
14562306a36Sopenharmony_ci};
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ciint amdgpu_amdkfd_init(void);
14862306a36Sopenharmony_civoid amdgpu_amdkfd_fini(void);
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_civoid amdgpu_amdkfd_suspend(struct amdgpu_device *adev, bool run_pm);
15162306a36Sopenharmony_ciint amdgpu_amdkfd_resume(struct amdgpu_device *adev, bool run_pm);
15262306a36Sopenharmony_civoid amdgpu_amdkfd_interrupt(struct amdgpu_device *adev,
15362306a36Sopenharmony_ci			const void *ih_ring_entry);
15462306a36Sopenharmony_civoid amdgpu_amdkfd_device_probe(struct amdgpu_device *adev);
15562306a36Sopenharmony_civoid amdgpu_amdkfd_device_init(struct amdgpu_device *adev);
15662306a36Sopenharmony_civoid amdgpu_amdkfd_device_fini_sw(struct amdgpu_device *adev);
15762306a36Sopenharmony_ciint amdgpu_amdkfd_check_and_lock_kfd(struct amdgpu_device *adev);
15862306a36Sopenharmony_civoid amdgpu_amdkfd_unlock_kfd(struct amdgpu_device *adev);
15962306a36Sopenharmony_ciint amdgpu_amdkfd_submit_ib(struct amdgpu_device *adev,
16062306a36Sopenharmony_ci				enum kgd_engine_type engine,
16162306a36Sopenharmony_ci				uint32_t vmid, uint64_t gpu_addr,
16262306a36Sopenharmony_ci				uint32_t *ib_cmd, uint32_t ib_len);
16362306a36Sopenharmony_civoid amdgpu_amdkfd_set_compute_idle(struct amdgpu_device *adev, bool idle);
16462306a36Sopenharmony_cibool amdgpu_amdkfd_have_atomics_support(struct amdgpu_device *adev);
16562306a36Sopenharmony_ciint amdgpu_amdkfd_flush_gpu_tlb_vmid(struct amdgpu_device *adev,
16662306a36Sopenharmony_ci				uint16_t vmid);
16762306a36Sopenharmony_ciint amdgpu_amdkfd_flush_gpu_tlb_pasid(struct amdgpu_device *adev,
16862306a36Sopenharmony_ci				uint16_t pasid, enum TLB_FLUSH_TYPE flush_type,
16962306a36Sopenharmony_ci				uint32_t inst);
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_cibool amdgpu_amdkfd_is_kfd_vmid(struct amdgpu_device *adev, u32 vmid);
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ciint amdgpu_amdkfd_pre_reset(struct amdgpu_device *adev);
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ciint amdgpu_amdkfd_post_reset(struct amdgpu_device *adev);
17662306a36Sopenharmony_ci
17762306a36Sopenharmony_civoid amdgpu_amdkfd_gpu_reset(struct amdgpu_device *adev);
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ciint amdgpu_queue_mask_bit_to_set_resource_bit(struct amdgpu_device *adev,
18062306a36Sopenharmony_ci					int queue_bit);
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_cistruct amdgpu_amdkfd_fence *amdgpu_amdkfd_fence_create(u64 context,
18362306a36Sopenharmony_ci				struct mm_struct *mm,
18462306a36Sopenharmony_ci				struct svm_range_bo *svm_bo);
18562306a36Sopenharmony_ci#if defined(CONFIG_DEBUG_FS)
18662306a36Sopenharmony_ciint kfd_debugfs_kfd_mem_limits(struct seq_file *m, void *data);
18762306a36Sopenharmony_ci#endif
18862306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_HSA_AMD)
18962306a36Sopenharmony_cibool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm);
19062306a36Sopenharmony_cistruct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f);
19162306a36Sopenharmony_ciint amdgpu_amdkfd_remove_fence_on_pt_pd_bos(struct amdgpu_bo *bo);
19262306a36Sopenharmony_ciint amdgpu_amdkfd_evict_userptr(struct mmu_interval_notifier *mni,
19362306a36Sopenharmony_ci				unsigned long cur_seq, struct kgd_mem *mem);
19462306a36Sopenharmony_ci#else
19562306a36Sopenharmony_cistatic inline
19662306a36Sopenharmony_cibool amdkfd_fence_check_mm(struct dma_fence *f, struct mm_struct *mm)
19762306a36Sopenharmony_ci{
19862306a36Sopenharmony_ci	return false;
19962306a36Sopenharmony_ci}
20062306a36Sopenharmony_ci
20162306a36Sopenharmony_cistatic inline
20262306a36Sopenharmony_cistruct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f)
20362306a36Sopenharmony_ci{
20462306a36Sopenharmony_ci	return NULL;
20562306a36Sopenharmony_ci}
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_cistatic inline
20862306a36Sopenharmony_ciint amdgpu_amdkfd_remove_fence_on_pt_pd_bos(struct amdgpu_bo *bo)
20962306a36Sopenharmony_ci{
21062306a36Sopenharmony_ci	return 0;
21162306a36Sopenharmony_ci}
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_cistatic inline
21462306a36Sopenharmony_ciint amdgpu_amdkfd_evict_userptr(struct mmu_interval_notifier *mni,
21562306a36Sopenharmony_ci				unsigned long cur_seq, struct kgd_mem *mem)
21662306a36Sopenharmony_ci{
21762306a36Sopenharmony_ci	return 0;
21862306a36Sopenharmony_ci}
21962306a36Sopenharmony_ci#endif
22062306a36Sopenharmony_ci/* Shared API */
22162306a36Sopenharmony_ciint amdgpu_amdkfd_alloc_gtt_mem(struct amdgpu_device *adev, size_t size,
22262306a36Sopenharmony_ci				void **mem_obj, uint64_t *gpu_addr,
22362306a36Sopenharmony_ci				void **cpu_ptr, bool mqd_gfx9);
22462306a36Sopenharmony_civoid amdgpu_amdkfd_free_gtt_mem(struct amdgpu_device *adev, void *mem_obj);
22562306a36Sopenharmony_ciint amdgpu_amdkfd_alloc_gws(struct amdgpu_device *adev, size_t size,
22662306a36Sopenharmony_ci				void **mem_obj);
22762306a36Sopenharmony_civoid amdgpu_amdkfd_free_gws(struct amdgpu_device *adev, void *mem_obj);
22862306a36Sopenharmony_ciint amdgpu_amdkfd_add_gws_to_process(void *info, void *gws, struct kgd_mem **mem);
22962306a36Sopenharmony_ciint amdgpu_amdkfd_remove_gws_from_process(void *info, void *mem);
23062306a36Sopenharmony_ciuint32_t amdgpu_amdkfd_get_fw_version(struct amdgpu_device *adev,
23162306a36Sopenharmony_ci				      enum kgd_engine_type type);
23262306a36Sopenharmony_civoid amdgpu_amdkfd_get_local_mem_info(struct amdgpu_device *adev,
23362306a36Sopenharmony_ci				      struct kfd_local_mem_info *mem_info,
23462306a36Sopenharmony_ci				      struct amdgpu_xcp *xcp);
23562306a36Sopenharmony_ciuint64_t amdgpu_amdkfd_get_gpu_clock_counter(struct amdgpu_device *adev);
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ciuint32_t amdgpu_amdkfd_get_max_engine_clock_in_mhz(struct amdgpu_device *adev);
23862306a36Sopenharmony_civoid amdgpu_amdkfd_get_cu_info(struct amdgpu_device *adev,
23962306a36Sopenharmony_ci			       struct kfd_cu_info *cu_info);
24062306a36Sopenharmony_ciint amdgpu_amdkfd_get_dmabuf_info(struct amdgpu_device *adev, int dma_buf_fd,
24162306a36Sopenharmony_ci				  struct amdgpu_device **dmabuf_adev,
24262306a36Sopenharmony_ci				  uint64_t *bo_size, void *metadata_buffer,
24362306a36Sopenharmony_ci				  size_t buffer_size, uint32_t *metadata_size,
24462306a36Sopenharmony_ci				  uint32_t *flags, int8_t *xcp_id);
24562306a36Sopenharmony_ciuint8_t amdgpu_amdkfd_get_xgmi_hops_count(struct amdgpu_device *dst,
24662306a36Sopenharmony_ci					  struct amdgpu_device *src);
24762306a36Sopenharmony_ciint amdgpu_amdkfd_get_xgmi_bandwidth_mbytes(struct amdgpu_device *dst,
24862306a36Sopenharmony_ci					    struct amdgpu_device *src,
24962306a36Sopenharmony_ci					    bool is_min);
25062306a36Sopenharmony_ciint amdgpu_amdkfd_get_pcie_bandwidth_mbytes(struct amdgpu_device *adev, bool is_min);
25162306a36Sopenharmony_ciint amdgpu_amdkfd_send_close_event_drain_irq(struct amdgpu_device *adev,
25262306a36Sopenharmony_ci					uint32_t *payload);
25362306a36Sopenharmony_ciint amdgpu_amdkfd_unmap_hiq(struct amdgpu_device *adev, u32 doorbell_off,
25462306a36Sopenharmony_ci				u32 inst);
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci/* Read user wptr from a specified user address space with page fault
25762306a36Sopenharmony_ci * disabled. The memory must be pinned and mapped to the hardware when
25862306a36Sopenharmony_ci * this is called in hqd_load functions, so it should never fault in
25962306a36Sopenharmony_ci * the first place. This resolves a circular lock dependency involving
26062306a36Sopenharmony_ci * four locks, including the DQM lock and mmap_lock.
26162306a36Sopenharmony_ci */
26262306a36Sopenharmony_ci#define read_user_wptr(mmptr, wptr, dst)				\
26362306a36Sopenharmony_ci	({								\
26462306a36Sopenharmony_ci		bool valid = false;					\
26562306a36Sopenharmony_ci		if ((mmptr) && (wptr)) {				\
26662306a36Sopenharmony_ci			pagefault_disable();				\
26762306a36Sopenharmony_ci			if ((mmptr) == current->mm) {			\
26862306a36Sopenharmony_ci				valid = !get_user((dst), (wptr));	\
26962306a36Sopenharmony_ci			} else if (current->flags & PF_KTHREAD) {	\
27062306a36Sopenharmony_ci				kthread_use_mm(mmptr);			\
27162306a36Sopenharmony_ci				valid = !get_user((dst), (wptr));	\
27262306a36Sopenharmony_ci				kthread_unuse_mm(mmptr);		\
27362306a36Sopenharmony_ci			}						\
27462306a36Sopenharmony_ci			pagefault_enable();				\
27562306a36Sopenharmony_ci		}							\
27662306a36Sopenharmony_ci		valid;							\
27762306a36Sopenharmony_ci	})
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci/* GPUVM API */
28062306a36Sopenharmony_ci#define drm_priv_to_vm(drm_priv)					\
28162306a36Sopenharmony_ci	(&((struct amdgpu_fpriv *)					\
28262306a36Sopenharmony_ci		((struct drm_file *)(drm_priv))->driver_priv)->vm)
28362306a36Sopenharmony_ci
28462306a36Sopenharmony_ciint amdgpu_amdkfd_gpuvm_set_vm_pasid(struct amdgpu_device *adev,
28562306a36Sopenharmony_ci				     struct amdgpu_vm *avm, u32 pasid);
28662306a36Sopenharmony_ciint amdgpu_amdkfd_gpuvm_acquire_process_vm(struct amdgpu_device *adev,
28762306a36Sopenharmony_ci					struct amdgpu_vm *avm,
28862306a36Sopenharmony_ci					void **process_info,
28962306a36Sopenharmony_ci					struct dma_fence **ef);
29062306a36Sopenharmony_civoid amdgpu_amdkfd_gpuvm_release_process_vm(struct amdgpu_device *adev,
29162306a36Sopenharmony_ci					void *drm_priv);
29262306a36Sopenharmony_ciuint64_t amdgpu_amdkfd_gpuvm_get_process_page_dir(void *drm_priv);
29362306a36Sopenharmony_cisize_t amdgpu_amdkfd_get_available_memory(struct amdgpu_device *adev,
29462306a36Sopenharmony_ci					uint8_t xcp_id);
29562306a36Sopenharmony_ciint amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
29662306a36Sopenharmony_ci		struct amdgpu_device *adev, uint64_t va, uint64_t size,
29762306a36Sopenharmony_ci		void *drm_priv, struct kgd_mem **mem,
29862306a36Sopenharmony_ci		uint64_t *offset, uint32_t flags, bool criu_resume);
29962306a36Sopenharmony_ciint amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
30062306a36Sopenharmony_ci		struct amdgpu_device *adev, struct kgd_mem *mem, void *drm_priv,
30162306a36Sopenharmony_ci		uint64_t *size);
30262306a36Sopenharmony_ciint amdgpu_amdkfd_gpuvm_map_memory_to_gpu(struct amdgpu_device *adev,
30362306a36Sopenharmony_ci					  struct kgd_mem *mem, void *drm_priv);
30462306a36Sopenharmony_ciint amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
30562306a36Sopenharmony_ci		struct amdgpu_device *adev, struct kgd_mem *mem, void *drm_priv);
30662306a36Sopenharmony_ciint amdgpu_amdkfd_gpuvm_sync_memory(
30762306a36Sopenharmony_ci		struct amdgpu_device *adev, struct kgd_mem *mem, bool intr);
30862306a36Sopenharmony_ciint amdgpu_amdkfd_gpuvm_map_gtt_bo_to_kernel(struct kgd_mem *mem,
30962306a36Sopenharmony_ci					     void **kptr, uint64_t *size);
31062306a36Sopenharmony_civoid amdgpu_amdkfd_gpuvm_unmap_gtt_bo_from_kernel(struct kgd_mem *mem);
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ciint amdgpu_amdkfd_map_gtt_bo_to_gart(struct amdgpu_device *adev, struct amdgpu_bo *bo);
31362306a36Sopenharmony_ci
31462306a36Sopenharmony_ciint amdgpu_amdkfd_gpuvm_restore_process_bos(void *process_info,
31562306a36Sopenharmony_ci					    struct dma_fence **ef);
31662306a36Sopenharmony_ciint amdgpu_amdkfd_gpuvm_get_vm_fault_info(struct amdgpu_device *adev,
31762306a36Sopenharmony_ci					      struct kfd_vm_fault_info *info);
31862306a36Sopenharmony_ciint amdgpu_amdkfd_gpuvm_import_dmabuf(struct amdgpu_device *adev,
31962306a36Sopenharmony_ci				      struct dma_buf *dmabuf,
32062306a36Sopenharmony_ci				      uint64_t va, void *drm_priv,
32162306a36Sopenharmony_ci				      struct kgd_mem **mem, uint64_t *size,
32262306a36Sopenharmony_ci				      uint64_t *mmap_offset);
32362306a36Sopenharmony_ciint amdgpu_amdkfd_gpuvm_export_dmabuf(struct kgd_mem *mem,
32462306a36Sopenharmony_ci				      struct dma_buf **dmabuf);
32562306a36Sopenharmony_civoid amdgpu_amdkfd_debug_mem_fence(struct amdgpu_device *adev);
32662306a36Sopenharmony_ciint amdgpu_amdkfd_get_tile_config(struct amdgpu_device *adev,
32762306a36Sopenharmony_ci				struct tile_config *config);
32862306a36Sopenharmony_civoid amdgpu_amdkfd_ras_poison_consumption_handler(struct amdgpu_device *adev,
32962306a36Sopenharmony_ci				bool reset);
33062306a36Sopenharmony_cibool amdgpu_amdkfd_bo_mapped_to_dev(struct amdgpu_device *adev, struct kgd_mem *mem);
33162306a36Sopenharmony_civoid amdgpu_amdkfd_block_mmu_notifications(void *p);
33262306a36Sopenharmony_ciint amdgpu_amdkfd_criu_resume(void *p);
33362306a36Sopenharmony_cibool amdgpu_amdkfd_ras_query_utcl2_poison_status(struct amdgpu_device *adev);
33462306a36Sopenharmony_ciint amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev,
33562306a36Sopenharmony_ci		uint64_t size, u32 alloc_flag, int8_t xcp_id);
33662306a36Sopenharmony_civoid amdgpu_amdkfd_unreserve_mem_limit(struct amdgpu_device *adev,
33762306a36Sopenharmony_ci		uint64_t size, u32 alloc_flag, int8_t xcp_id);
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ciu64 amdgpu_amdkfd_xcp_memory_size(struct amdgpu_device *adev, int xcp_id);
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci#define KFD_XCP_MEM_ID(adev, xcp_id) \
34262306a36Sopenharmony_ci		((adev)->xcp_mgr && (xcp_id) >= 0 ?\
34362306a36Sopenharmony_ci		(adev)->xcp_mgr->xcp[(xcp_id)].mem_id : -1)
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci#define KFD_XCP_MEMORY_SIZE(adev, xcp_id) amdgpu_amdkfd_xcp_memory_size((adev), (xcp_id))
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci
34862306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_HSA_AMD)
34962306a36Sopenharmony_civoid amdgpu_amdkfd_gpuvm_init_mem_limits(void);
35062306a36Sopenharmony_civoid amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,
35162306a36Sopenharmony_ci				struct amdgpu_vm *vm);
35262306a36Sopenharmony_ci
35362306a36Sopenharmony_ci/**
35462306a36Sopenharmony_ci * @amdgpu_amdkfd_release_notify() - Notify KFD when GEM object is released
35562306a36Sopenharmony_ci *
35662306a36Sopenharmony_ci * Allows KFD to release its resources associated with the GEM object.
35762306a36Sopenharmony_ci */
35862306a36Sopenharmony_civoid amdgpu_amdkfd_release_notify(struct amdgpu_bo *bo);
35962306a36Sopenharmony_civoid amdgpu_amdkfd_reserve_system_mem(uint64_t size);
36062306a36Sopenharmony_ci#else
36162306a36Sopenharmony_cistatic inline
36262306a36Sopenharmony_civoid amdgpu_amdkfd_gpuvm_init_mem_limits(void)
36362306a36Sopenharmony_ci{
36462306a36Sopenharmony_ci}
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_cistatic inline
36762306a36Sopenharmony_civoid amdgpu_amdkfd_gpuvm_destroy_cb(struct amdgpu_device *adev,
36862306a36Sopenharmony_ci					struct amdgpu_vm *vm)
36962306a36Sopenharmony_ci{
37062306a36Sopenharmony_ci}
37162306a36Sopenharmony_ci
37262306a36Sopenharmony_cistatic inline
37362306a36Sopenharmony_civoid amdgpu_amdkfd_release_notify(struct amdgpu_bo *bo)
37462306a36Sopenharmony_ci{
37562306a36Sopenharmony_ci}
37662306a36Sopenharmony_ci#endif
37762306a36Sopenharmony_ci
37862306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_HSA_AMD_SVM)
37962306a36Sopenharmony_ciint kgd2kfd_init_zone_device(struct amdgpu_device *adev);
38062306a36Sopenharmony_ci#else
38162306a36Sopenharmony_cistatic inline
38262306a36Sopenharmony_ciint kgd2kfd_init_zone_device(struct amdgpu_device *adev)
38362306a36Sopenharmony_ci{
38462306a36Sopenharmony_ci	return 0;
38562306a36Sopenharmony_ci}
38662306a36Sopenharmony_ci#endif
38762306a36Sopenharmony_ci
38862306a36Sopenharmony_ci/* KGD2KFD callbacks */
38962306a36Sopenharmony_ciint kgd2kfd_quiesce_mm(struct mm_struct *mm, uint32_t trigger);
39062306a36Sopenharmony_ciint kgd2kfd_resume_mm(struct mm_struct *mm);
39162306a36Sopenharmony_ciint kgd2kfd_schedule_evict_and_restore_process(struct mm_struct *mm,
39262306a36Sopenharmony_ci						struct dma_fence *fence);
39362306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_HSA_AMD)
39462306a36Sopenharmony_ciint kgd2kfd_init(void);
39562306a36Sopenharmony_civoid kgd2kfd_exit(void);
39662306a36Sopenharmony_cistruct kfd_dev *kgd2kfd_probe(struct amdgpu_device *adev, bool vf);
39762306a36Sopenharmony_cibool kgd2kfd_device_init(struct kfd_dev *kfd,
39862306a36Sopenharmony_ci			 const struct kgd2kfd_shared_resources *gpu_resources);
39962306a36Sopenharmony_civoid kgd2kfd_device_exit(struct kfd_dev *kfd);
40062306a36Sopenharmony_civoid kgd2kfd_suspend(struct kfd_dev *kfd, bool run_pm);
40162306a36Sopenharmony_ciint kgd2kfd_resume(struct kfd_dev *kfd, bool run_pm);
40262306a36Sopenharmony_ciint kgd2kfd_pre_reset(struct kfd_dev *kfd);
40362306a36Sopenharmony_ciint kgd2kfd_post_reset(struct kfd_dev *kfd);
40462306a36Sopenharmony_civoid kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry);
40562306a36Sopenharmony_civoid kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd);
40662306a36Sopenharmony_civoid kgd2kfd_smi_event_throttle(struct kfd_dev *kfd, uint64_t throttle_bitmask);
40762306a36Sopenharmony_ciint kgd2kfd_check_and_lock_kfd(void);
40862306a36Sopenharmony_civoid kgd2kfd_unlock_kfd(void);
40962306a36Sopenharmony_ci#else
41062306a36Sopenharmony_cistatic inline int kgd2kfd_init(void)
41162306a36Sopenharmony_ci{
41262306a36Sopenharmony_ci	return -ENOENT;
41362306a36Sopenharmony_ci}
41462306a36Sopenharmony_ci
41562306a36Sopenharmony_cistatic inline void kgd2kfd_exit(void)
41662306a36Sopenharmony_ci{
41762306a36Sopenharmony_ci}
41862306a36Sopenharmony_ci
41962306a36Sopenharmony_cistatic inline
42062306a36Sopenharmony_cistruct kfd_dev *kgd2kfd_probe(struct amdgpu_device *adev, bool vf)
42162306a36Sopenharmony_ci{
42262306a36Sopenharmony_ci	return NULL;
42362306a36Sopenharmony_ci}
42462306a36Sopenharmony_ci
42562306a36Sopenharmony_cistatic inline
42662306a36Sopenharmony_cibool kgd2kfd_device_init(struct kfd_dev *kfd,
42762306a36Sopenharmony_ci				const struct kgd2kfd_shared_resources *gpu_resources)
42862306a36Sopenharmony_ci{
42962306a36Sopenharmony_ci	return false;
43062306a36Sopenharmony_ci}
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_cistatic inline void kgd2kfd_device_exit(struct kfd_dev *kfd)
43362306a36Sopenharmony_ci{
43462306a36Sopenharmony_ci}
43562306a36Sopenharmony_ci
43662306a36Sopenharmony_cistatic inline void kgd2kfd_suspend(struct kfd_dev *kfd, bool run_pm)
43762306a36Sopenharmony_ci{
43862306a36Sopenharmony_ci}
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_cistatic inline int kgd2kfd_resume(struct kfd_dev *kfd, bool run_pm)
44162306a36Sopenharmony_ci{
44262306a36Sopenharmony_ci	return 0;
44362306a36Sopenharmony_ci}
44462306a36Sopenharmony_ci
44562306a36Sopenharmony_cistatic inline int kgd2kfd_pre_reset(struct kfd_dev *kfd)
44662306a36Sopenharmony_ci{
44762306a36Sopenharmony_ci	return 0;
44862306a36Sopenharmony_ci}
44962306a36Sopenharmony_ci
45062306a36Sopenharmony_cistatic inline int kgd2kfd_post_reset(struct kfd_dev *kfd)
45162306a36Sopenharmony_ci{
45262306a36Sopenharmony_ci	return 0;
45362306a36Sopenharmony_ci}
45462306a36Sopenharmony_ci
45562306a36Sopenharmony_cistatic inline
45662306a36Sopenharmony_civoid kgd2kfd_interrupt(struct kfd_dev *kfd, const void *ih_ring_entry)
45762306a36Sopenharmony_ci{
45862306a36Sopenharmony_ci}
45962306a36Sopenharmony_ci
46062306a36Sopenharmony_cistatic inline
46162306a36Sopenharmony_civoid kgd2kfd_set_sram_ecc_flag(struct kfd_dev *kfd)
46262306a36Sopenharmony_ci{
46362306a36Sopenharmony_ci}
46462306a36Sopenharmony_ci
46562306a36Sopenharmony_cistatic inline
46662306a36Sopenharmony_civoid kgd2kfd_smi_event_throttle(struct kfd_dev *kfd, uint64_t throttle_bitmask)
46762306a36Sopenharmony_ci{
46862306a36Sopenharmony_ci}
46962306a36Sopenharmony_ci
47062306a36Sopenharmony_cistatic inline int kgd2kfd_check_and_lock_kfd(void)
47162306a36Sopenharmony_ci{
47262306a36Sopenharmony_ci	return 0;
47362306a36Sopenharmony_ci}
47462306a36Sopenharmony_ci
47562306a36Sopenharmony_cistatic inline void kgd2kfd_unlock_kfd(void)
47662306a36Sopenharmony_ci{
47762306a36Sopenharmony_ci}
47862306a36Sopenharmony_ci#endif
47962306a36Sopenharmony_ci#endif /* AMDGPU_AMDKFD_H_INCLUDED */
480