xref: /openbmc/linux/drivers/gpu/drm/amd/amdkfd/kfd_priv.h (revision ed8aab45)
14a488a7aSOded Gabbay /*
24a488a7aSOded Gabbay  * Copyright 2014 Advanced Micro Devices, Inc.
34a488a7aSOded Gabbay  *
44a488a7aSOded Gabbay  * Permission is hereby granted, free of charge, to any person obtaining a
54a488a7aSOded Gabbay  * copy of this software and associated documentation files (the "Software"),
64a488a7aSOded Gabbay  * to deal in the Software without restriction, including without limitation
74a488a7aSOded Gabbay  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
84a488a7aSOded Gabbay  * and/or sell copies of the Software, and to permit persons to whom the
94a488a7aSOded Gabbay  * Software is furnished to do so, subject to the following conditions:
104a488a7aSOded Gabbay  *
114a488a7aSOded Gabbay  * The above copyright notice and this permission notice shall be included in
124a488a7aSOded Gabbay  * all copies or substantial portions of the Software.
134a488a7aSOded Gabbay  *
144a488a7aSOded Gabbay  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
154a488a7aSOded Gabbay  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
164a488a7aSOded Gabbay  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
174a488a7aSOded Gabbay  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
184a488a7aSOded Gabbay  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
194a488a7aSOded Gabbay  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
204a488a7aSOded Gabbay  * OTHER DEALINGS IN THE SOFTWARE.
214a488a7aSOded Gabbay  */
224a488a7aSOded Gabbay 
234a488a7aSOded Gabbay #ifndef KFD_PRIV_H_INCLUDED
244a488a7aSOded Gabbay #define KFD_PRIV_H_INCLUDED
254a488a7aSOded Gabbay 
264a488a7aSOded Gabbay #include <linux/hashtable.h>
274a488a7aSOded Gabbay #include <linux/mmu_notifier.h>
284a488a7aSOded Gabbay #include <linux/mutex.h>
294a488a7aSOded Gabbay #include <linux/types.h>
304a488a7aSOded Gabbay #include <linux/atomic.h>
314a488a7aSOded Gabbay #include <linux/workqueue.h>
324a488a7aSOded Gabbay #include <linux/spinlock.h>
3319f6d2a6SOded Gabbay #include <linux/kfd_ioctl.h>
344a488a7aSOded Gabbay #include <kgd_kfd_interface.h>
354a488a7aSOded Gabbay 
365b5c4e40SEvgeny Pinchuk #define KFD_SYSFS_FILE_MODE 0444
375b5c4e40SEvgeny Pinchuk 
385b5c4e40SEvgeny Pinchuk /* GPU ID hash width in bits */
395b5c4e40SEvgeny Pinchuk #define KFD_GPU_ID_HASH_WIDTH 16
405b5c4e40SEvgeny Pinchuk 
415b5c4e40SEvgeny Pinchuk /* Macro for allocating structures */
425b5c4e40SEvgeny Pinchuk #define kfd_alloc_struct(ptr_to_struct)	\
435b5c4e40SEvgeny Pinchuk 	((typeof(ptr_to_struct)) kzalloc(sizeof(*ptr_to_struct), GFP_KERNEL))
445b5c4e40SEvgeny Pinchuk 
4519f6d2a6SOded Gabbay /* Kernel module parameter to specify maximum number of supported processes */
4619f6d2a6SOded Gabbay extern int max_num_of_processes;
4719f6d2a6SOded Gabbay 
4819f6d2a6SOded Gabbay #define KFD_MAX_NUM_OF_PROCESSES_DEFAULT 32
4919f6d2a6SOded Gabbay #define KFD_MAX_NUM_OF_PROCESSES 512
5019f6d2a6SOded Gabbay 
5119f6d2a6SOded Gabbay /*
5219f6d2a6SOded Gabbay  * Kernel module parameter to specify maximum number of supported queues
5319f6d2a6SOded Gabbay  * per process
5419f6d2a6SOded Gabbay  */
5519f6d2a6SOded Gabbay extern int max_num_of_queues_per_process;
5619f6d2a6SOded Gabbay 
5719f6d2a6SOded Gabbay #define KFD_MAX_NUM_OF_QUEUES_PER_PROCESS_DEFAULT 128
5819f6d2a6SOded Gabbay #define KFD_MAX_NUM_OF_QUEUES_PER_PROCESS 1024
5919f6d2a6SOded Gabbay 
604a488a7aSOded Gabbay struct kfd_device_info {
614a488a7aSOded Gabbay 	unsigned int max_pasid_bits;
624a488a7aSOded Gabbay 	size_t ih_ring_entry_size;
6319f6d2a6SOded Gabbay 	uint16_t mqd_size_aligned;
644a488a7aSOded Gabbay };
654a488a7aSOded Gabbay 
664a488a7aSOded Gabbay struct kfd_dev {
674a488a7aSOded Gabbay 	struct kgd_dev *kgd;
684a488a7aSOded Gabbay 
694a488a7aSOded Gabbay 	const struct kfd_device_info *device_info;
704a488a7aSOded Gabbay 	struct pci_dev *pdev;
714a488a7aSOded Gabbay 
724a488a7aSOded Gabbay 	unsigned int id;		/* topology stub index */
734a488a7aSOded Gabbay 
7419f6d2a6SOded Gabbay 	phys_addr_t doorbell_base;	/* Start of actual doorbells used by
7519f6d2a6SOded Gabbay 					 * KFD. It is aligned for mapping
7619f6d2a6SOded Gabbay 					 * into user mode
7719f6d2a6SOded Gabbay 					 */
7819f6d2a6SOded Gabbay 	size_t doorbell_id_offset;	/* Doorbell offset (from KFD doorbell
7919f6d2a6SOded Gabbay 					 * to HW doorbell, GFX reserved some
8019f6d2a6SOded Gabbay 					 * at the start)
8119f6d2a6SOded Gabbay 					 */
8219f6d2a6SOded Gabbay 	size_t doorbell_process_limit;	/* Number of processes we have doorbell
8319f6d2a6SOded Gabbay 					 * space for.
8419f6d2a6SOded Gabbay 					 */
8519f6d2a6SOded Gabbay 	u32 __iomem *doorbell_kernel_ptr; /* This is a pointer for a doorbells
8619f6d2a6SOded Gabbay 					   * page used by kernel queue
8719f6d2a6SOded Gabbay 					   */
8819f6d2a6SOded Gabbay 
894a488a7aSOded Gabbay 	struct kgd2kfd_shared_resources shared_resources;
904a488a7aSOded Gabbay 
914a488a7aSOded Gabbay 	bool init_complete;
924a488a7aSOded Gabbay 
934a488a7aSOded Gabbay };
944a488a7aSOded Gabbay 
954a488a7aSOded Gabbay /* KGD2KFD callbacks */
964a488a7aSOded Gabbay void kgd2kfd_exit(void);
974a488a7aSOded Gabbay struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, struct pci_dev *pdev);
984a488a7aSOded Gabbay bool kgd2kfd_device_init(struct kfd_dev *kfd,
994a488a7aSOded Gabbay 			 const struct kgd2kfd_shared_resources *gpu_resources);
1004a488a7aSOded Gabbay void kgd2kfd_device_exit(struct kfd_dev *kfd);
1014a488a7aSOded Gabbay 
1024a488a7aSOded Gabbay extern const struct kfd2kgd_calls *kfd2kgd;
1034a488a7aSOded Gabbay 
10419f6d2a6SOded Gabbay struct kfd_mem_obj {
10519f6d2a6SOded Gabbay 	void *bo;
10619f6d2a6SOded Gabbay 	uint64_t gpu_addr;
10719f6d2a6SOded Gabbay 	uint32_t *cpu_ptr;
10819f6d2a6SOded Gabbay };
10919f6d2a6SOded Gabbay 
11019f6d2a6SOded Gabbay enum kfd_mempool {
11119f6d2a6SOded Gabbay 	KFD_MEMPOOL_SYSTEM_CACHEABLE = 1,
11219f6d2a6SOded Gabbay 	KFD_MEMPOOL_SYSTEM_WRITECOMBINE = 2,
11319f6d2a6SOded Gabbay 	KFD_MEMPOOL_FRAMEBUFFER = 3,
11419f6d2a6SOded Gabbay };
11519f6d2a6SOded Gabbay 
1164a488a7aSOded Gabbay /* Character device interface */
1174a488a7aSOded Gabbay int kfd_chardev_init(void);
1184a488a7aSOded Gabbay void kfd_chardev_exit(void);
1194a488a7aSOded Gabbay struct device *kfd_chardev(void);
1204a488a7aSOded Gabbay 
12119f6d2a6SOded Gabbay 
122ed8aab45SBen Goz /**
123ed8aab45SBen Goz  * enum kfd_queue_type
124ed8aab45SBen Goz  *
125ed8aab45SBen Goz  * @KFD_QUEUE_TYPE_COMPUTE: Regular user mode queue type.
126ed8aab45SBen Goz  *
127ed8aab45SBen Goz  * @KFD_QUEUE_TYPE_SDMA: Sdma user mode queue type.
128ed8aab45SBen Goz  *
129ed8aab45SBen Goz  * @KFD_QUEUE_TYPE_HIQ: HIQ queue type.
130ed8aab45SBen Goz  *
131ed8aab45SBen Goz  * @KFD_QUEUE_TYPE_DIQ: DIQ queue type.
132ed8aab45SBen Goz  */
133ed8aab45SBen Goz enum kfd_queue_type  {
134ed8aab45SBen Goz 	KFD_QUEUE_TYPE_COMPUTE,
135ed8aab45SBen Goz 	KFD_QUEUE_TYPE_SDMA,
136ed8aab45SBen Goz 	KFD_QUEUE_TYPE_HIQ,
137ed8aab45SBen Goz 	KFD_QUEUE_TYPE_DIQ
138ed8aab45SBen Goz };
139ed8aab45SBen Goz 
140ed8aab45SBen Goz /**
141ed8aab45SBen Goz  * struct queue_properties
142ed8aab45SBen Goz  *
143ed8aab45SBen Goz  * @type: The queue type.
144ed8aab45SBen Goz  *
145ed8aab45SBen Goz  * @queue_id: Queue identifier.
146ed8aab45SBen Goz  *
147ed8aab45SBen Goz  * @queue_address: Queue ring buffer address.
148ed8aab45SBen Goz  *
149ed8aab45SBen Goz  * @queue_size: Queue ring buffer size.
150ed8aab45SBen Goz  *
151ed8aab45SBen Goz  * @priority: Defines the queue priority relative to other queues in the
152ed8aab45SBen Goz  * process.
153ed8aab45SBen Goz  * This is just an indication and HW scheduling may override the priority as
154ed8aab45SBen Goz  * necessary while keeping the relative prioritization.
155ed8aab45SBen Goz  * the priority granularity is from 0 to f which f is the highest priority.
156ed8aab45SBen Goz  * currently all queues are initialized with the highest priority.
157ed8aab45SBen Goz  *
158ed8aab45SBen Goz  * @queue_percent: This field is partially implemented and currently a zero in
159ed8aab45SBen Goz  * this field defines that the queue is non active.
160ed8aab45SBen Goz  *
161ed8aab45SBen Goz  * @read_ptr: User space address which points to the number of dwords the
162ed8aab45SBen Goz  * cp read from the ring buffer. This field updates automatically by the H/W.
163ed8aab45SBen Goz  *
164ed8aab45SBen Goz  * @write_ptr: Defines the number of dwords written to the ring buffer.
165ed8aab45SBen Goz  *
166ed8aab45SBen Goz  * @doorbell_ptr: This field aim is to notify the H/W of new packet written to
167ed8aab45SBen Goz  * the queue ring buffer. This field should be similar to write_ptr and the user
168ed8aab45SBen Goz  * should update this field after he updated the write_ptr.
169ed8aab45SBen Goz  *
170ed8aab45SBen Goz  * @doorbell_off: The doorbell offset in the doorbell pci-bar.
171ed8aab45SBen Goz  *
172ed8aab45SBen Goz  * @is_interop: Defines if this is a interop queue. Interop queue means that the
173ed8aab45SBen Goz  * queue can access both graphics and compute resources.
174ed8aab45SBen Goz  *
175ed8aab45SBen Goz  * @is_active: Defines if the queue is active or not.
176ed8aab45SBen Goz  *
177ed8aab45SBen Goz  * @vmid: If the scheduling mode is no cp scheduling the field defines the vmid
178ed8aab45SBen Goz  * of the queue.
179ed8aab45SBen Goz  *
180ed8aab45SBen Goz  * This structure represents the queue properties for each queue no matter if
181ed8aab45SBen Goz  * it's user mode or kernel mode queue.
182ed8aab45SBen Goz  *
183ed8aab45SBen Goz  */
184ed8aab45SBen Goz struct queue_properties {
185ed8aab45SBen Goz 	enum kfd_queue_type type;
186ed8aab45SBen Goz 	unsigned int queue_id;
187ed8aab45SBen Goz 	uint64_t queue_address;
188ed8aab45SBen Goz 	uint64_t  queue_size;
189ed8aab45SBen Goz 	uint32_t priority;
190ed8aab45SBen Goz 	uint32_t queue_percent;
191ed8aab45SBen Goz 	uint32_t *read_ptr;
192ed8aab45SBen Goz 	uint32_t *write_ptr;
193ed8aab45SBen Goz 	uint32_t *doorbell_ptr;
194ed8aab45SBen Goz 	uint32_t doorbell_off;
195ed8aab45SBen Goz 	bool is_interop;
196ed8aab45SBen Goz 	bool is_active;
197ed8aab45SBen Goz 	/* Not relevant for user mode queues in cp scheduling */
198ed8aab45SBen Goz 	unsigned int vmid;
199ed8aab45SBen Goz };
200ed8aab45SBen Goz 
201ed8aab45SBen Goz /**
202ed8aab45SBen Goz  * struct queue
203ed8aab45SBen Goz  *
204ed8aab45SBen Goz  * @list: Queue linked list.
205ed8aab45SBen Goz  *
206ed8aab45SBen Goz  * @mqd: The queue MQD.
207ed8aab45SBen Goz  *
208ed8aab45SBen Goz  * @mqd_mem_obj: The MQD local gpu memory object.
209ed8aab45SBen Goz  *
210ed8aab45SBen Goz  * @gart_mqd_addr: The MQD gart mc address.
211ed8aab45SBen Goz  *
212ed8aab45SBen Goz  * @properties: The queue properties.
213ed8aab45SBen Goz  *
214ed8aab45SBen Goz  * @mec: Used only in no cp scheduling mode and identifies to micro engine id
215ed8aab45SBen Goz  * that the queue should be execute on.
216ed8aab45SBen Goz  *
217ed8aab45SBen Goz  * @pipe: Used only in no cp scheduling mode and identifies the queue's pipe id.
218ed8aab45SBen Goz  *
219ed8aab45SBen Goz  * @queue: Used only in no cp scheduliong mode and identifies the queue's slot.
220ed8aab45SBen Goz  *
221ed8aab45SBen Goz  * @process: The kfd process that created this queue.
222ed8aab45SBen Goz  *
223ed8aab45SBen Goz  * @device: The kfd device that created this queue.
224ed8aab45SBen Goz  *
225ed8aab45SBen Goz  * This structure represents user mode compute queues.
226ed8aab45SBen Goz  * It contains all the necessary data to handle such queues.
227ed8aab45SBen Goz  *
228ed8aab45SBen Goz  */
229ed8aab45SBen Goz 
230ed8aab45SBen Goz struct queue {
231ed8aab45SBen Goz 	struct list_head list;
232ed8aab45SBen Goz 	void *mqd;
233ed8aab45SBen Goz 	struct kfd_mem_obj *mqd_mem_obj;
234ed8aab45SBen Goz 	uint64_t gart_mqd_addr;
235ed8aab45SBen Goz 	struct queue_properties properties;
236ed8aab45SBen Goz 
237ed8aab45SBen Goz 	uint32_t mec;
238ed8aab45SBen Goz 	uint32_t pipe;
239ed8aab45SBen Goz 	uint32_t queue;
240ed8aab45SBen Goz 
241ed8aab45SBen Goz 	struct kfd_process	*process;
242ed8aab45SBen Goz 	struct kfd_dev		*device;
243ed8aab45SBen Goz };
244ed8aab45SBen Goz 
24519f6d2a6SOded Gabbay /* Data that is per-process-per device. */
24619f6d2a6SOded Gabbay struct kfd_process_device {
24719f6d2a6SOded Gabbay 	/*
24819f6d2a6SOded Gabbay 	 * List of all per-device data for a process.
24919f6d2a6SOded Gabbay 	 * Starts from kfd_process.per_device_data.
25019f6d2a6SOded Gabbay 	 */
25119f6d2a6SOded Gabbay 	struct list_head per_device_list;
25219f6d2a6SOded Gabbay 
25319f6d2a6SOded Gabbay 	/* The device that owns this data. */
25419f6d2a6SOded Gabbay 	struct kfd_dev *dev;
25519f6d2a6SOded Gabbay 
25619f6d2a6SOded Gabbay 
25719f6d2a6SOded Gabbay 	/*Apertures*/
25819f6d2a6SOded Gabbay 	uint64_t lds_base;
25919f6d2a6SOded Gabbay 	uint64_t lds_limit;
26019f6d2a6SOded Gabbay 	uint64_t gpuvm_base;
26119f6d2a6SOded Gabbay 	uint64_t gpuvm_limit;
26219f6d2a6SOded Gabbay 	uint64_t scratch_base;
26319f6d2a6SOded Gabbay 	uint64_t scratch_limit;
26419f6d2a6SOded Gabbay 
26519f6d2a6SOded Gabbay 	/* Is this process/pasid bound to this device? (amd_iommu_bind_pasid) */
26619f6d2a6SOded Gabbay 	bool bound;
26719f6d2a6SOded Gabbay };
26819f6d2a6SOded Gabbay 
2694a488a7aSOded Gabbay /* Process data */
2704a488a7aSOded Gabbay struct kfd_process {
27119f6d2a6SOded Gabbay 	/*
27219f6d2a6SOded Gabbay 	 * kfd_process are stored in an mm_struct*->kfd_process*
27319f6d2a6SOded Gabbay 	 * hash table (kfd_processes in kfd_process.c)
27419f6d2a6SOded Gabbay 	 */
27519f6d2a6SOded Gabbay 	struct hlist_node kfd_processes;
27619f6d2a6SOded Gabbay 
27719f6d2a6SOded Gabbay 	struct mm_struct *mm;
27819f6d2a6SOded Gabbay 
27919f6d2a6SOded Gabbay 	struct mutex mutex;
28019f6d2a6SOded Gabbay 
28119f6d2a6SOded Gabbay 	/*
28219f6d2a6SOded Gabbay 	 * In any process, the thread that started main() is the lead
28319f6d2a6SOded Gabbay 	 * thread and outlives the rest.
28419f6d2a6SOded Gabbay 	 * It is here because amd_iommu_bind_pasid wants a task_struct.
28519f6d2a6SOded Gabbay 	 */
28619f6d2a6SOded Gabbay 	struct task_struct *lead_thread;
28719f6d2a6SOded Gabbay 
28819f6d2a6SOded Gabbay 	/* We want to receive a notification when the mm_struct is destroyed */
28919f6d2a6SOded Gabbay 	struct mmu_notifier mmu_notifier;
29019f6d2a6SOded Gabbay 
29119f6d2a6SOded Gabbay 	/* Use for delayed freeing of kfd_process structure */
29219f6d2a6SOded Gabbay 	struct rcu_head	rcu;
29319f6d2a6SOded Gabbay 
29419f6d2a6SOded Gabbay 	unsigned int pasid;
29519f6d2a6SOded Gabbay 
29619f6d2a6SOded Gabbay 	/*
29719f6d2a6SOded Gabbay 	 * List of kfd_process_device structures,
29819f6d2a6SOded Gabbay 	 * one for each device the process is using.
29919f6d2a6SOded Gabbay 	 */
30019f6d2a6SOded Gabbay 	struct list_head per_device_data;
30119f6d2a6SOded Gabbay 
30219f6d2a6SOded Gabbay 	/* The process's queues. */
30319f6d2a6SOded Gabbay 	size_t queue_array_size;
30419f6d2a6SOded Gabbay 
30519f6d2a6SOded Gabbay 	/* Size is queue_array_size, up to MAX_PROCESS_QUEUES. */
30619f6d2a6SOded Gabbay 	struct kfd_queue **queues;
30719f6d2a6SOded Gabbay 
30819f6d2a6SOded Gabbay 	unsigned long allocated_queue_bitmap[DIV_ROUND_UP(KFD_MAX_NUM_OF_QUEUES_PER_PROCESS, BITS_PER_LONG)];
30919f6d2a6SOded Gabbay 
31019f6d2a6SOded Gabbay 	/*Is the user space process 32 bit?*/
31119f6d2a6SOded Gabbay 	bool is_32bit_user_mode;
3124a488a7aSOded Gabbay };
3134a488a7aSOded Gabbay 
31419f6d2a6SOded Gabbay void kfd_process_create_wq(void);
31519f6d2a6SOded Gabbay void kfd_process_destroy_wq(void);
31619f6d2a6SOded Gabbay struct kfd_process *kfd_create_process(const struct task_struct *);
31719f6d2a6SOded Gabbay struct kfd_process *kfd_get_process(const struct task_struct *);
31819f6d2a6SOded Gabbay 
319b17f068aSOded Gabbay void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid);
32019f6d2a6SOded Gabbay struct kfd_process_device *kfd_get_process_device_data(struct kfd_dev *dev,
32119f6d2a6SOded Gabbay 							struct kfd_process *p,
32219f6d2a6SOded Gabbay 							int create_pdd);
32319f6d2a6SOded Gabbay 
32419f6d2a6SOded Gabbay /* PASIDs */
32519f6d2a6SOded Gabbay int kfd_pasid_init(void);
32619f6d2a6SOded Gabbay void kfd_pasid_exit(void);
32719f6d2a6SOded Gabbay bool kfd_set_pasid_limit(unsigned int new_limit);
32819f6d2a6SOded Gabbay unsigned int kfd_get_pasid_limit(void);
32919f6d2a6SOded Gabbay unsigned int kfd_pasid_alloc(void);
33019f6d2a6SOded Gabbay void kfd_pasid_free(unsigned int pasid);
33119f6d2a6SOded Gabbay 
33219f6d2a6SOded Gabbay /* Doorbells */
33319f6d2a6SOded Gabbay void kfd_doorbell_init(struct kfd_dev *kfd);
33419f6d2a6SOded Gabbay int kfd_doorbell_mmap(struct kfd_process *process, struct vm_area_struct *vma);
33519f6d2a6SOded Gabbay u32 __iomem *kfd_get_kernel_doorbell(struct kfd_dev *kfd,
33619f6d2a6SOded Gabbay 					unsigned int *doorbell_off);
33719f6d2a6SOded Gabbay void kfd_release_kernel_doorbell(struct kfd_dev *kfd, u32 __iomem *db_addr);
33819f6d2a6SOded Gabbay u32 read_kernel_doorbell(u32 __iomem *db);
33919f6d2a6SOded Gabbay void write_kernel_doorbell(u32 __iomem *db, u32 value);
34019f6d2a6SOded Gabbay unsigned int kfd_queue_id_to_doorbell(struct kfd_dev *kfd,
34119f6d2a6SOded Gabbay 					struct kfd_process *process,
34219f6d2a6SOded Gabbay 					unsigned int queue_id);
34319f6d2a6SOded Gabbay 
3444a488a7aSOded Gabbay extern struct device *kfd_device;
3454a488a7aSOded Gabbay 
3465b5c4e40SEvgeny Pinchuk /* Topology */
3475b5c4e40SEvgeny Pinchuk int kfd_topology_init(void);
3485b5c4e40SEvgeny Pinchuk void kfd_topology_shutdown(void);
3495b5c4e40SEvgeny Pinchuk int kfd_topology_add_device(struct kfd_dev *gpu);
3505b5c4e40SEvgeny Pinchuk int kfd_topology_remove_device(struct kfd_dev *gpu);
3515b5c4e40SEvgeny Pinchuk struct kfd_dev *kfd_device_by_id(uint32_t gpu_id);
3525b5c4e40SEvgeny Pinchuk struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev);
3535b5c4e40SEvgeny Pinchuk struct kfd_dev *kfd_topology_enum_kfd_devices(uint8_t idx);
3545b5c4e40SEvgeny Pinchuk 
3554a488a7aSOded Gabbay /* Interrupts */
3564a488a7aSOded Gabbay void kgd2kfd_interrupt(struct kfd_dev *dev, const void *ih_ring_entry);
3574a488a7aSOded Gabbay 
3584a488a7aSOded Gabbay /* Power Management */
3594a488a7aSOded Gabbay void kgd2kfd_suspend(struct kfd_dev *dev);
3604a488a7aSOded Gabbay int kgd2kfd_resume(struct kfd_dev *dev);
3614a488a7aSOded Gabbay 
36219f6d2a6SOded Gabbay /* amdkfd Apertures */
36319f6d2a6SOded Gabbay int kfd_init_apertures(struct kfd_process *process);
36419f6d2a6SOded Gabbay 
36519f6d2a6SOded Gabbay uint64_t kfd_get_number_elems(struct kfd_dev *kfd);
36619f6d2a6SOded Gabbay phys_addr_t kfd_get_process_doorbells(struct kfd_dev *dev,
36719f6d2a6SOded Gabbay 					struct kfd_process *process);
36819f6d2a6SOded Gabbay 
3694a488a7aSOded Gabbay #endif
370