Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.15-rc1 137 lines 4.2 kB view raw
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 */ 42enum 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 */ 57struct 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 */ 73struct 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 */ 91struct 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 */ 101struct mic_irq; 102 103/* Forward declaration */ 104struct 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 */ 116struct 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 126int mic_next_db(struct mic_device *mdev); 127struct 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 132void mic_free_irq(struct mic_device *mdev, 133 struct mic_irq *cookie, void *data); 134int mic_setup_interrupts(struct mic_device *mdev, struct pci_dev *pdev); 135void mic_free_interrupts(struct mic_device *mdev, struct pci_dev *pdev); 136void mic_intr_restore(struct mic_device *mdev); 137#endif