| 
									
										
										
										
											2014-07-17 00:45:35 +03:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright 2014 Advanced Micro Devices, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Permission is hereby granted, free of charge, to any person obtaining a | 
					
						
							|  |  |  |  * copy of this software and associated documentation files (the "Software"), | 
					
						
							|  |  |  |  * to deal in the Software without restriction, including without limitation | 
					
						
							|  |  |  |  * the rights to use, copy, modify, merge, publish, distribute, sublicense, | 
					
						
							|  |  |  |  * and/or sell copies of the Software, and to permit persons to whom the | 
					
						
							|  |  |  |  * Software is furnished to do so, subject to the following conditions: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The above copyright notice and this permission notice shall be included in | 
					
						
							|  |  |  |  * all copies or substantial portions of the Software. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
					
						
							|  |  |  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
					
						
							|  |  |  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL | 
					
						
							|  |  |  |  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | 
					
						
							|  |  |  |  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | 
					
						
							|  |  |  |  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | 
					
						
							|  |  |  |  * OTHER DEALINGS IN THE SOFTWARE. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef KFD_KERNEL_QUEUE_H_
 | 
					
						
							|  |  |  | #define KFD_KERNEL_QUEUE_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <linux/list.h>
 | 
					
						
							|  |  |  | #include <linux/types.h>
 | 
					
						
							|  |  |  | #include "kfd_priv.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-01-12 15:53:44 +02:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * struct kernel_queue_ops | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @initialize: Initialize a kernel queue, including allocations of GART memory | 
					
						
							|  |  |  |  * needed for the queue. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @uninitialize: Uninitialize a kernel queue and free all its memory usages. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @acquire_packet_buffer: Returns a pointer to the location in the kernel | 
					
						
							|  |  |  |  * queue ring buffer where the calling function can write its packet. It is | 
					
						
							|  |  |  |  * Guaranteed that there is enough space for that packet. It also updates the | 
					
						
							|  |  |  |  * pending write pointer to that location so subsequent calls to | 
					
						
							|  |  |  |  * acquire_packet_buffer will get a correct write pointer | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @submit_packet: Update the write pointer and doorbell of a kernel queue. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @sync_with_hw: Wait until the write pointer and the read pointer of a kernel | 
					
						
							|  |  |  |  * queue are equal, which means the CP has read all the submitted packets. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @rollback_packet: This routine is called if we failed to build an acquired | 
					
						
							|  |  |  |  * packet for some reason. It just overwrites the pending wptr with the current | 
					
						
							|  |  |  |  * one | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct kernel_queue_ops { | 
					
						
							| 
									
										
										
										
											2014-07-17 00:45:35 +03:00
										 |  |  | 	bool	(*initialize)(struct kernel_queue *kq, struct kfd_dev *dev, | 
					
						
							|  |  |  | 			enum kfd_queue_type type, unsigned int queue_size); | 
					
						
							|  |  |  | 	void	(*uninitialize)(struct kernel_queue *kq); | 
					
						
							|  |  |  | 	int	(*acquire_packet_buffer)(struct kernel_queue *kq, | 
					
						
							|  |  |  | 					size_t packet_size_in_dwords, | 
					
						
							|  |  |  | 					unsigned int **buffer_ptr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	void	(*submit_packet)(struct kernel_queue *kq); | 
					
						
							|  |  |  | 	void	(*rollback_packet)(struct kernel_queue *kq); | 
					
						
							| 
									
										
										
										
											2015-01-12 15:53:44 +02:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct kernel_queue { | 
					
						
							|  |  |  | 	struct kernel_queue_ops ops; | 
					
						
							| 
									
										
										
										
											2014-12-02 16:38:57 +02:00
										 |  |  | 	struct kernel_queue_ops ops_asic_specific; | 
					
						
							| 
									
										
										
										
											2014-07-17 00:45:35 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* data */ | 
					
						
							|  |  |  | 	struct kfd_dev		*dev; | 
					
						
							|  |  |  | 	struct mqd_manager	*mqd; | 
					
						
							|  |  |  | 	struct queue		*queue; | 
					
						
							|  |  |  | 	uint32_t		pending_wptr; | 
					
						
							|  |  |  | 	unsigned int		nop_packet; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	struct kfd_mem_obj	*rptr_mem; | 
					
						
							|  |  |  | 	uint32_t		*rptr_kernel; | 
					
						
							|  |  |  | 	uint64_t		rptr_gpu_addr; | 
					
						
							|  |  |  | 	struct kfd_mem_obj	*wptr_mem; | 
					
						
							|  |  |  | 	uint32_t		*wptr_kernel; | 
					
						
							|  |  |  | 	uint64_t		wptr_gpu_addr; | 
					
						
							|  |  |  | 	struct kfd_mem_obj	*pq; | 
					
						
							|  |  |  | 	uint64_t		pq_gpu_addr; | 
					
						
							|  |  |  | 	uint32_t		*pq_kernel_addr; | 
					
						
							| 
									
										
										
										
											2014-12-02 16:38:57 +02:00
										 |  |  | 	struct kfd_mem_obj	*eop_mem; | 
					
						
							|  |  |  | 	uint64_t		eop_gpu_addr; | 
					
						
							|  |  |  | 	uint32_t		*eop_kernel_addr; | 
					
						
							| 
									
										
										
										
											2014-07-17 00:45:35 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	struct kfd_mem_obj	*fence_mem_obj; | 
					
						
							|  |  |  | 	uint64_t		fence_gpu_addr; | 
					
						
							|  |  |  | 	void			*fence_kernel_address; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	struct list_head	list; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-02 16:38:57 +02:00
										 |  |  | void kernel_queue_init_cik(struct kernel_queue_ops *ops); | 
					
						
							|  |  |  | void kernel_queue_init_vi(struct kernel_queue_ops *ops); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-17 00:45:35 +03:00
										 |  |  | #endif /* KFD_KERNEL_QUEUE_H_ */
 |