diff options
-rw-r--r-- | arch/s390/pci/pci.c | 4 | ||||
-rw-r--r-- | arch/x86/include/asm/x86_init.h | 3 | ||||
-rw-r--r-- | arch/x86/kernel/x86_init.c | 10 | ||||
-rw-r--r-- | arch/x86/pci/xen.c | 15 | ||||
-rw-r--r-- | drivers/pci/msi.c | 29 | ||||
-rw-r--r-- | include/linux/msi.h | 5 |
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 | ||
173 | struct pci_dev; | 173 | struct pci_dev; |
174 | struct msi_msg; | 174 | struct msi_msg; |
175 | struct msi_desc; | ||
176 | 175 | ||
177 | struct x86_msi_ops { | 176 | struct 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 | ||
190 | struct IO_APIC_route_entry; | 187 | struct 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 | } |
143 | u32 arch_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) | ||
144 | { | ||
145 | return x86_msi.msi_mask_irq(desc, mask, flag); | ||
146 | } | ||
147 | u32 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 | ||
153 | struct x86_io_apic_ops x86_io_apic_ops = { | 143 | struct 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 | } |
397 | static u32 xen_nop_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) | 397 | |
398 | { | ||
399 | return 0; | ||
400 | } | ||
401 | static u32 xen_nop_msix_mask_irq(struct msi_desc *desc, u32 flag) | ||
402 | { | ||
403 | return 0; | ||
404 | } | ||
405 | #endif | 398 | #endif |
406 | 399 | ||
407 | int __init pci_xen_init(void) | 400 | int __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 | ||
25 | static int pci_msi_enable = 1; | 25 | static int pci_msi_enable = 1; |
26 | int 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 | */ |
166 | u32 default_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) | 167 | u32 __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 | |||
185 | static void msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag) | 181 | static 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 | */ |
197 | u32 default_msix_mask_irq(struct msi_desc *desc, u32 flag) | 193 | u32 __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 | |||
215 | static void msix_mask_irq(struct msi_desc *desc, u32 flag) | 210 | static 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 | ||
220 | static void msi_set_mask_bit(struct irq_data *data, u32 flag) | 215 | static 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 | ||
13 | extern int pci_msi_ignore_mask; | ||
13 | /* Helper functions */ | 14 | /* Helper functions */ |
14 | struct irq_data; | 15 | struct irq_data; |
15 | struct msi_desc; | 16 | struct msi_desc; |
@@ -21,6 +22,8 @@ void __write_msi_msg(struct msi_desc *entry, struct msi_msg *msg); | |||
21 | void read_msi_msg(unsigned int irq, struct msi_msg *msg); | 22 | void read_msi_msg(unsigned int irq, struct msi_msg *msg); |
22 | void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); | 23 | void get_cached_msi_msg(unsigned int irq, struct msi_msg *msg); |
23 | void write_msi_msg(unsigned int irq, struct msi_msg *msg); | 24 | void write_msi_msg(unsigned int irq, struct msi_msg *msg); |
25 | u32 __msix_mask_irq(struct msi_desc *desc, u32 flag); | ||
26 | u32 __msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag); | ||
24 | 27 | ||
25 | struct msi_desc { | 28 | struct msi_desc { |
26 | struct { | 29 | struct { |
@@ -61,8 +64,6 @@ void arch_restore_msi_irqs(struct pci_dev *dev); | |||
61 | 64 | ||
62 | void default_teardown_msi_irqs(struct pci_dev *dev); | 65 | void default_teardown_msi_irqs(struct pci_dev *dev); |
63 | void default_restore_msi_irqs(struct pci_dev *dev); | 66 | void default_restore_msi_irqs(struct pci_dev *dev); |
64 | u32 default_msi_mask_irq(struct msi_desc *desc, u32 mask, u32 flag); | ||
65 | u32 default_msix_mask_irq(struct msi_desc *desc, u32 flag); | ||
66 | 67 | ||
67 | struct msi_chip { | 68 | struct msi_chip { |
68 | struct module *owner; | 69 | struct module *owner; |