Download raw body.
PCI amd64: Enables MSI/MSI-X interrupts on QEMU i440fx chipset emulation
Hi, this patch sets 'PCI_FLAGS_MSI_ENABLED' if the kernel runs on a QEMU
virtual machine with i440fx chipset emulation. The i440fx is the default
chipset on the QEMU so users will use it first.
And then ixv(4) and iavf(4) will fail because MSI-X interrupts are not
supported by the kernel.
The i440fx is quite old and the ACPI table is revision 1. We cannot know
if it has MSI capability from the ACPI table. So I add the flag as a quirk.
The same quirk is implemented in NetBSD.
https://github.com/NetBSD/src/blob/affb7619d18b17a184eede63a4823f629a2893fc/sys/arch/x86/pci/pci_machdep.c#L273
FreeBSD seems to have the quirk but is used as the exception for blacklist
devices. Probably they see the PCI device capability header of MSI/MSI-X.
Until we see the same capability, my patch will be useful for the VF driver
users.
OK?
diff --git a/sys/arch/amd64/pci/pci_machdep.c b/sys/arch/amd64/pci/pci_machdep.c
index 30257ab7d82..4a49c898e96 100644
--- a/sys/arch/amd64/pci/pci_machdep.c
+++ b/sys/arch/amd64/pci/pci_machdep.c
@@ -170,6 +170,31 @@ void
pci_attach_hook(struct device *parent, struct device *self,
struct pcibus_attach_args *pba)
{
+ pci_chipset_tag_t pc = pba->pba_pc;
+ pcitag_t tag;
+ pcireg_t id, class;
+
+ if (pba->pba_bus != 0)
+ return;
+
+ tag = pci_make_tag(pc, 0, 0, 0);
+ id = pci_conf_read(pc, tag, PCI_ID_REG);
+ class = pci_conf_read(pc, tag, PCI_CLASS_REG);
+
+ if (PCI_CLASS(class) != PCI_CLASS_BRIDGE ||
+ PCI_SUBCLASS(class) != PCI_SUBCLASS_BRIDGE_HOST)
+ return;
+
+ /*
+ * QEMU uses the old chipset i440fx by default, but it can use
+ * MSI/MSI-X interrupt. We cannot know if MSI/MISX is available
+ * from the ACPI table. Because it's quite old style (revision 1).
+ */
+ if ((cpu_ecxfeature & CPUIDECX_HV) &&
+ PCI_VENDOR(id) == PCI_VENDOR_INTEL &&
+ PCI_PRODUCT(id) == PCI_PRODUCT_INTEL_82441FX) {
+ pba->pba_flags |= PCI_FLAGS_MSI_ENABLED;
+ }
}
int
--
Yuichiro NAITO (naito.yuichiro@gmail.com)
PCI amd64: Enables MSI/MSI-X interrupts on QEMU i440fx chipset emulation