xref: /openbmc/linux/drivers/gpu/drm/amd/amdkfd/kfd_priv.h (revision ed6e6a34)
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 
38ed6e6a34SBen Goz /*
39ed6e6a34SBen Goz  * When working with cp scheduler we should assign the HIQ manually or via
40ed6e6a34SBen Goz  * the radeon driver to a fixed hqd slot, here are the fixed HIQ hqd slot
41ed6e6a34SBen Goz  * definitions for Kaveri. In Kaveri only the first ME queues participates
42ed6e6a34SBen Goz  * in the cp scheduling taking that in mind we set the HIQ slot in the
43ed6e6a34SBen Goz  * second ME.
44ed6e6a34SBen Goz  */
45ed6e6a34SBen Goz #define KFD_CIK_HIQ_PIPE 4
46ed6e6a34SBen Goz #define KFD_CIK_HIQ_QUEUE 0
47ed6e6a34SBen Goz 
485b5c4e40SEvgeny Pinchuk /* GPU ID hash width in bits */
495b5c4e40SEvgeny Pinchuk #define KFD_GPU_ID_HASH_WIDTH 16
505b5c4e40SEvgeny Pinchuk 
515b5c4e40SEvgeny Pinchuk /* Macro for allocating structures */
525b5c4e40SEvgeny Pinchuk #define kfd_alloc_struct(ptr_to_struct)	\
535b5c4e40SEvgeny Pinchuk 	((typeof(ptr_to_struct)) kzalloc(sizeof(*ptr_to_struct), GFP_KERNEL))
545b5c4e40SEvgeny Pinchuk 
5519f6d2a6SOded Gabbay /* Kernel module parameter to specify maximum number of supported processes */
5619f6d2a6SOded Gabbay extern int max_num_of_processes;
5719f6d2a6SOded Gabbay 
5819f6d2a6SOded Gabbay #define KFD_MAX_NUM_OF_PROCESSES_DEFAULT 32
5919f6d2a6SOded Gabbay #define KFD_MAX_NUM_OF_PROCESSES 512
6019f6d2a6SOded Gabbay 
6119f6d2a6SOded Gabbay /*
6219f6d2a6SOded Gabbay  * Kernel module parameter to specify maximum number of supported queues
6319f6d2a6SOded Gabbay  * per process
6419f6d2a6SOded Gabbay  */
6519f6d2a6SOded Gabbay extern int max_num_of_queues_per_process;
6619f6d2a6SOded Gabbay 
6719f6d2a6SOded Gabbay #define KFD_MAX_NUM_OF_QUEUES_PER_PROCESS_DEFAULT 128
6819f6d2a6SOded Gabbay #define KFD_MAX_NUM_OF_QUEUES_PER_PROCESS 1024
6919f6d2a6SOded Gabbay 
70ed6e6a34SBen Goz #define KFD_KERNEL_QUEUE_SIZE 2048
71ed6e6a34SBen Goz 
72ed6e6a34SBen Goz enum cache_policy {
73ed6e6a34SBen Goz 	cache_policy_coherent,
74ed6e6a34SBen Goz 	cache_policy_noncoherent
75ed6e6a34SBen Goz };
76ed6e6a34SBen Goz 
774a488a7aSOded Gabbay struct kfd_device_info {
784a488a7aSOded Gabbay 	unsigned int max_pasid_bits;
794a488a7aSOded Gabbay 	size_t ih_ring_entry_size;
8019f6d2a6SOded Gabbay 	uint16_t mqd_size_aligned;
814a488a7aSOded Gabbay };
824a488a7aSOded Gabbay 
834a488a7aSOded Gabbay struct kfd_dev {
844a488a7aSOded Gabbay 	struct kgd_dev *kgd;
854a488a7aSOded Gabbay 
864a488a7aSOded Gabbay 	const struct kfd_device_info *device_info;
874a488a7aSOded Gabbay 	struct pci_dev *pdev;
884a488a7aSOded Gabbay 
894a488a7aSOded Gabbay 	unsigned int id;		/* topology stub index */
904a488a7aSOded Gabbay 
9119f6d2a6SOded Gabbay 	phys_addr_t doorbell_base;	/* Start of actual doorbells used by
9219f6d2a6SOded Gabbay 					 * KFD. It is aligned for mapping
9319f6d2a6SOded Gabbay 					 * into user mode
9419f6d2a6SOded Gabbay 					 */
9519f6d2a6SOded Gabbay 	size_t doorbell_id_offset;	/* Doorbell offset (from KFD doorbell
9619f6d2a6SOded Gabbay 					 * to HW doorbell, GFX reserved some
9719f6d2a6SOded Gabbay 					 * at the start)
9819f6d2a6SOded Gabbay 					 */
9919f6d2a6SOded Gabbay 	size_t doorbell_process_limit;	/* Number of processes we have doorbell
10019f6d2a6SOded Gabbay 					 * space for.
10119f6d2a6SOded Gabbay 					 */
10219f6d2a6SOded Gabbay 	u32 __iomem *doorbell_kernel_ptr; /* This is a pointer for a doorbells
10319f6d2a6SOded Gabbay 					   * page used by kernel queue
10419f6d2a6SOded Gabbay 					   */
10519f6d2a6SOded Gabbay 
1064a488a7aSOded Gabbay 	struct kgd2kfd_shared_resources shared_resources;
1074a488a7aSOded Gabbay 
108ed6e6a34SBen Goz 	/* QCM Device instance */
109ed6e6a34SBen Goz 	struct device_queue_manager *dqm;
1104a488a7aSOded Gabbay 
111ed6e6a34SBen Goz 	bool init_complete;
1124a488a7aSOded Gabbay };
1134a488a7aSOded Gabbay 
1144a488a7aSOded Gabbay /* KGD2KFD callbacks */
1154a488a7aSOded Gabbay void kgd2kfd_exit(void);
1164a488a7aSOded Gabbay struct kfd_dev *kgd2kfd_probe(struct kgd_dev *kgd, struct pci_dev *pdev);
1174a488a7aSOded Gabbay bool kgd2kfd_device_init(struct kfd_dev *kfd,
1184a488a7aSOded Gabbay 			 const struct kgd2kfd_shared_resources *gpu_resources);
1194a488a7aSOded Gabbay void kgd2kfd_device_exit(struct kfd_dev *kfd);
1204a488a7aSOded Gabbay 
1214a488a7aSOded Gabbay extern const struct kfd2kgd_calls *kfd2kgd;
1224a488a7aSOded Gabbay 
12319f6d2a6SOded Gabbay struct kfd_mem_obj {
12419f6d2a6SOded Gabbay 	void *bo;
12519f6d2a6SOded Gabbay 	uint64_t gpu_addr;
12619f6d2a6SOded Gabbay 	uint32_t *cpu_ptr;
12719f6d2a6SOded Gabbay };
12819f6d2a6SOded Gabbay 
12919f6d2a6SOded Gabbay enum kfd_mempool {
13019f6d2a6SOded Gabbay 	KFD_MEMPOOL_SYSTEM_CACHEABLE = 1,
13119f6d2a6SOded Gabbay 	KFD_MEMPOOL_SYSTEM_WRITECOMBINE = 2,
13219f6d2a6SOded Gabbay 	KFD_MEMPOOL_FRAMEBUFFER = 3,
13319f6d2a6SOded Gabbay };
13419f6d2a6SOded Gabbay 
1354a488a7aSOded Gabbay /* Character device interface */
1364a488a7aSOded Gabbay int kfd_chardev_init(void);
1374a488a7aSOded Gabbay void kfd_chardev_exit(void);
1384a488a7aSOded Gabbay struct device *kfd_chardev(void);
1394a488a7aSOded Gabbay 
14019f6d2a6SOded Gabbay 
1416e99df57SBen Goz enum kfd_preempt_type {
1426e99df57SBen Goz 	KFD_PREEMPT_TYPE_WAVEFRONT,
1436e99df57SBen Goz 	KFD_PREEMPT_TYPE_WAVEFRONT_RESET
1446e99df57SBen Goz };
1456e99df57SBen Goz 
146ed8aab45SBen Goz /**
147ed8aab45SBen Goz  * enum kfd_queue_type
148ed8aab45SBen Goz  *
149ed8aab45SBen Goz  * @KFD_QUEUE_TYPE_COMPUTE: Regular user mode queue type.
150ed8aab45SBen Goz  *
151ed8aab45SBen Goz  * @KFD_QUEUE_TYPE_SDMA: Sdma user mode queue type.
152ed8aab45SBen Goz  *
153ed8aab45SBen Goz  * @KFD_QUEUE_TYPE_HIQ: HIQ queue type.
154ed8aab45SBen Goz  *
155ed8aab45SBen Goz  * @KFD_QUEUE_TYPE_DIQ: DIQ queue type.
156ed8aab45SBen Goz  */
157ed8aab45SBen Goz enum kfd_queue_type  {
158ed8aab45SBen Goz 	KFD_QUEUE_TYPE_COMPUTE,
159ed8aab45SBen Goz 	KFD_QUEUE_TYPE_SDMA,
160ed8aab45SBen Goz 	KFD_QUEUE_TYPE_HIQ,
161ed8aab45SBen Goz 	KFD_QUEUE_TYPE_DIQ
162ed8aab45SBen Goz };
163ed8aab45SBen Goz 
1646e99df57SBen Goz enum kfd_queue_format {
1656e99df57SBen Goz 	KFD_QUEUE_FORMAT_PM4,
1666e99df57SBen Goz 	KFD_QUEUE_FORMAT_AQL
1676e99df57SBen Goz };
1686e99df57SBen Goz 
169ed8aab45SBen Goz /**
170ed8aab45SBen Goz  * struct queue_properties
171ed8aab45SBen Goz  *
172ed8aab45SBen Goz  * @type: The queue type.
173ed8aab45SBen Goz  *
174ed8aab45SBen Goz  * @queue_id: Queue identifier.
175ed8aab45SBen Goz  *
176ed8aab45SBen Goz  * @queue_address: Queue ring buffer address.
177ed8aab45SBen Goz  *
178ed8aab45SBen Goz  * @queue_size: Queue ring buffer size.
179ed8aab45SBen Goz  *
180ed8aab45SBen Goz  * @priority: Defines the queue priority relative to other queues in the
181ed8aab45SBen Goz  * process.
182ed8aab45SBen Goz  * This is just an indication and HW scheduling may override the priority as
183ed8aab45SBen Goz  * necessary while keeping the relative prioritization.
184ed8aab45SBen Goz  * the priority granularity is from 0 to f which f is the highest priority.
185ed8aab45SBen Goz  * currently all queues are initialized with the highest priority.
186ed8aab45SBen Goz  *
187ed8aab45SBen Goz  * @queue_percent: This field is partially implemented and currently a zero in
188ed8aab45SBen Goz  * this field defines that the queue is non active.
189ed8aab45SBen Goz  *
190ed8aab45SBen Goz  * @read_ptr: User space address which points to the number of dwords the
191ed8aab45SBen Goz  * cp read from the ring buffer. This field updates automatically by the H/W.
192ed8aab45SBen Goz  *
193ed8aab45SBen Goz  * @write_ptr: Defines the number of dwords written to the ring buffer.
194ed8aab45SBen Goz  *
195ed8aab45SBen Goz  * @doorbell_ptr: This field aim is to notify the H/W of new packet written to
196ed8aab45SBen Goz  * the queue ring buffer. This field should be similar to write_ptr and the user
197ed8aab45SBen Goz  * should update this field after he updated the write_ptr.
198ed8aab45SBen Goz  *
199ed8aab45SBen Goz  * @doorbell_off: The doorbell offset in the doorbell pci-bar.
200ed8aab45SBen Goz  *
201ed8aab45SBen Goz  * @is_interop: Defines if this is a interop queue. Interop queue means that the
202ed8aab45SBen Goz  * queue can access both graphics and compute resources.
203ed8aab45SBen Goz  *
204ed8aab45SBen Goz  * @is_active: Defines if the queue is active or not.
205ed8aab45SBen Goz  *
206ed8aab45SBen Goz  * @vmid: If the scheduling mode is no cp scheduling the field defines the vmid
207ed8aab45SBen Goz  * of the queue.
208ed8aab45SBen Goz  *
209ed8aab45SBen Goz  * This structure represents the queue properties for each queue no matter if
210ed8aab45SBen Goz  * it's user mode or kernel mode queue.
211ed8aab45SBen Goz  *
212ed8aab45SBen Goz  */
213ed8aab45SBen Goz struct queue_properties {
214ed8aab45SBen Goz 	enum kfd_queue_type type;
2156e99df57SBen Goz 	enum kfd_queue_format format;
216ed8aab45SBen Goz 	unsigned int queue_id;
217ed8aab45SBen Goz 	uint64_t queue_address;
218ed8aab45SBen Goz 	uint64_t  queue_size;
219ed8aab45SBen Goz 	uint32_t priority;
220ed8aab45SBen Goz 	uint32_t queue_percent;
221ed8aab45SBen Goz 	uint32_t *read_ptr;
222ed8aab45SBen Goz 	uint32_t *write_ptr;
223ed8aab45SBen Goz 	uint32_t *doorbell_ptr;
224ed8aab45SBen Goz 	uint32_t doorbell_off;
225ed8aab45SBen Goz 	bool is_interop;
226ed8aab45SBen Goz 	bool is_active;
227ed8aab45SBen Goz 	/* Not relevant for user mode queues in cp scheduling */
228ed8aab45SBen Goz 	unsigned int vmid;
229ed8aab45SBen Goz };
230ed8aab45SBen Goz 
231ed8aab45SBen Goz /**
232ed8aab45SBen Goz  * struct queue
233ed8aab45SBen Goz  *
234ed8aab45SBen Goz  * @list: Queue linked list.
235ed8aab45SBen Goz  *
236ed8aab45SBen Goz  * @mqd: The queue MQD.
237ed8aab45SBen Goz  *
238ed8aab45SBen Goz  * @mqd_mem_obj: The MQD local gpu memory object.
239ed8aab45SBen Goz  *
240ed8aab45SBen Goz  * @gart_mqd_addr: The MQD gart mc address.
241ed8aab45SBen Goz  *
242ed8aab45SBen Goz  * @properties: The queue properties.
243ed8aab45SBen Goz  *
244ed8aab45SBen Goz  * @mec: Used only in no cp scheduling mode and identifies to micro engine id
245ed8aab45SBen Goz  * that the queue should be execute on.
246ed8aab45SBen Goz  *
247ed8aab45SBen Goz  * @pipe: Used only in no cp scheduling mode and identifies the queue's pipe id.
248ed8aab45SBen Goz  *
249ed8aab45SBen Goz  * @queue: Used only in no cp scheduliong mode and identifies the queue's slot.
250ed8aab45SBen Goz  *
251ed8aab45SBen Goz  * @process: The kfd process that created this queue.
252ed8aab45SBen Goz  *
253ed8aab45SBen Goz  * @device: The kfd device that created this queue.
254ed8aab45SBen Goz  *
255ed8aab45SBen Goz  * This structure represents user mode compute queues.
256ed8aab45SBen Goz  * It contains all the necessary data to handle such queues.
257ed8aab45SBen Goz  *
258ed8aab45SBen Goz  */
259ed8aab45SBen Goz 
260ed8aab45SBen Goz struct queue {
261ed8aab45SBen Goz 	struct list_head list;
262ed8aab45SBen Goz 	void *mqd;
263ed8aab45SBen Goz 	struct kfd_mem_obj *mqd_mem_obj;
264ed8aab45SBen Goz 	uint64_t gart_mqd_addr;
265ed8aab45SBen Goz 	struct queue_properties properties;
266ed8aab45SBen Goz 
267ed8aab45SBen Goz 	uint32_t mec;
268ed8aab45SBen Goz 	uint32_t pipe;
269ed8aab45SBen Goz 	uint32_t queue;
270ed8aab45SBen Goz 
271ed8aab45SBen Goz 	struct kfd_process	*process;
272ed8aab45SBen Goz 	struct kfd_dev		*device;
273ed8aab45SBen Goz };
274ed8aab45SBen Goz 
2756e99df57SBen Goz /*
2766e99df57SBen Goz  * Please read the kfd_mqd_manager.h description.
2776e99df57SBen Goz  */
2786e99df57SBen Goz enum KFD_MQD_TYPE {
2796e99df57SBen Goz 	KFD_MQD_TYPE_CIK_COMPUTE = 0, /* for no cp scheduling */
2806e99df57SBen Goz 	KFD_MQD_TYPE_CIK_HIQ, /* for hiq */
2816e99df57SBen Goz 	KFD_MQD_TYPE_CIK_CP, /* for cp queues and diq */
2826e99df57SBen Goz 	KFD_MQD_TYPE_CIK_SDMA, /* for sdma queues */
2836e99df57SBen Goz 	KFD_MQD_TYPE_MAX
2846e99df57SBen Goz };
2856e99df57SBen Goz 
28619f6d2a6SOded Gabbay /* Data that is per-process-per device. */
28719f6d2a6SOded Gabbay struct kfd_process_device {
28819f6d2a6SOded Gabbay 	/*
28919f6d2a6SOded Gabbay 	 * List of all per-device data for a process.
29019f6d2a6SOded Gabbay 	 * Starts from kfd_process.per_device_data.
29119f6d2a6SOded Gabbay 	 */
29219f6d2a6SOded Gabbay 	struct list_head per_device_list;
29319f6d2a6SOded Gabbay 
29419f6d2a6SOded Gabbay 	/* The device that owns this data. */
29519f6d2a6SOded Gabbay 	struct kfd_dev *dev;
29619f6d2a6SOded Gabbay 
29719f6d2a6SOded Gabbay 
29819f6d2a6SOded Gabbay 	/*Apertures*/
29919f6d2a6SOded Gabbay 	uint64_t lds_base;
30019f6d2a6SOded Gabbay 	uint64_t lds_limit;
30119f6d2a6SOded Gabbay 	uint64_t gpuvm_base;
30219f6d2a6SOded Gabbay 	uint64_t gpuvm_limit;
30319f6d2a6SOded Gabbay 	uint64_t scratch_base;
30419f6d2a6SOded Gabbay 	uint64_t scratch_limit;
30519f6d2a6SOded Gabbay 
30619f6d2a6SOded Gabbay 	/* Is this process/pasid bound to this device? (amd_iommu_bind_pasid) */
30719f6d2a6SOded Gabbay 	bool bound;
30819f6d2a6SOded Gabbay };
30919f6d2a6SOded Gabbay 
3104a488a7aSOded Gabbay /* Process data */
3114a488a7aSOded Gabbay struct kfd_process {
31219f6d2a6SOded Gabbay 	/*
31319f6d2a6SOded Gabbay 	 * kfd_process are stored in an mm_struct*->kfd_process*
31419f6d2a6SOded Gabbay 	 * hash table (kfd_processes in kfd_process.c)
31519f6d2a6SOded Gabbay 	 */
31619f6d2a6SOded Gabbay 	struct hlist_node kfd_processes;
31719f6d2a6SOded Gabbay 
31819f6d2a6SOded Gabbay 	struct mm_struct *mm;
31919f6d2a6SOded Gabbay 
32019f6d2a6SOded Gabbay 	struct mutex mutex;
32119f6d2a6SOded Gabbay 
32219f6d2a6SOded Gabbay 	/*
32319f6d2a6SOded Gabbay 	 * In any process, the thread that started main() is the lead
32419f6d2a6SOded Gabbay 	 * thread and outlives the rest.
32519f6d2a6SOded Gabbay 	 * It is here because amd_iommu_bind_pasid wants a task_struct.
32619f6d2a6SOded Gabbay 	 */
32719f6d2a6SOded Gabbay 	struct task_struct *lead_thread;
32819f6d2a6SOded Gabbay 
32919f6d2a6SOded Gabbay 	/* We want to receive a notification when the mm_struct is destroyed */
33019f6d2a6SOded Gabbay 	struct mmu_notifier mmu_notifier;
33119f6d2a6SOded Gabbay 
33219f6d2a6SOded Gabbay 	/* Use for delayed freeing of kfd_process structure */
33319f6d2a6SOded Gabbay 	struct rcu_head	rcu;
33419f6d2a6SOded Gabbay 
33519f6d2a6SOded Gabbay 	unsigned int pasid;
33619f6d2a6SOded Gabbay 
33719f6d2a6SOded Gabbay 	/*
33819f6d2a6SOded Gabbay 	 * List of kfd_process_device structures,
33919f6d2a6SOded Gabbay 	 * one for each device the process is using.
34019f6d2a6SOded Gabbay 	 */
34119f6d2a6SOded Gabbay 	struct list_head per_device_data;
34219f6d2a6SOded Gabbay 
34319f6d2a6SOded Gabbay 	/* The process's queues. */
34419f6d2a6SOded Gabbay 	size_t queue_array_size;
34519f6d2a6SOded Gabbay 
34619f6d2a6SOded Gabbay 	/* Size is queue_array_size, up to MAX_PROCESS_QUEUES. */
34719f6d2a6SOded Gabbay 	struct kfd_queue **queues;
34819f6d2a6SOded Gabbay 
34919f6d2a6SOded Gabbay 	unsigned long allocated_queue_bitmap[DIV_ROUND_UP(KFD_MAX_NUM_OF_QUEUES_PER_PROCESS, BITS_PER_LONG)];
35019f6d2a6SOded Gabbay 
35119f6d2a6SOded Gabbay 	/*Is the user space process 32 bit?*/
35219f6d2a6SOded Gabbay 	bool is_32bit_user_mode;
3534a488a7aSOded Gabbay };
3544a488a7aSOded Gabbay 
35519f6d2a6SOded Gabbay void kfd_process_create_wq(void);
35619f6d2a6SOded Gabbay void kfd_process_destroy_wq(void);
35719f6d2a6SOded Gabbay struct kfd_process *kfd_create_process(const struct task_struct *);
35819f6d2a6SOded Gabbay struct kfd_process *kfd_get_process(const struct task_struct *);
35919f6d2a6SOded Gabbay 
360b17f068aSOded Gabbay void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid);
36119f6d2a6SOded Gabbay struct kfd_process_device *kfd_get_process_device_data(struct kfd_dev *dev,
36219f6d2a6SOded Gabbay 							struct kfd_process *p,
36319f6d2a6SOded Gabbay 							int create_pdd);
36419f6d2a6SOded Gabbay 
36519f6d2a6SOded Gabbay /* PASIDs */
36619f6d2a6SOded Gabbay int kfd_pasid_init(void);
36719f6d2a6SOded Gabbay void kfd_pasid_exit(void);
36819f6d2a6SOded Gabbay bool kfd_set_pasid_limit(unsigned int new_limit);
36919f6d2a6SOded Gabbay unsigned int kfd_get_pasid_limit(void);
37019f6d2a6SOded Gabbay unsigned int kfd_pasid_alloc(void);
37119f6d2a6SOded Gabbay void kfd_pasid_free(unsigned int pasid);
37219f6d2a6SOded Gabbay 
37319f6d2a6SOded Gabbay /* Doorbells */
37419f6d2a6SOded Gabbay void kfd_doorbell_init(struct kfd_dev *kfd);
37519f6d2a6SOded Gabbay int kfd_doorbell_mmap(struct kfd_process *process, struct vm_area_struct *vma);
37619f6d2a6SOded Gabbay u32 __iomem *kfd_get_kernel_doorbell(struct kfd_dev *kfd,
37719f6d2a6SOded Gabbay 					unsigned int *doorbell_off);
37819f6d2a6SOded Gabbay void kfd_release_kernel_doorbell(struct kfd_dev *kfd, u32 __iomem *db_addr);
37919f6d2a6SOded Gabbay u32 read_kernel_doorbell(u32 __iomem *db);
38019f6d2a6SOded Gabbay void write_kernel_doorbell(u32 __iomem *db, u32 value);
38119f6d2a6SOded Gabbay unsigned int kfd_queue_id_to_doorbell(struct kfd_dev *kfd,
38219f6d2a6SOded Gabbay 					struct kfd_process *process,
38319f6d2a6SOded Gabbay 					unsigned int queue_id);
38419f6d2a6SOded Gabbay 
3854a488a7aSOded Gabbay extern struct device *kfd_device;
3864a488a7aSOded Gabbay 
3875b5c4e40SEvgeny Pinchuk /* Topology */
3885b5c4e40SEvgeny Pinchuk int kfd_topology_init(void);
3895b5c4e40SEvgeny Pinchuk void kfd_topology_shutdown(void);
3905b5c4e40SEvgeny Pinchuk int kfd_topology_add_device(struct kfd_dev *gpu);
3915b5c4e40SEvgeny Pinchuk int kfd_topology_remove_device(struct kfd_dev *gpu);
3925b5c4e40SEvgeny Pinchuk struct kfd_dev *kfd_device_by_id(uint32_t gpu_id);
3935b5c4e40SEvgeny Pinchuk struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev);
3945b5c4e40SEvgeny Pinchuk struct kfd_dev *kfd_topology_enum_kfd_devices(uint8_t idx);
3955b5c4e40SEvgeny Pinchuk 
3964a488a7aSOded Gabbay /* Interrupts */
3974a488a7aSOded Gabbay void kgd2kfd_interrupt(struct kfd_dev *dev, const void *ih_ring_entry);
3984a488a7aSOded Gabbay 
3994a488a7aSOded Gabbay /* Power Management */
4004a488a7aSOded Gabbay void kgd2kfd_suspend(struct kfd_dev *dev);
4014a488a7aSOded Gabbay int kgd2kfd_resume(struct kfd_dev *dev);
4024a488a7aSOded Gabbay 
40319f6d2a6SOded Gabbay /* amdkfd Apertures */
40419f6d2a6SOded Gabbay int kfd_init_apertures(struct kfd_process *process);
40519f6d2a6SOded Gabbay 
406ed6e6a34SBen Goz /* Queue Context Management */
407ed6e6a34SBen Goz int init_queue(struct queue **q, struct queue_properties properties);
408ed6e6a34SBen Goz void uninit_queue(struct queue *q);
409ed6e6a34SBen Goz void print_queue(struct queue *q);
410ed6e6a34SBen Goz 
411ed6e6a34SBen Goz /* Packet Manager */
412ed6e6a34SBen Goz 
413ed6e6a34SBen Goz struct packet_manager {
414ed6e6a34SBen Goz 	struct device_queue_manager *dqm;
415ed6e6a34SBen Goz 	struct kernel_queue *priv_queue;
416ed6e6a34SBen Goz 	struct mutex lock;
417ed6e6a34SBen Goz 	bool allocated;
418ed6e6a34SBen Goz 	struct kfd_mem_obj *ib_buffer_obj;
419ed6e6a34SBen Goz };
420ed6e6a34SBen Goz 
42119f6d2a6SOded Gabbay uint64_t kfd_get_number_elems(struct kfd_dev *kfd);
42219f6d2a6SOded Gabbay phys_addr_t kfd_get_process_doorbells(struct kfd_dev *dev,
42319f6d2a6SOded Gabbay 					struct kfd_process *process);
42419f6d2a6SOded Gabbay 
4254a488a7aSOded Gabbay #endif
426