aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/s390/pci/pci.c4
-rw-r--r--drivers/pci/msi.c24
-rw-r--r--include/linux/msi.h18
3 files changed, 31 insertions, 15 deletions
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index ad1a9e2a1831..fb54bbdbb48d 100644
--- a/arch/s390/pci/pci.c
+++ b/arch/s390/pci/pci.c
@@ -448,9 +448,9 @@ void arch_teardown_msi_irqs(struct pci_dev *pdev)
448 /* Release MSI interrupts */ 448 /* Release MSI interrupts */
449 list_for_each_entry(msi, &pdev->msi_list, list) { 449 list_for_each_entry(msi, &pdev->msi_list, list) {
450 if (msi->msi_attrib.is_msix) 450 if (msi->msi_attrib.is_msix)
451 __msix_mask_irq(msi, 1); 451 __pci_msix_desc_mask_irq(msi, 1);
452 else 452 else
453 __msi_mask_irq(msi, 1, 1); 453 __pci_msi_desc_mask_irq(msi, 1, 1);
454 irq_set_msi_desc(msi->irq, NULL); 454 irq_set_msi_desc(msi->irq, NULL);
455 irq_free_desc(msi->irq); 455 irq_free_desc(msi->irq);
456 msi->msg.address_lo = 0; 456 msi->msg.address_lo = 0;
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 156ba8f809b7..b5bf2f641770 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -173,7 +173,7 @@ static inline __attribute_const__ u32 msi_mask(unsigned x)
173 * reliably as devices without an INTx disable bit will then generate a 173 * reliably as devices without an INTx disable bit will then generate a
174 * level IRQ which will never be cleared. 174 * level IRQ which will never be cleared.
175 */ 175 */
176u32 __msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) 176u32 __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
177{ 177{
178 u32 mask_bits = desc->masked; 178 u32 mask_bits = desc->masked;
179 179
@@ -189,7 +189,7 @@ u32 __msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
189 189
190static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) 190static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
191{ 191{
192 desc->masked = __msi_mask_irq(desc, mask, flag); 192 desc->masked = __pci_msi_desc_mask_irq(desc, mask, flag);
193} 193}
194 194
195/* 195/*
@@ -199,7 +199,7 @@ static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
199 * file. This saves a few milliseconds when initialising devices with lots 199 * file. This saves a few milliseconds when initialising devices with lots
200 * of MSI-X interrupts. 200 * of MSI-X interrupts.
201 */ 201 */
202u32 __msix_mask_irq(struct msi_desc *desc, u32 flag) 202u32 __pci_msix_desc_mask_irq(struct msi_desc *desc, u32 flag)
203{ 203{
204 u32 mask_bits = desc->masked; 204 u32 mask_bits = desc->masked;
205 unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + 205 unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
@@ -218,7 +218,7 @@ u32 __msix_mask_irq(struct msi_desc *desc, u32 flag)
218 218
219static void msix_mask_irq(struct msi_desc *desc, u32 flag) 219static void msix_mask_irq(struct msi_desc *desc, u32 flag)
220{ 220{
221 desc->masked = __msix_mask_irq(desc, flag); 221 desc->masked = __pci_msix_desc_mask_irq(desc, flag);
222} 222}
223 223
224static void msi_set_mask_bit(struct irq_data *data, u32 flag) 224static void msi_set_mask_bit(struct irq_data *data, u32 flag)
@@ -234,12 +234,20 @@ static void msi_set_mask_bit(struct irq_data *data, u32 flag)
234 } 234 }
235} 235}
236 236
237void mask_msi_irq(struct irq_data *data) 237/**
238 * pci_msi_mask_irq - Generic irq chip callback to mask PCI/MSI interrupts
239 * @data: pointer to irqdata associated to that interrupt
240 */
241void pci_msi_mask_irq(struct irq_data *data)
238{ 242{
239 msi_set_mask_bit(data, 1); 243 msi_set_mask_bit(data, 1);
240} 244}
241 245
242void unmask_msi_irq(struct irq_data *data) 246/**
247 * pci_msi_unmask_irq - Generic irq chip callback to unmask PCI/MSI interrupts
248 * @data: pointer to irqdata associated to that interrupt
249 */
250void pci_msi_unmask_irq(struct irq_data *data)
243{ 251{
244 msi_set_mask_bit(data, 0); 252 msi_set_mask_bit(data, 0);
245} 253}
@@ -858,7 +866,7 @@ void pci_msi_shutdown(struct pci_dev *dev)
858 /* Return the device with MSI unmasked as initial states */ 866 /* Return the device with MSI unmasked as initial states */
859 mask = msi_mask(desc->msi_attrib.multi_cap); 867 mask = msi_mask(desc->msi_attrib.multi_cap);
860 /* Keep cached state to be restored */ 868 /* Keep cached state to be restored */
861 __msi_mask_irq(desc, mask, ~mask); 869 __pci_msi_desc_mask_irq(desc, mask, ~mask);
862 870
863 /* Restore dev->irq to its default pin-assertion irq */ 871 /* Restore dev->irq to its default pin-assertion irq */
864 dev->irq = desc->msi_attrib.default_irq; 872 dev->irq = desc->msi_attrib.default_irq;
@@ -956,7 +964,7 @@ void pci_msix_shutdown(struct pci_dev *dev)
956 /* Return the device with MSI-X masked as initial states */ 964 /* Return the device with MSI-X masked as initial states */
957 list_for_each_entry(entry, &dev->msi_list, list) { 965 list_for_each_entry(entry, &dev->msi_list, list) {
958 /* Keep cached states to be restored */ 966 /* Keep cached states to be restored */
959 __msix_mask_irq(entry, 1); 967 __pci_msix_desc_mask_irq(entry, 1);
960 } 968 }
961 969
962 msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0); 970 msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
diff --git a/include/linux/msi.h b/include/linux/msi.h
index 301adecbc34d..1dcad0c1e806 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -14,14 +14,9 @@ extern int pci_msi_ignore_mask;
14/* Helper functions */ 14/* Helper functions */
15struct irq_data; 15struct irq_data;
16struct msi_desc; 16struct msi_desc;
17void mask_msi_irq(struct irq_data *data);
18void unmask_msi_irq(struct irq_data *data);
19void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg); 17void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
20void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); 18void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg);
21 19
22u32 __msix_mask_irq(struct msi_desc *desc, u32 flag);
23u32 __msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag);
24
25struct msi_desc { 20struct msi_desc {
26 struct { 21 struct {
27 __u8 is_msix : 1; 22 __u8 is_msix : 1;
@@ -52,6 +47,11 @@ void __pci_read_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
52void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg); 47void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
53void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg); 48void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg);
54 49
50u32 __pci_msix_desc_mask_irq(struct msi_desc *desc, u32 flag);
51u32 __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag);
52void pci_msi_mask_irq(struct irq_data *data);
53void pci_msi_unmask_irq(struct irq_data *data);
54
55/* Conversion helpers. Should be removed after merging */ 55/* Conversion helpers. Should be removed after merging */
56static inline void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg) 56static inline void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg)
57{ 57{
@@ -61,6 +61,14 @@ static inline void write_msi_msg(int irq, struct msi_msg *msg)
61{ 61{
62 pci_write_msi_msg(irq, msg); 62 pci_write_msi_msg(irq, msg);
63} 63}
64static inline void mask_msi_irq(struct irq_data *data)
65{
66 pci_msi_mask_irq(data);
67}
68static inline void unmask_msi_irq(struct irq_data *data)
69{
70 pci_msi_unmask_irq(data);
71}
64 72
65/* 73/*
66 * The arch hooks to setup up msi irqs. Those functions are 74 * The arch hooks to setup up msi irqs. Those functions are