| 
									
										
										
										
											2013-09-05 16:41:41 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Intel MIC Platform Software Stack (MPSS) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright(c) 2013 Intel Corporation. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License, version 2, as | 
					
						
							|  |  |  |  * published by the Free Software Foundation. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, but | 
					
						
							|  |  |  |  * WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | 
					
						
							|  |  |  |  * General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The full GNU General Public License is included in this distribution in | 
					
						
							|  |  |  |  * the file called "COPYING". | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Intel MIC Host driver. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #ifndef _MIC_INTR_H_
 | 
					
						
							|  |  |  | #define _MIC_INTR_H_
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-07-11 14:04:22 -07:00
										 |  |  | #include <linux/bitops.h>
 | 
					
						
							|  |  |  | #include <linux/interrupt.h>
 | 
					
						
							| 
									
										
										
										
											2013-09-05 16:41:41 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * The minimum number of msix vectors required for normal operation. | 
					
						
							|  |  |  |  * 3 for virtio network, console and block devices. | 
					
						
							|  |  |  |  * 1 for card shutdown notifications. | 
					
						
							| 
									
										
										
										
											2014-07-11 14:04:23 -07:00
										 |  |  |  * 4 for host owned DMA channels. | 
					
						
							| 
									
										
										
										
											2013-09-05 16:41:41 -07:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-07-11 14:04:23 -07:00
										 |  |  | #define MIC_MIN_MSIX 8
 | 
					
						
							| 
									
										
										
										
											2013-09-05 16:41:41 -07:00
										 |  |  | #define MIC_NUM_OFFSETS 32
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * mic_intr_source - The type of source that will generate | 
					
						
							|  |  |  |  * the interrupt.The number of types needs to be in sync with | 
					
						
							|  |  |  |  * MIC_NUM_INTR_TYPES | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * MIC_INTR_DB: The source is a doorbell | 
					
						
							|  |  |  |  * MIC_INTR_DMA: The source is a DMA channel | 
					
						
							|  |  |  |  * MIC_INTR_ERR: The source is an error interrupt e.g. SBOX ERR | 
					
						
							|  |  |  |  * MIC_NUM_INTR_TYPES: Total number of interrupt sources. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | enum mic_intr_type { | 
					
						
							|  |  |  | 	MIC_INTR_DB = 0, | 
					
						
							|  |  |  | 	MIC_INTR_DMA, | 
					
						
							|  |  |  | 	MIC_INTR_ERR, | 
					
						
							|  |  |  | 	MIC_NUM_INTR_TYPES | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * struct mic_intr_info - Contains h/w specific interrupt sources | 
					
						
							|  |  |  |  * information. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @intr_start_idx: Contains the starting indexes of the | 
					
						
							|  |  |  |  * interrupt types. | 
					
						
							|  |  |  |  * @intr_len: Contains the length of the interrupt types. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct mic_intr_info { | 
					
						
							|  |  |  | 	u16 intr_start_idx[MIC_NUM_INTR_TYPES]; | 
					
						
							|  |  |  | 	u16 intr_len[MIC_NUM_INTR_TYPES]; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * struct mic_irq_info - OS specific irq information | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @next_avail_src: next available doorbell that can be assigned. | 
					
						
							|  |  |  |  * @msix_entries: msix entries allocated while setting up MSI-x | 
					
						
							|  |  |  |  * @mic_msi_map: The MSI/MSI-x mapping information. | 
					
						
							|  |  |  |  * @num_vectors: The number of MSI/MSI-x vectors that have been allocated. | 
					
						
							|  |  |  |  * @cb_ida: callback ID allocator to track the callbacks registered. | 
					
						
							|  |  |  |  * @mic_intr_lock: spinlock to protect the interrupt callback list. | 
					
						
							| 
									
										
										
										
											2014-07-11 14:04:22 -07:00
										 |  |  |  * @mic_thread_lock: spinlock to protect the thread callback list. | 
					
						
							|  |  |  |  *		   This lock is used to protect against thread_fn while | 
					
						
							|  |  |  |  *		   mic_intr_lock is used to protect against interrupt handler. | 
					
						
							| 
									
										
										
										
											2013-09-05 16:41:41 -07:00
										 |  |  |  * @cb_list: Array of callback lists one for each source. | 
					
						
							| 
									
										
										
										
											2014-07-11 14:04:22 -07:00
										 |  |  |  * @mask: Mask used by the main thread fn to call the underlying thread fns. | 
					
						
							| 
									
										
										
										
											2013-09-05 16:41:41 -07:00
										 |  |  |  */ | 
					
						
							|  |  |  | struct mic_irq_info { | 
					
						
							|  |  |  | 	int next_avail_src; | 
					
						
							|  |  |  | 	struct msix_entry *msix_entries; | 
					
						
							|  |  |  | 	u32 *mic_msi_map; | 
					
						
							|  |  |  | 	u16 num_vectors; | 
					
						
							|  |  |  | 	struct ida cb_ida; | 
					
						
							|  |  |  | 	spinlock_t mic_intr_lock; | 
					
						
							| 
									
										
										
										
											2014-07-11 14:04:22 -07:00
										 |  |  | 	spinlock_t mic_thread_lock; | 
					
						
							| 
									
										
										
										
											2013-09-05 16:41:41 -07:00
										 |  |  | 	struct list_head *cb_list; | 
					
						
							| 
									
										
										
										
											2014-07-11 14:04:22 -07:00
										 |  |  | 	unsigned long mask; | 
					
						
							| 
									
										
										
										
											2013-09-05 16:41:41 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * struct mic_intr_cb - Interrupt callback structure. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2014-07-11 14:04:22 -07:00
										 |  |  |  * @handler: The callback function | 
					
						
							|  |  |  |  * @thread_fn: The thread_fn. | 
					
						
							| 
									
										
										
										
											2013-09-05 16:41:41 -07:00
										 |  |  |  * @data: Private data of the requester. | 
					
						
							|  |  |  |  * @cb_id: The callback id. Identifies this callback. | 
					
						
							|  |  |  |  * @list: list head pointing to the next callback structure. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct mic_intr_cb { | 
					
						
							| 
									
										
										
										
											2014-07-11 14:04:22 -07:00
										 |  |  | 	irq_handler_t handler; | 
					
						
							|  |  |  | 	irq_handler_t thread_fn; | 
					
						
							| 
									
										
										
										
											2013-09-05 16:41:41 -07:00
										 |  |  | 	void *data; | 
					
						
							|  |  |  | 	int cb_id; | 
					
						
							|  |  |  | 	struct list_head list; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * struct mic_irq - opaque pointer used as cookie | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct mic_irq; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Forward declaration */ | 
					
						
							|  |  |  | struct mic_device; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * struct mic_hw_intr_ops: MIC HW specific interrupt operations | 
					
						
							|  |  |  |  * @intr_init: Initialize H/W specific interrupt information. | 
					
						
							|  |  |  |  * @enable_interrupts: Enable interrupts from the hardware. | 
					
						
							|  |  |  |  * @disable_interrupts: Disable interrupts from the hardware. | 
					
						
							|  |  |  |  * @program_msi_to_src_map: Update MSI mapping registers with | 
					
						
							|  |  |  |  * irq information. | 
					
						
							|  |  |  |  * @read_msi_to_src_map: Read MSI mapping registers containing | 
					
						
							|  |  |  |  * irq information. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | struct mic_hw_intr_ops { | 
					
						
							|  |  |  | 	void (*intr_init)(struct mic_device *mdev); | 
					
						
							|  |  |  | 	void (*enable_interrupts)(struct mic_device *mdev); | 
					
						
							|  |  |  | 	void (*disable_interrupts)(struct mic_device *mdev); | 
					
						
							|  |  |  | 	void (*program_msi_to_src_map) (struct mic_device *mdev, | 
					
						
							|  |  |  | 			int idx, int intr_src, bool set); | 
					
						
							|  |  |  | 	u32 (*read_msi_to_src_map) (struct mic_device *mdev, | 
					
						
							|  |  |  | 			int idx); | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int mic_next_db(struct mic_device *mdev); | 
					
						
							| 
									
										
										
										
											2014-07-11 14:04:22 -07:00
										 |  |  | struct mic_irq * | 
					
						
							|  |  |  | mic_request_threaded_irq(struct mic_device *mdev, | 
					
						
							|  |  |  | 			 irq_handler_t handler, irq_handler_t thread_fn, | 
					
						
							|  |  |  | 			 const char *name, void *data, int intr_src, | 
					
						
							|  |  |  | 			 enum mic_intr_type type); | 
					
						
							| 
									
										
										
										
											2013-09-05 16:41:41 -07:00
										 |  |  | void mic_free_irq(struct mic_device *mdev, | 
					
						
							|  |  |  | 		struct mic_irq *cookie, void *data); | 
					
						
							|  |  |  | int mic_setup_interrupts(struct mic_device *mdev, struct pci_dev *pdev); | 
					
						
							|  |  |  | void mic_free_interrupts(struct mic_device *mdev, struct pci_dev *pdev); | 
					
						
							|  |  |  | void mic_intr_restore(struct mic_device *mdev); | 
					
						
							|  |  |  | #endif
 |