Skip to content

Commit 2226667

Browse files
Marc ZyngierKAGA-KOKO
authored andcommitted
PCI/MSI: Deal with devices lying about their MSI mask capability
It appears that some devices are lying about their mask capability, pretending that they don't have it, while they actually do. The net result is that now that we don't enable MSIs on such endpoint. Add a new per-device flag to deal with this. Further patches will make use of it, sadly. Signed-off-by: Marc Zyngier <[email protected]> Signed-off-by: Thomas Gleixner <[email protected]> Reviewed-by: Thomas Gleixner <[email protected]> Link: https://lore.kernel.org/r/[email protected] Cc: Bjorn Helgaas <[email protected]>
1 parent 9c8e9c9 commit 2226667

File tree

2 files changed

+5
-0
lines changed

2 files changed

+5
-0
lines changed

drivers/pci/msi.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,9 @@ msi_setup_entry(struct pci_dev *dev, int nvec, struct irq_affinity *affd)
477477
goto out;
478478

479479
pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
480+
/* Lies, damned lies, and MSIs */
481+
if (dev->dev_flags & PCI_DEV_FLAGS_HAS_MSI_MASKING)
482+
control |= PCI_MSI_FLAGS_MASKBIT;
480483

481484
entry->msi_attrib.is_msix = 0;
482485
entry->msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT);

include/linux/pci.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,8 @@ enum pci_dev_flags {
233233
PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 << 10),
234234
/* Don't use Relaxed Ordering for TLPs directed at this device */
235235
PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t) (1 << 11),
236+
/* Device does honor MSI masking despite saying otherwise */
237+
PCI_DEV_FLAGS_HAS_MSI_MASKING = (__force pci_dev_flags_t) (1 << 12),
236238
};
237239

238240
enum pci_irq_reroute_variant {

0 commit comments

Comments
 (0)