PCI: MSI: Deal with devices lying about their masking capability
Subsystems (2)
cover PCI: MSI: Deal with devices lying about their masking capability
Rui reported[1] that his Nvidia ION system stopped working with 5.15, with the AHCI device failing to get any MSI. A rapid investigation revealed that although the device doesn't advertise MSI masking, it actually needs it. Quality hardware indeed.
Anyway, the couple of patches below are an attempt at dealing with the issue in a more or less generic way.
[1] https://lore.kernel.org/r/CALjTZvbzYfBuLB+H=fj2J+9=DxjQ2Uqcy0if_PvmJ-nU-qEgkg@mail.gmail.com
Marc Zyngier (2):
PCI: MSI: Deal with devices lying about their MSI mask capability
PCI: Add MSI masking quirk for Nvidia ION AHCI
drivers/pci/msi.c | 3 +++ drivers/pci/quirks.c | 6 ++++++ include/linux/pci.h | 2 ++ 3 files changed, 11 insertions(+)
Signature · 1 line
2.30.2
PATCH 1/2 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.
--- drivers/pci/msi.c | 3 +++ include/linux/pci.h | 2 ++ 2 files changed, 5 insertions(+)
drivers/pci/msi.c +3 -0
@@ -479,6 +479,9 @@ msi_setup_entry(struct pci_dev *dev, int nvec, struct irq_affinity *affd) goto out;pci_read_config_word (dev, dev->msi_cap +PCI_MSI_FLAGS , &control); +/* Lies, damned lies, and MSIs */ +if (dev->dev_flags &PCI_DEV_FLAGS_HAS_MSI_MASKING ) + control |=PCI_MSI_FLAGS_MASKBIT ; entry->msi_attrib.is_msix =0 ; entry->msi_attrib.is_64 = !!(control &PCI_MSI_FLAGS_64BIT );
include/linux/pci.h +2 -0
@@ -233,6 +233,8 @@ enum pci_dev_flags {PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 <<10 ),/* Don't use Relaxed Ordering for TLPs directed at this device */ PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t) (1 <<11 ), +/* Device does honor MSI masking despite saying otherwise */ + PCI_DEV_FLAGS_HAS_MSI_MASKING = (__force pci_dev_flags_t) (1 << 12), }; enum pci_irq_reroute_variant {
Signature · 1 line
2.30.2
[tip: irq/urgent] PCI/MSI: Deal with devices lying about their MSI mask capability
The following commit has been merged into the irq/urgent branch of tip:
The following commit has been merged into the irq/urgent branch of tip:
Commit-ID: 2226667a145db2e1f314d7f57fd644fe69863ab9 Gitweb: https://git.kernel.org/tip/2226667a145db2e1f314d7f57fd644fe69863ab9 Author: Marc Zyngier <[email protected]> AuthorDate: Thu, 04 Nov 2021 18:01:29 Committer: Thomas Gleixner <[email protected]> CommitterDate: Thu, 11 Nov 2021 09:50:30 +01:00
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.
--- drivers/pci/msi.c | 3 +++ include/linux/pci.h | 2 ++ 2 files changed, 5 insertions(+)
drivers/pci/msi.c +3 -0
@@ -477,6 +477,9 @@ msi_setup_entry(struct pci_dev *dev, int nvec, struct irq_affinity *affd) goto out;pci_read_config_word (dev, dev->msi_cap +PCI_MSI_FLAGS , &control); +/* Lies, damned lies, and MSIs */ +if (dev->dev_flags &PCI_DEV_FLAGS_HAS_MSI_MASKING ) + control |=PCI_MSI_FLAGS_MASKBIT ; entry->msi_attrib.is_msix =0 ; entry->msi_attrib.is_64 = !!(control &PCI_MSI_FLAGS_64BIT );
include/linux/pci.h +2 -0
@@ -233,6 +233,8 @@ enum pci_dev_flags {PCI_DEV_FLAGS_NO_FLR_RESET = (__force pci_dev_flags_t) (1 <<10 ),/* Don't use Relaxed Ordering for TLPs directed at this device */ PCI_DEV_FLAGS_NO_RELAXED_ORDERING = (__force pci_dev_flags_t) (1 <<11 ), +/* Device does honor MSI masking despite saying otherwise */ + PCI_DEV_FLAGS_HAS_MSI_MASKING = (__force pci_dev_flags_t) (1 << 12), }; enum pci_irq_reroute_variant {
PATCH 2/2 PCI: Add MSI masking quirk for Nvidia ION AHCI
In reply to Marc ZyngierThe ION AHCI device pretends that MSI masking isn't a thing, while it actually implements it and needs MSIs to be unmasked to work. Add a quirk to that effect.
--- drivers/pci/quirks.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/pci/quirks.c +6 -0
@@ -5795,3 +5795,9 @@ static void apex_pci_fixup_class(struct pci_dev *pdev) }DECLARE_PCI_FIXUP_CLASS_HEADER (0x1ac1 ,0x089a ,PCI_CLASS_NOT_DEFINED ,8 , apex_pci_fixup_class); + +static void nvidia_ion_ahci_fixup (struct pci_dev *pdev) +{ + pdev->dev_flags |=PCI_DEV_FLAGS_HAS_MSI_MASKING ; +} +DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_NVIDIA ,0x0ab8 , nvidia_ion_ahci_fixup);
Signature · 1 line
2.30.2
Quoted 10 lines · Marc Zyngier
Rui reported[1] that his Nvidia ION system stopped working with 5.15, with the AHCI device failing to get any MSI. A rapid investigation revealed that although the device doesn't advertise MSI masking, it actually needs it. Quality hardware indeed.
Anyway, the couple of patches below are an attempt at dealing with the issue in a more or less generic way.
[1] https://lore.kernel.org/r/CALjTZvbzYfBuLB+H=fj2J+9=DxjQ2Uqcy0if_PvmJ-nU-qEgkg@mail.gmail.com
Quoted 8 lines
Marc Zyngier (2):
PCI: MSI: Deal with devices lying about their MSI mask capability
PCI: Add MSI masking quirk for Nvidia ION AHCIdrivers/pci/msi.c | 3 +++ drivers/pci/quirks.c | 6 ++++++ include/linux/pci.h | 2 ++ 3 files changed, 11 insertions(+)
Groan.
Hi, Thomas,
Quoted 16 lines · Thomas Gleixner
Quoted 14 lines · Marc Zyngier
Rui reported[1] that his Nvidia ION system stopped working with 5.15, with the AHCI device failing to get any MSI. A rapid investigation revealed that although the device doesn't advertise MSI masking, it actually needs it. Quality hardware indeed.
Anyway, the couple of patches below are an attempt at dealing with the issue in a more or less generic way.
[1] https://lore.kernel.org/r/CALjTZvbzYfBuLB+H=fj2J+9=DxjQ2Uqcy0if_PvmJ-nU-qEgkg@mail.gmail.com
Marc Zyngier (2):
PCI: MSI: Deal with devices lying about their MSI mask capability
PCI: Add MSI masking quirk for Nvidia ION AHCI
Quoted 8 lines
Quoted 4 lines
drivers/pci/msi.c | 3 +++ drivers/pci/quirks.c | 6 ++++++ include/linux/pci.h | 2 ++ 3 files changed, 11 insertions(+)Groan.
Reviewed-by Thomas Gleixner <[email protected]>
Just a reminder, to make sure this doesn't fall through the cracks. It's already in 5.16, but needs to be backported to 5.15. I'm not seeing it in Greg's 5.15 stable queue yet.
Thanks,
Rui
Greg KH
maintainerQuoted 24 lines · Rui Salvaterra
Hi, Thomas,
Quoted 21 lines · Thomas Gleixner
Quoted 18 lines · Marc Zyngier
Rui reported[1] that his Nvidia ION system stopped working with 5.15, with the AHCI device failing to get any MSI. A rapid investigation revealed that although the device doesn't advertise MSI masking, it actually needs it. Quality hardware indeed.
Anyway, the couple of patches below are an attempt at dealing with the issue in a more or less generic way.
[1] https://lore.kernel.org/r/CALjTZvbzYfBuLB+H=fj2J+9=DxjQ2Uqcy0if_PvmJ-nU-qEgkg@mail.gmail.com
Marc Zyngier (2):
PCI: MSI: Deal with devices lying about their MSI mask capability
PCI: Add MSI masking quirk for Nvidia ION AHCIdrivers/pci/msi.c | 3 +++ drivers/pci/quirks.c | 6 ++++++ include/linux/pci.h | 2 ++ 3 files changed, 11 insertions(+)
Quoted 7 lines
Quoted 3 lines
Groan.
Reviewed-by Thomas Gleixner <[email protected]>Just a reminder, to make sure this doesn't fall through the cracks. It's already in 5.16, but needs to be backported to 5.15. I'm not seeing it in Greg's 5.15 stable queue yet.
What is the git commit ids of these changes in Linus's tree?
thanks,
greg k-h
Hi, Greg,
Quoted 2 lines · Greg KH
What is the git commit ids of these changes in Linus's tree?
2226667a145d ("PCI/MSI: Deal with devices lying about their MSI mask capability")f21082fb20db ("PCI: Add MSI masking quirk for Nvidia ION AHCI")
Thanks,
Rui
Greg KH
maintainerQuoted 9 lines · Rui Salvaterra
Hi, Greg,
Quoted 2 lines · Greg KH
What is the git commit ids of these changes in Linus's tree?
2226667a145d("PCI/MSI: Deal with devices lying about their MSI mask capability")f21082fb20db("PCI: Add MSI masking quirk for Nvidia ION AHCI")
Thanks, I'll queue them up in the next round of releases after the current ones are out.
greg k-h
Greg KH
maintainerQuoted 5 lines · Greg KH
Quoted 4 lines · Rui Salvaterra
Hi, Greg,
Quoted 1 line · Greg KH
Quoted 8 lines
Quoted 5 lines
Quoted 1 line
What is the git commit ids of these changes in Linus's tree?
2226667a145d("PCI/MSI: Deal with devices lying about their MSI mask capability")f21082fb20db("PCI: Add MSI masking quirk for Nvidia ION AHCI")Thanks, I'll queue them up in the next round of releases after the current ones are out.
Now queued up.
greg k-h