diff mbox series

[1/2] PCI: vmd: Assign VMD IRQ domain before enumeration

Message ID 20220502084900.7903-2-nirmal.patel@linux.intel.com (mailing list archive)
State Superseded
Delegated to: Lorenzo Pieralisi
Headers show
Series PCI: vmd: IRQ domain assignment to sub devices | expand

Commit Message

Nirmal Patel May 2, 2022, 8:48 a.m. UTC
VMD creates and assigns a separate IRQ domain when MSI-X remapping is
enabled. For example VMD-MSI. But VMD doesn't assign IRQ domain when
MSI-X remapping is disabled resulting child devices getting default
PCI-MSI IRQ domain. Now when interrupt remapping is enabled by
intel-iommu all the PCI devices are assigned INTEL-IR-MSI domain
including VMD endpoints. But devices behind VMD get PCI-MSI IRQ domain
when VMD create a root bus and configures child devices.

As a result DMAR errors were observed when interrupt remapping was
enabled on Intel Icelake CPUs. For instance:

  DMAR: DRHD: handling fault status reg 2
  DMAR: [INTR-REMAP] Request device [0xe2:0x00.0] fault index 0xa00 [fault reason 0x25] Blocked a compatibility format interrupt request

Signed-off-by: Nirmal Patel <nirmal.patel@linux.intel.com>
---
 drivers/pci/controller/vmd.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Lorenzo Pieralisi May 11, 2022, 9:10 a.m. UTC | #1
[Adding Marc, to keep an eye on IRQ domain usage]

On Mon, May 02, 2022 at 01:48:59AM -0700, Nirmal Patel wrote:
> VMD creates and assigns a separate IRQ domain when MSI-X remapping is
> enabled. For example VMD-MSI. But VMD doesn't assign IRQ domain when
> MSI-X remapping is disabled resulting child devices getting default
> PCI-MSI IRQ domain. Now when interrupt remapping is enabled by
> intel-iommu all the PCI devices are assigned INTEL-IR-MSI domain
> including VMD endpoints. But devices behind VMD get PCI-MSI IRQ domain
> when VMD create a root bus and configures child devices.

I would encourage you to rewrite this log, it is unclear - granted,
I don't know intel-iommu internals - but IMHO if you explain the
issue and the fix thoroughly this could avoid repeating what
you have to do in patch(2).

Please describe how VMD handles IRQ domains and how you are fixing
that.

Thanks,
Lorenzo

> As a result DMAR errors were observed when interrupt remapping was
> enabled on Intel Icelake CPUs. For instance:
> 
>   DMAR: DRHD: handling fault status reg 2
>   DMAR: [INTR-REMAP] Request device [0xe2:0x00.0] fault index 0xa00 [fault reason 0x25] Blocked a compatibility format interrupt request
> 
> Signed-off-by: Nirmal Patel <nirmal.patel@linux.intel.com>
> ---
>  drivers/pci/controller/vmd.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
> index eb05cceab964..5015adc04d19 100644
> --- a/drivers/pci/controller/vmd.c
> +++ b/drivers/pci/controller/vmd.c
> @@ -853,6 +853,9 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
>  	vmd_attach_resources(vmd);
>  	if (vmd->irq_domain)
>  		dev_set_msi_domain(&vmd->bus->dev, vmd->irq_domain);
> +	else
> +		dev_set_msi_domain(&vmd->bus->dev,
> +				   dev_get_msi_domain(&vmd->dev->dev));
>  
>  	vmd_acpi_begin();
>  
> -- 
> 2.26.2
>
Nirmal Patel May 11, 2022, 4:57 p.m. UTC | #2
On 5/11/2022 2:10 AM, Lorenzo Pieralisi wrote:
> [Adding Marc, to keep an eye on IRQ domain usage]
>
> On Mon, May 02, 2022 at 01:48:59AM -0700, Nirmal Patel wrote:
>> VMD creates and assigns a separate IRQ domain when MSI-X remapping is
>> enabled. For example VMD-MSI. But VMD doesn't assign IRQ domain when
>> MSI-X remapping is disabled resulting child devices getting default
>> PCI-MSI IRQ domain. Now when interrupt remapping is enabled by
>> intel-iommu all the PCI devices are assigned INTEL-IR-MSI domain
>> including VMD endpoints. But devices behind VMD get PCI-MSI IRQ domain
>> when VMD create a root bus and configures child devices.
> I would encourage you to rewrite this log, it is unclear - granted,
> I don't know intel-iommu internals - but IMHO if you explain the
> issue and the fix thoroughly this could avoid repeating what
> you have to do in patch(2).
>
> Please describe how VMD handles IRQ domains and how you are fixing
> that.
>
> Thanks,
> Lorenzo
I will add more information to the commit logs.

Thanks,
nirmal

>> As a result DMAR errors were observed when interrupt remapping was
>> enabled on Intel Icelake CPUs. For instance:
>>
>>   DMAR: DRHD: handling fault status reg 2
>>   DMAR: [INTR-REMAP] Request device [0xe2:0x00.0] fault index 0xa00 [fault reason 0x25] Blocked a compatibility format interrupt request
>>
>> Signed-off-by: Nirmal Patel <nirmal.patel@linux.intel.com>
>> ---
>>  drivers/pci/controller/vmd.c | 3 +++
>>  1 file changed, 3 insertions(+)
>>
>> diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
>> index eb05cceab964..5015adc04d19 100644
>> --- a/drivers/pci/controller/vmd.c
>> +++ b/drivers/pci/controller/vmd.c
>> @@ -853,6 +853,9 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
>>  	vmd_attach_resources(vmd);
>>  	if (vmd->irq_domain)
>>  		dev_set_msi_domain(&vmd->bus->dev, vmd->irq_domain);
>> +	else
>> +		dev_set_msi_domain(&vmd->bus->dev,
>> +				   dev_get_msi_domain(&vmd->dev->dev));
>>  
>>  	vmd_acpi_begin();
>>  
>> -- 
>> 2.26.2
>>
diff mbox series

Patch

diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
index eb05cceab964..5015adc04d19 100644
--- a/drivers/pci/controller/vmd.c
+++ b/drivers/pci/controller/vmd.c
@@ -853,6 +853,9 @@  static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
 	vmd_attach_resources(vmd);
 	if (vmd->irq_domain)
 		dev_set_msi_domain(&vmd->bus->dev, vmd->irq_domain);
+	else
+		dev_set_msi_domain(&vmd->bus->dev,
+				   dev_get_msi_domain(&vmd->dev->dev));
 
 	vmd_acpi_begin();