Dasaratharaman Chandramouli | a01e28f | 2013-09-05 16:41:41 -0700 | [diff] [blame] | 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 | |
Siva Yerramreddy | b8e439f | 2014-07-11 14:04:22 -0700 | [diff] [blame] | 24 | #include <linux/bitops.h> |
| 25 | #include <linux/interrupt.h> |
Dasaratharaman Chandramouli | a01e28f | 2013-09-05 16:41:41 -0700 | [diff] [blame] | 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. |
Siva Yerramreddy | d4ef098 | 2014-07-11 14:04:23 -0700 | [diff] [blame] | 30 | * 4 for host owned DMA channels. |
Sudeep Dutt | 74321d4 | 2015-04-29 05:32:38 -0700 | [diff] [blame] | 31 | * 1 for SCIF |
Dasaratharaman Chandramouli | a01e28f | 2013-09-05 16:41:41 -0700 | [diff] [blame] | 32 | */ |
Sudeep Dutt | 74321d4 | 2015-04-29 05:32:38 -0700 | [diff] [blame] | 33 | #define MIC_MIN_MSIX 9 |
Dasaratharaman Chandramouli | a01e28f | 2013-09-05 16:41:41 -0700 | [diff] [blame] | 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. |
Siva Yerramreddy | b8e439f | 2014-07-11 14:04:22 -0700 | [diff] [blame] | 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. |
Dasaratharaman Chandramouli | a01e28f | 2013-09-05 16:41:41 -0700 | [diff] [blame] | 78 | * @cb_list: Array of callback lists one for each source. |
Siva Yerramreddy | b8e439f | 2014-07-11 14:04:22 -0700 | [diff] [blame] | 79 | * @mask: Mask used by the main thread fn to call the underlying thread fns. |
Dasaratharaman Chandramouli | a01e28f | 2013-09-05 16:41:41 -0700 | [diff] [blame] | 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; |
Siva Yerramreddy | b8e439f | 2014-07-11 14:04:22 -0700 | [diff] [blame] | 88 | spinlock_t mic_thread_lock; |
Dasaratharaman Chandramouli | a01e28f | 2013-09-05 16:41:41 -0700 | [diff] [blame] | 89 | struct list_head *cb_list; |
Siva Yerramreddy | b8e439f | 2014-07-11 14:04:22 -0700 | [diff] [blame] | 90 | unsigned long mask; |
Dasaratharaman Chandramouli | a01e28f | 2013-09-05 16:41:41 -0700 | [diff] [blame] | 91 | }; |
| 92 | |
| 93 | /** |
| 94 | * struct mic_intr_cb - Interrupt callback structure. |
| 95 | * |
Siva Yerramreddy | b8e439f | 2014-07-11 14:04:22 -0700 | [diff] [blame] | 96 | * @handler: The callback function |
| 97 | * @thread_fn: The thread_fn. |
Dasaratharaman Chandramouli | a01e28f | 2013-09-05 16:41:41 -0700 | [diff] [blame] | 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 { |
Siva Yerramreddy | b8e439f | 2014-07-11 14:04:22 -0700 | [diff] [blame] | 103 | irq_handler_t handler; |
| 104 | irq_handler_t thread_fn; |
Dasaratharaman Chandramouli | a01e28f | 2013-09-05 16:41:41 -0700 | [diff] [blame] | 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); |
Siva Yerramreddy | b8e439f | 2014-07-11 14:04:22 -0700 | [diff] [blame] | 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); |
Dasaratharaman Chandramouli | a01e28f | 2013-09-05 16:41:41 -0700 | [diff] [blame] | 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 |