Index | Thread | Search

From:
Yuichiro NAITO <naito.yuichiro@gmail.com>
Subject:
Re: PCI amd64: Enables MSI/MSI-X interrupts on QEMU i440fx chipset emulation
To:
jsg@jsg.id.au
Cc:
kettenis@openbsd.org, tech@openbsd.org, yasuoka@openbsd.org
Date:
Mon, 07 Oct 2024 11:42:33 +0900

Download raw body.

Thread
From: Jonathan Gray <jsg@jsg.id.au>
Subject: Re: PCI amd64: Enables MSI/MSI-X interrupts on QEMU i440fx chipset emulation
Date: Mon, 7 Oct 2024 13:29:06 +1100

> On Mon, Oct 07, 2024 at 10:54:14AM +0900, Yuichiro NAITO wrote:
>> 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.
> 
> i440fx was released in 1996.  Why not use the q35/ich9 machine?
> That hardware had MSI.

Because the QEMU default chipset emulation is still i440fx.
Many users forget to configure q35 chipset and I was asked
so many times for the ixv(4) driver.

> If networking is configured, non-default options are already set.

Sorry, what do you mean by the 'non-default options'?
Would you tell me more details for my understanding?

>> 
>> 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)
>> 
>> 

-- 
Yuichiro NAITO (naito.yuichiro@gmail.com)