Lines 32-37
struct rte_uio_pci_dev {
Link Here
|
32 |
static int wc_activate; |
32 |
static int wc_activate; |
33 |
static char *intr_mode; |
33 |
static char *intr_mode; |
34 |
static enum rte_intr_mode igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX; |
34 |
static enum rte_intr_mode igbuio_intr_mode_preferred = RTE_INTR_MODE_MSIX; |
|
|
35 |
|
36 |
static int |
37 |
igbuio_pci_enable_interrupts(struct rte_uio_pci_dev *udev); |
38 |
static void |
39 |
igbuio_pci_disable_interrupts(struct rte_uio_pci_dev *udev); |
40 |
|
35 |
/* sriov sysfs */ |
41 |
/* sriov sysfs */ |
36 |
static ssize_t |
42 |
static ssize_t |
37 |
show_max_vfs(struct device *dev, struct device_attribute *attr, |
43 |
show_max_vfs(struct device *dev, struct device_attribute *attr, |
Lines 72-146
static const struct attribute_group dev_attr_grp = {
Link Here
|
72 |
.attrs = dev_attrs, |
78 |
.attrs = dev_attrs, |
73 |
}; |
79 |
}; |
74 |
|
80 |
|
75 |
#ifndef HAVE_PCI_MSI_MASK_IRQ |
|
|
76 |
/* |
77 |
* It masks the msix on/off of generating MSI-X messages. |
78 |
*/ |
79 |
static void |
80 |
igbuio_msix_mask_irq(struct msi_desc *desc, s32 state) |
81 |
{ |
82 |
u32 mask_bits = desc->masked; |
83 |
unsigned int offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + |
84 |
PCI_MSIX_ENTRY_VECTOR_CTRL; |
85 |
|
86 |
if (state != 0) |
87 |
mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT; |
88 |
else |
89 |
mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT; |
90 |
|
91 |
if (mask_bits != desc->masked) { |
92 |
writel(mask_bits, desc->mask_base + offset); |
93 |
readl(desc->mask_base); |
94 |
desc->masked = mask_bits; |
95 |
} |
96 |
} |
97 |
|
98 |
/* |
99 |
* It masks the msi on/off of generating MSI messages. |
100 |
*/ |
101 |
static void |
102 |
igbuio_msi_mask_irq(struct pci_dev *pdev, struct msi_desc *desc, int32_t state) |
103 |
{ |
104 |
u32 mask_bits = desc->masked; |
105 |
u32 offset = desc->irq - pdev->irq; |
106 |
u32 mask = 1 << offset; |
107 |
|
108 |
if (!desc->msi_attrib.maskbit) |
109 |
return; |
110 |
|
111 |
if (state != 0) |
112 |
mask_bits &= ~mask; |
113 |
else |
114 |
mask_bits |= mask; |
115 |
|
116 |
if (mask_bits != desc->masked) { |
117 |
pci_write_config_dword(pdev, desc->mask_pos, mask_bits); |
118 |
desc->masked = mask_bits; |
119 |
} |
120 |
} |
121 |
|
122 |
static void |
123 |
igbuio_mask_irq(struct pci_dev *pdev, enum rte_intr_mode mode, s32 irq_state) |
124 |
{ |
125 |
struct msi_desc *desc; |
126 |
struct list_head *msi_list; |
127 |
|
128 |
#ifdef HAVE_MSI_LIST_IN_GENERIC_DEVICE |
129 |
msi_list = &pdev->dev.msi_list; |
130 |
#else |
131 |
msi_list = &pdev->msi_list; |
132 |
#endif |
133 |
|
134 |
if (mode == RTE_INTR_MODE_MSIX) { |
135 |
list_for_each_entry(desc, msi_list, list) |
136 |
igbuio_msix_mask_irq(desc, irq_state); |
137 |
} else if (mode == RTE_INTR_MODE_MSI) { |
138 |
list_for_each_entry(desc, msi_list, list) |
139 |
igbuio_msi_mask_irq(pdev, desc, irq_state); |
140 |
} |
141 |
} |
142 |
#endif |
143 |
|
144 |
/** |
81 |
/** |
145 |
* This is the irqcontrol callback to be registered to uio_info. |
82 |
* This is the irqcontrol callback to be registered to uio_info. |
146 |
* It can be used to disable/enable interrupt from user space processes. |
83 |
* It can be used to disable/enable interrupt from user space processes. |
Lines 158-188
static int
Link Here
|
158 |
igbuio_pci_irqcontrol(struct uio_info *info, s32 irq_state) |
95 |
igbuio_pci_irqcontrol(struct uio_info *info, s32 irq_state) |
159 |
{ |
96 |
{ |
160 |
struct rte_uio_pci_dev *udev = info->priv; |
97 |
struct rte_uio_pci_dev *udev = info->priv; |
161 |
struct pci_dev *pdev = udev->pdev; |
98 |
int err = 0; |
162 |
|
|
|
163 |
#ifdef HAVE_PCI_MSI_MASK_IRQ |
164 |
struct irq_data *irq = irq_get_irq_data(udev->info.irq); |
165 |
#endif |
166 |
|
167 |
pci_cfg_access_lock(pdev); |
168 |
|
99 |
|
169 |
if (udev->mode == RTE_INTR_MODE_MSIX || udev->mode == RTE_INTR_MODE_MSI) { |
100 |
if (irq_state == 1) { |
170 |
#ifdef HAVE_PCI_MSI_MASK_IRQ |
101 |
if (udev->info.irq <= 0) |
171 |
if (irq_state == 1) |
102 |
err = igbuio_pci_enable_interrupts(udev); |
172 |
pci_msi_unmask_irq(irq); |
103 |
} else { |
173 |
else |
104 |
igbuio_pci_disable_interrupts(udev); |
174 |
pci_msi_mask_irq(irq); |
105 |
udev->info.irq = -1; |
175 |
#else |
|
|
176 |
igbuio_mask_irq(pdev, udev->mode, irq_state); |
177 |
#endif |
178 |
} |
106 |
} |
179 |
|
107 |
|
180 |
if (udev->mode == RTE_INTR_MODE_LEGACY) |
108 |
return err; |
181 |
pci_intx(pdev, !!irq_state); |
|
|
182 |
|
183 |
pci_cfg_access_unlock(pdev); |
184 |
|
185 |
return 0; |
186 |
} |
109 |
} |
187 |
|
110 |
|
188 |
/** |
111 |
/** |