diff options
Diffstat (limited to 'drivers/misc/mic/host/mic_intr.h')
-rw-r--r-- | drivers/misc/mic/host/mic_intr.h | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/drivers/misc/mic/host/mic_intr.h b/drivers/misc/mic/host/mic_intr.h new file mode 100644 index 000000000000..6091aa97e116 --- /dev/null +++ b/drivers/misc/mic/host/mic_intr.h | |||
@@ -0,0 +1,137 @@ | |||
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 | /* | ||
25 | * The minimum number of msix vectors required for normal operation. | ||
26 | * 3 for virtio network, console and block devices. | ||
27 | * 1 for card shutdown notifications. | ||
28 | */ | ||
29 | #define MIC_MIN_MSIX 4 | ||
30 | #define MIC_NUM_OFFSETS 32 | ||
31 | |||
32 | /** | ||
33 | * mic_intr_source - The type of source that will generate | ||
34 | * the interrupt.The number of types needs to be in sync with | ||
35 | * MIC_NUM_INTR_TYPES | ||
36 | * | ||
37 | * MIC_INTR_DB: The source is a doorbell | ||
38 | * MIC_INTR_DMA: The source is a DMA channel | ||
39 | * MIC_INTR_ERR: The source is an error interrupt e.g. SBOX ERR | ||
40 | * MIC_NUM_INTR_TYPES: Total number of interrupt sources. | ||
41 | */ | ||
42 | enum mic_intr_type { | ||
43 | MIC_INTR_DB = 0, | ||
44 | MIC_INTR_DMA, | ||
45 | MIC_INTR_ERR, | ||
46 | MIC_NUM_INTR_TYPES | ||
47 | }; | ||
48 | |||
49 | /** | ||
50 | * struct mic_intr_info - Contains h/w specific interrupt sources | ||
51 | * information. | ||
52 | * | ||
53 | * @intr_start_idx: Contains the starting indexes of the | ||
54 | * interrupt types. | ||
55 | * @intr_len: Contains the length of the interrupt types. | ||
56 | */ | ||
57 | struct mic_intr_info { | ||
58 | u16 intr_start_idx[MIC_NUM_INTR_TYPES]; | ||
59 | u16 intr_len[MIC_NUM_INTR_TYPES]; | ||
60 | }; | ||
61 | |||
62 | /** | ||
63 | * struct mic_irq_info - OS specific irq information | ||
64 | * | ||
65 | * @next_avail_src: next available doorbell that can be assigned. | ||
66 | * @msix_entries: msix entries allocated while setting up MSI-x | ||
67 | * @mic_msi_map: The MSI/MSI-x mapping information. | ||
68 | * @num_vectors: The number of MSI/MSI-x vectors that have been allocated. | ||
69 | * @cb_ida: callback ID allocator to track the callbacks registered. | ||
70 | * @mic_intr_lock: spinlock to protect the interrupt callback list. | ||
71 | * @cb_list: Array of callback lists one for each source. | ||
72 | */ | ||
73 | struct mic_irq_info { | ||
74 | int next_avail_src; | ||
75 | struct msix_entry *msix_entries; | ||
76 | u32 *mic_msi_map; | ||
77 | u16 num_vectors; | ||
78 | struct ida cb_ida; | ||
79 | spinlock_t mic_intr_lock; | ||
80 | struct list_head *cb_list; | ||
81 | }; | ||
82 | |||
83 | /** | ||
84 | * struct mic_intr_cb - Interrupt callback structure. | ||
85 | * | ||
86 | * @func: The callback function | ||
87 | * @data: Private data of the requester. | ||
88 | * @cb_id: The callback id. Identifies this callback. | ||
89 | * @list: list head pointing to the next callback structure. | ||
90 | */ | ||
91 | struct mic_intr_cb { | ||
92 | irqreturn_t (*func) (int irq, void *data); | ||
93 | void *data; | ||
94 | int cb_id; | ||
95 | struct list_head list; | ||
96 | }; | ||
97 | |||
98 | /** | ||
99 | * struct mic_irq - opaque pointer used as cookie | ||
100 | */ | ||
101 | struct mic_irq; | ||
102 | |||
103 | /* Forward declaration */ | ||
104 | struct mic_device; | ||
105 | |||
106 | /** | ||
107 | * struct mic_hw_intr_ops: MIC HW specific interrupt operations | ||
108 | * @intr_init: Initialize H/W specific interrupt information. | ||
109 | * @enable_interrupts: Enable interrupts from the hardware. | ||
110 | * @disable_interrupts: Disable interrupts from the hardware. | ||
111 | * @program_msi_to_src_map: Update MSI mapping registers with | ||
112 | * irq information. | ||
113 | * @read_msi_to_src_map: Read MSI mapping registers containing | ||
114 | * irq information. | ||
115 | */ | ||
116 | struct mic_hw_intr_ops { | ||
117 | void (*intr_init)(struct mic_device *mdev); | ||
118 | void (*enable_interrupts)(struct mic_device *mdev); | ||
119 | void (*disable_interrupts)(struct mic_device *mdev); | ||
120 | void (*program_msi_to_src_map) (struct mic_device *mdev, | ||
121 | int idx, int intr_src, bool set); | ||
122 | u32 (*read_msi_to_src_map) (struct mic_device *mdev, | ||
123 | int idx); | ||
124 | }; | ||
125 | |||
126 | int mic_next_db(struct mic_device *mdev); | ||
127 | struct mic_irq *mic_request_irq(struct mic_device *mdev, | ||
128 | irqreturn_t (*func)(int irq, void *data), | ||
129 | const char *name, void *data, int intr_src, | ||
130 | enum mic_intr_type type); | ||
131 | |||
132 | void mic_free_irq(struct mic_device *mdev, | ||
133 | struct mic_irq *cookie, void *data); | ||
134 | int mic_setup_interrupts(struct mic_device *mdev, struct pci_dev *pdev); | ||
135 | void mic_free_interrupts(struct mic_device *mdev, struct pci_dev *pdev); | ||
136 | void mic_intr_restore(struct mic_device *mdev); | ||
137 | #endif | ||