aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/msi.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci/msi.c')
-rw-r--r--drivers/pci/msi.c27
1 files changed, 16 insertions, 11 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c
index b4a90badd0a6..baba2eb5367d 100644
--- a/drivers/pci/msi.c
+++ b/drivers/pci/msi.c
@@ -103,6 +103,14 @@ static void msix_set_enable(struct pci_dev *dev, int enable)
103 } 103 }
104} 104}
105 105
106static inline __attribute_const__ u32 msi_mask(unsigned x)
107{
108 /* Don't shift by >= width of type */
109 if (x >= 5)
110 return 0xffffffff;
111 return (1 << (1 << x)) - 1;
112}
113
106static void msix_flush_writes(struct irq_desc *desc) 114static void msix_flush_writes(struct irq_desc *desc)
107{ 115{
108 struct msi_desc *entry; 116 struct msi_desc *entry;
@@ -398,21 +406,18 @@ static int msi_capability_init(struct pci_dev *dev)
398 entry->msi_attrib.masked = 1; 406 entry->msi_attrib.masked = 1;
399 entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */ 407 entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */
400 entry->msi_attrib.pos = pos; 408 entry->msi_attrib.pos = pos;
401 if (entry->msi_attrib.maskbit) {
402 entry->mask_base = (void __iomem *)(long)msi_mask_bits_reg(pos,
403 entry->msi_attrib.is_64);
404 }
405 entry->dev = dev; 409 entry->dev = dev;
406 if (entry->msi_attrib.maskbit) { 410 if (entry->msi_attrib.maskbit) {
407 unsigned int maskbits, temp; 411 unsigned int base, maskbits, temp;
412
413 base = msi_mask_bits_reg(pos, entry->msi_attrib.is_64);
414 entry->mask_base = (void __iomem *)(long)base;
415
408 /* All MSIs are unmasked by default, Mask them all */ 416 /* All MSIs are unmasked by default, Mask them all */
409 pci_read_config_dword(dev, 417 pci_read_config_dword(dev, base, &maskbits);
410 msi_mask_bits_reg(pos, entry->msi_attrib.is_64), 418 temp = msi_mask((control & PCI_MSI_FLAGS_QMASK) >> 1);
411 &maskbits);
412 temp = (1 << multi_msi_capable(control));
413 temp = ((temp - 1) & ~temp);
414 maskbits |= temp; 419 maskbits |= temp;
415 pci_write_config_dword(dev, entry->msi_attrib.is_64, maskbits); 420 pci_write_config_dword(dev, base, maskbits);
416 entry->msi_attrib.maskbits_mask = temp; 421 entry->msi_attrib.maskbits_mask = temp;
417 } 422 }
418 list_add_tail(&entry->list, &dev->msi_list); 423 list_add_tail(&entry->list, &dev->msi_list);