aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/s390/pci/pci.c4
-rw-r--r--arch/x86/include/asm/x86_init.h3
-rw-r--r--arch/x86/kernel/x86_init.c10
-rw-r--r--arch/x86/pci/xen.c15
-rw-r--r--drivers/pci/msi.c29
-rw-r--r--include/linux/msi.h5
6 files changed, 20 insertions, 46 deletions
diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
index 2fa7b14b9c08..552b9908aa77 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 default_msix_mask_irq(msi, 1); 451 __msix_mask_irq(msi, 1);
452 else 452 else
453 default_msi_mask_irq(msi, 1, 1); 453 __msi_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/arch/x86/include/asm/x86_init.h b/arch/x86/include/asm/x86_init.h
index e45e4da96bf1..f58a9c7a3c86 100644
--- a/arch/x86/include/asm/x86_init.h
+++ b/arch/x86/include/asm/x86_init.h
@@ -172,7 +172,6 @@ struct x86_platform_ops {
172 172
173struct pci_dev; 173struct pci_dev;
174struct msi_msg; 174struct msi_msg;
175struct msi_desc;
176 175
177struct x86_msi_ops { 176struct x86_msi_ops {
178 int (*setup_msi_irqs)(struct pci_dev *dev, int nvec, int type); 177 int (*setup_msi_irqs)(struct pci_dev *dev, int nvec, int type);
@@ -183,8 +182,6 @@ struct x86_msi_ops {
183 void (*teardown_msi_irqs)(struct pci_dev *dev); 182 void (*teardown_msi_irqs)(struct pci_dev *dev);
184 void (*restore_msi_irqs)(struct pci_dev *dev); 183 void (*restore_msi_irqs)(struct pci_dev *dev);
185 int (*setup_hpet_msi)(unsigned int irq, unsigned int id); 184 int (*setup_hpet_msi)(unsigned int irq, unsigned int id);
186 u32 (*msi_mask_irq)(struct msi_desc *desc, u32 mask, u32 flag);
187 u32 (*msix_mask_irq)(struct msi_desc *desc, u32 flag);
188}; 185};
189 186
190struct IO_APIC_route_entry; 187struct IO_APIC_route_entry;
diff --git a/arch/x86/kernel/x86_init.c b/arch/x86/kernel/x86_init.c
index e48b674639cc..234b0722de53 100644
--- a/arch/x86/kernel/x86_init.c
+++ b/arch/x86/kernel/x86_init.c
@@ -116,8 +116,6 @@ struct x86_msi_ops x86_msi = {
116 .teardown_msi_irqs = default_teardown_msi_irqs, 116 .teardown_msi_irqs = default_teardown_msi_irqs,
117 .restore_msi_irqs = default_restore_msi_irqs, 117 .restore_msi_irqs = default_restore_msi_irqs,
118 .setup_hpet_msi = default_setup_hpet_msi, 118 .setup_hpet_msi = default_setup_hpet_msi,
119 .msi_mask_irq = default_msi_mask_irq,
120 .msix_mask_irq = default_msix_mask_irq,
121}; 119};
122 120
123/* MSI arch specific hooks */ 121/* MSI arch specific hooks */
@@ -140,14 +138,6 @@ void arch_restore_msi_irqs(struct pci_dev *dev)
140{ 138{
141 x86_msi.restore_msi_irqs(dev); 139 x86_msi.restore_msi_irqs(dev);
142} 140}
143u32 arch_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
144{
145 return x86_msi.msi_mask_irq(desc, mask, flag);
146}
147u32 arch_msix_mask_irq(struct msi_desc *desc, u32 flag)
148{
149 return x86_msi.msix_mask_irq(desc, flag);
150}
151#endif 141#endif
152 142
153struct x86_io_apic_ops x86_io_apic_ops = { 143struct x86_io_apic_ops x86_io_apic_ops = {
diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c
index 093f5f4272d3..466b978e13a5 100644
--- a/arch/x86/pci/xen.c
+++ b/arch/x86/pci/xen.c
@@ -394,14 +394,7 @@ static void xen_teardown_msi_irq(unsigned int irq)
394{ 394{
395 xen_destroy_irq(irq); 395 xen_destroy_irq(irq);
396} 396}
397static u32 xen_nop_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) 397
398{
399 return 0;
400}
401static u32 xen_nop_msix_mask_irq(struct msi_desc *desc, u32 flag)
402{
403 return 0;
404}
405#endif 398#endif
406 399
407int __init pci_xen_init(void) 400int __init pci_xen_init(void)
@@ -425,8 +418,7 @@ int __init pci_xen_init(void)
425 x86_msi.setup_msi_irqs = xen_setup_msi_irqs; 418 x86_msi.setup_msi_irqs = xen_setup_msi_irqs;
426 x86_msi.teardown_msi_irq = xen_teardown_msi_irq; 419 x86_msi.teardown_msi_irq = xen_teardown_msi_irq;
427 x86_msi.teardown_msi_irqs = xen_teardown_msi_irqs; 420 x86_msi.teardown_msi_irqs = xen_teardown_msi_irqs;
428 x86_msi.msi_mask_irq = xen_nop_msi_mask_irq; 421 pci_msi_ignore_mask = 1;
429 x86_msi.msix_mask_irq = xen_nop_msix_mask_irq;
430#endif 422#endif
431 return 0; 423 return 0;
432} 424}
@@ -506,8 +498,7 @@ int __init pci_xen_initial_domain(void)
506 x86_msi.setup_msi_irqs = xen_initdom_setup_msi_irqs; 498 x86_msi.setup_msi_irqs = xen_initdom_setup_msi_irqs;
507 x86_msi.teardown_msi_irq = xen_teardown_msi_irq; 499 x86_msi.teardown_msi_irq = xen_teardown_msi_irq;
508 x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs; 500 x86_msi.restore_msi_irqs = xen_initdom_restore_msi_irqs;
509 x86_msi.msi_mask_irq = xen_nop_msi_mask_irq; 501 pci_msi_ignore_mask = 1;
510 x86_msi.msix_mask_irq = xen_nop_msix_mask_irq;
511#endif 502#endif
512 xen_setup_acpi_sci(); 503 xen_setup_acpi_sci();
513 __acpi_register_gsi = acpi_register_gsi_xen; 504 __acpi_register_gsi = acpi_register_gsi_xen;
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index 9fab30af0e75..d9a92cf6a6d6 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -23,6 +23,7 @@
23#include "pci.h" 23#include "pci.h"
24 24
25static int pci_msi_enable = 1; 25static int pci_msi_enable = 1;
26int pci_msi_ignore_mask;
26 27
27#define msix_table_size(flags) ((flags & PCI_MSIX_FLAGS_QSIZE) + 1) 28#define msix_table_size(flags) ((flags & PCI_MSIX_FLAGS_QSIZE) + 1)
28 29
@@ -163,11 +164,11 @@ static inline __attribute_const__ u32 msi_mask(unsigned x)
163 * reliably as devices without an INTx disable bit will then generate a 164 * reliably as devices without an INTx disable bit will then generate a
164 * level IRQ which will never be cleared. 165 * level IRQ which will never be cleared.
165 */ 166 */
166u32 default_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) 167u32 __msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
167{ 168{
168 u32 mask_bits = desc->masked; 169 u32 mask_bits = desc->masked;
169 170
170 if (!desc->msi_attrib.maskbit) 171 if (pci_msi_ignore_mask || !desc->msi_attrib.maskbit)
171 return 0; 172 return 0;
172 173
173 mask_bits &= ~mask; 174 mask_bits &= ~mask;
@@ -177,14 +178,9 @@ u32 default_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
177 return mask_bits; 178 return mask_bits;
178} 179}
179 180
180__weak u32 arch_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
181{
182 return default_msi_mask_irq(desc, mask, flag);
183}
184
185static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) 181static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
186{ 182{
187 desc->masked = arch_msi_mask_irq(desc, mask, flag); 183 desc->masked = __msi_mask_irq(desc, mask, flag);
188} 184}
189 185
190/* 186/*
@@ -194,11 +190,15 @@ static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag)
194 * file. This saves a few milliseconds when initialising devices with lots 190 * file. This saves a few milliseconds when initialising devices with lots
195 * of MSI-X interrupts. 191 * of MSI-X interrupts.
196 */ 192 */
197u32 default_msix_mask_irq(struct msi_desc *desc, u32 flag) 193u32 __msix_mask_irq(struct msi_desc *desc, u32 flag)
198{ 194{
199 u32 mask_bits = desc->masked; 195 u32 mask_bits = desc->masked;
200 unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE + 196 unsigned offset = desc->msi_attrib.entry_nr * PCI_MSIX_ENTRY_SIZE +
201 PCI_MSIX_ENTRY_VECTOR_CTRL; 197 PCI_MSIX_ENTRY_VECTOR_CTRL;
198
199 if (pci_msi_ignore_mask)
200 return 0;
201
202 mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT; 202 mask_bits &= ~PCI_MSIX_ENTRY_CTRL_MASKBIT;
203 if (flag) 203 if (flag)
204 mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT; 204 mask_bits |= PCI_MSIX_ENTRY_CTRL_MASKBIT;
@@ -207,14 +207,9 @@ u32 default_msix_mask_irq(struct msi_desc *desc, u32 flag)
207 return mask_bits; 207 return mask_bits;
208} 208}
209 209
210__weak u32 arch_msix_mask_irq(struct msi_desc *desc, u32 flag)
211{
212 return default_msix_mask_irq(desc, flag);
213}
214
215static void msix_mask_irq(struct msi_desc *desc, u32 flag) 210static void msix_mask_irq(struct msi_desc *desc, u32 flag)
216{ 211{
217 desc->masked = arch_msix_mask_irq(desc, flag); 212 desc->masked = __msix_mask_irq(desc, flag);
218} 213}
219 214
220static void msi_set_mask_bit(struct irq_data *data, u32 flag) 215static void msi_set_mask_bit(struct irq_data *data, u32 flag)
@@ -869,7 +864,7 @@ void pci_msi_shutdown(struct pci_dev *dev)
869 /* Return the device with MSI unmasked as initial states */ 864 /* Return the device with MSI unmasked as initial states */
870 mask = msi_mask(desc->msi_attrib.multi_cap); 865 mask = msi_mask(desc->msi_attrib.multi_cap);
871 /* Keep cached state to be restored */ 866 /* Keep cached state to be restored */
872 arch_msi_mask_irq(desc, mask, ~mask); 867 __msi_mask_irq(desc, mask, ~mask);
873 868
874 /* Restore dev->irq to its default pin-assertion irq */ 869 /* Restore dev->irq to its default pin-assertion irq */
875 dev->irq = desc->msi_attrib.default_irq; 870 dev->irq = desc->msi_attrib.default_irq;
@@ -967,7 +962,7 @@ void pci_msix_shutdown(struct pci_dev *dev)
967 /* Return the device with MSI-X masked as initial states */ 962 /* Return the device with MSI-X masked as initial states */
968 list_for_each_entry(entry, &dev->msi_list, list) { 963 list_for_each_entry(entry, &dev->msi_list, list) {
969 /* Keep cached states to be restored */ 964 /* Keep cached states to be restored */
970 arch_msix_mask_irq(entry, 1); 965 __msix_mask_irq(entry, 1);
971 } 966 }
972 967
973 msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0); 968 msix_clear_and_set_ctrl(dev, PCI_MSIX_FLAGS_ENABLE, 0);
diff --git a/include/linux/msi.h b/include/linux/msi.h
index 44f4746d033b..efad12742e45 100644
--- a/include/linux/msi.h
+++ b/include/linux/msi.h
@@ -10,6 +10,7 @@ struct msi_msg {
10 u32 data; /* 16 bits of msi message data */ 10 u32 data; /* 16 bits of msi message data */
11}; 11};
12 12
13extern int pci_msi_ignore_mask;
13/* Helper functions */ 14/* Helper functions */
14struct irq_data; 15struct irq_data;
15struct msi_desc; 16struct msi_desc;
@@ -21,6 +22,8 @@ void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg);
21void read_msi_msg(unsigned int irq, struct msi_msg *msg); 22void read_msi_msg(unsigned int irq, struct msi_msg *msg);
22void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); 23void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg);
23void write_msi_msg(unsigned int irq, struct msi_msg *msg); 24void write_msi_msg(unsigned int irq, struct msi_msg *msg);
25u32 __msix_mask_irq(struct msi_desc *desc, u32 flag);
26u32 __msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag);
24 27
25struct msi_desc { 28struct msi_desc {
26 struct { 29 struct {
@@ -61,8 +64,6 @@ void arch_restore_msi_irqs(struct pci_dev *dev);
61 64
62void default_teardown_msi_irqs(struct pci_dev *dev); 65void default_teardown_msi_irqs(struct pci_dev *dev);
63void default_restore_msi_irqs(struct pci_dev *dev); 66void default_restore_msi_irqs(struct pci_dev *dev);
64u32 default_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag);
65u32 default_msix_mask_irq(struct msi_desc *desc, u32 flag);
66 67
67struct msi_chip { 68struct msi_chip {
68 struct module *owner; 69 struct module *owner;