1 /* 2 * Intel MIC Platform Software Stack (MPSS) 3 * 4 * Copyright(c) 2013 Intel Corporation. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License, version 2, as 8 * published by the Free Software Foundation. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * The full GNU General Public License is included in this distribution in 16 * the file called "COPYING". 17 * 18 * Intel MIC Host driver. 19 * 20 */ 21 #ifndef _MIC_INTR_H_ 22 #define _MIC_INTR_H_ 23 24 #include <linux/bitops.h> 25 #include <linux/interrupt.h> 26 /* 27 * The minimum number of msix vectors required for normal operation. 28 * 3 for virtio network, console and block devices. 29 * 1 for card shutdown notifications. 30 * 4 for host owned DMA channels. 31 * 1 for SCIF 32 */ 33 #define MIC_MIN_MSIX 9 34 #define MIC_NUM_OFFSETS 32 35 36 /** 37 * mic_intr_source - The type of source that will generate 38 * the interrupt.The number of types needs to be in sync with 39 * MIC_NUM_INTR_TYPES 40 * 41 * MIC_INTR_DB: The source is a doorbell 42 * MIC_INTR_DMA: The source is a DMA channel 43 * MIC_INTR_ERR: The source is an error interrupt e.g. SBOX ERR 44 * MIC_NUM_INTR_TYPES: Total number of interrupt sources. 45 */ 46 enum mic_intr_type { 47 MIC_INTR_DB = 0, 48 MIC_INTR_DMA, 49 MIC_INTR_ERR, 50 MIC_NUM_INTR_TYPES 51 }; 52 53 /** 54 * struct mic_intr_info - Contains h/w specific interrupt sources 55 * information. 56 * 57 * @intr_start_idx: Contains the starting indexes of the 58 * interrupt types. 59 * @intr_len: Contains the length of the interrupt types. 60 */ 61 struct mic_intr_info { 62 u16 intr_start_idx[MIC_NUM_INTR_TYPES]; 63 u16 intr_len[MIC_NUM_INTR_TYPES]; 64 }; 65 66 /** 67 * struct mic_irq_info - OS specific irq information 68 * 69 * @next_avail_src: next available doorbell that can be assigned. 70 * @msix_entries: msix entries allocated while setting up MSI-x 71 * @mic_msi_map: The MSI/MSI-x mapping information. 72 * @num_vectors: The number of MSI/MSI-x vectors that have been allocated. 73 * @cb_ida: callback ID allocator to track the callbacks registered. 74 * @mic_intr_lock: spinlock to protect the interrupt callback list. 75 * @mic_thread_lock: spinlock to protect the thread callback list. 76 * This lock is used to protect against thread_fn while 77 * mic_intr_lock is used to protect against interrupt handler. 78 * @cb_list: Array of callback lists one for each source. 79 * @mask: Mask used by the main thread fn to call the underlying thread fns. 80 */ 81 struct mic_irq_info { 82 int next_avail_src; 83 struct msix_entry *msix_entries; 84 u32 *mic_msi_map; 85 u16 num_vectors; 86 struct ida cb_ida; 87 spinlock_t mic_intr_lock; 88 spinlock_t mic_thread_lock; 89 struct list_head *cb_list; 90 unsigned long mask; 91 }; 92 93 /** 94 * struct mic_intr_cb - Interrupt callback structure. 95 * 96 * @handler: The callback function 97 * @thread_fn: The thread_fn. 98 * @data: Private data of the requester. 99 * @cb_id: The callback id. Identifies this callback. 100 * @list: list head pointing to the next callback structure. 101 */ 102 struct mic_intr_cb { 103 irq_handler_t handler; 104 irq_handler_t thread_fn; 105 void *data; 106 int cb_id; 107 struct list_head list; 108 }; 109 110 /** 111 * struct mic_irq - opaque pointer used as cookie 112 */ 113 struct mic_irq; 114 115 /* Forward declaration */ 116 struct mic_device; 117 118 /** 119 * struct mic_hw_intr_ops: MIC HW specific interrupt operations 120 * @intr_init: Initialize H/W specific interrupt information. 121 * @enable_interrupts: Enable interrupts from the hardware. 122 * @disable_interrupts: Disable interrupts from the hardware. 123 * @program_msi_to_src_map: Update MSI mapping registers with 124 * irq information. 125 * @read_msi_to_src_map: Read MSI mapping registers containing 126 * irq information. 127 */ 128 struct mic_hw_intr_ops { 129 void (*intr_init)(struct mic_device *mdev); 130 void (*enable_interrupts)(struct mic_device *mdev); 131 void (*disable_interrupts)(struct mic_device *mdev); 132 void (*program_msi_to_src_map) (struct mic_device *mdev, 133 int idx, int intr_src, bool set); 134 u32 (*read_msi_to_src_map) (struct mic_device *mdev, 135 int idx); 136 }; 137 138 int mic_next_db(struct mic_device *mdev); 139 struct mic_irq * 140 mic_request_threaded_irq(struct mic_device *mdev, 141 irq_handler_t handler, irq_handler_t thread_fn, 142 const char *name, void *data, int intr_src, 143 enum mic_intr_type type); 144 void mic_free_irq(struct mic_device *mdev, 145 struct mic_irq *cookie, void *data); 146 int mic_setup_interrupts(struct mic_device *mdev, struct pci_dev *pdev); 147 void mic_free_interrupts(struct mic_device *mdev, struct pci_dev *pdev); 148 void mic_intr_restore(struct mic_device *mdev); 149 #endif 150