diff options
-rw-r--r-- | arch/s390/pci/pci.c | 4 | ||||
-rw-r--r-- | drivers/pci/msi.c | 24 | ||||
-rw-r--r-- | include/linux/msi.h | 18 |
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 | */ |
176 | u32 __msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) | 176 | u32 __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 | ||
190 | static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) | 190 | static 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 | */ |
202 | u32 __msix_mask_irq(struct msi_desc *desc, u32 flag) | 202 | u32 __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 | ||
219 | static void msix_mask_irq(struct msi_desc *desc, u32 flag) | 219 | static 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 | ||
224 | static void msi_set_mask_bit(struct irq_data *data, u32 flag) | 224 | static 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 | ||
237 | void 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 | */ | ||
241 | void 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 | ||
242 | void 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 | */ | ||
250 | void 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 */ |
15 | struct irq_data; | 15 | struct irq_data; |
16 | struct msi_desc; | 16 | struct msi_desc; |
17 | void mask_msi_irq(struct irq_data *data); | ||
18 | void unmask_msi_irq(struct irq_data *data); | ||
19 | void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg); | 17 | void __get_cached_msi_msg(struct msi_desc *entry, struct msi_msg *msg); |
20 | void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); | 18 | void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); |
21 | 19 | ||
22 | u32 __msix_mask_irq(struct msi_desc *desc, u32 flag); | ||
23 | u32 __msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag); | ||
24 | |||
25 | struct msi_desc { | 20 | struct 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); | |||
52 | void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg); | 47 | void __pci_write_msi_msg(struct msi_desc *entry, struct msi_msg *msg); |
53 | void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg); | 48 | void pci_write_msi_msg(unsigned int irq, struct msi_msg *msg); |
54 | 49 | ||
50 | u32 __pci_msix_desc_mask_irq(struct msi_desc *desc, u32 flag); | ||
51 | u32 __pci_msi_desc_mask_irq(struct msi_desc *desc, u32 mask, u32 flag); | ||
52 | void pci_msi_mask_irq(struct irq_data *data); | ||
53 | void 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 */ |
56 | static inline void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg) | 56 | static 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 | } |
64 | static inline void mask_msi_irq(struct irq_data *data) | ||
65 | { | ||
66 | pci_msi_mask_irq(data); | ||
67 | } | ||
68 | static 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 |