Re: [PATCH] PCI: vmd: Check EIME mode before MSI remapping

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 2/4/2022 1:40 AM, Nirmal Patel wrote:
> We are observing DMAR errors from vt-d when vmd is enabled along with
> interrupt remapping and extended interrupt mode. As a result the host
> machine is not able boot successfully.
>
> DMAR: DRHD: handling fault status reg 2
> DMAR: [INTR-REMAP] Request device [0xc9:0x05.0] fault index 0xa00
> [fault reason 0x25] Blocked a compatibility format interrupt request
>
> The issue was observed in intel Whitley platform and newer with ICE
> Lake processor with latest kernel. The issued was also reproduced in
> 5.10 by backporting patches related to commit ee81ee84f873 ("PCI: vmd:
> Disable MSI-X remapping when possible")
>
> According to Intel VT-d specs section "5.1.4 Interrupt-Remapping
> Hardware Operation", If Extended Interrupt Mode is enabled (EIME), or
> if the Compatibility format interrupts are disabled (CFIS), the
> Compatibility format interrupts are blocked.
>
> Do not disable MSI remapping if interrupt remapping enabled and
> x2apic_opt_out mode is disabled.
>
> Signed-off-by: Nirmal Patel <nirmal.patel@xxxxxxxxxxxxxxx>
> ---
>  drivers/pci/controller/vmd.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
> index cc166c683638..4eb38c6bd578 100644
> --- a/drivers/pci/controller/vmd.c
> +++ b/drivers/pci/controller/vmd.c
> @@ -17,6 +17,7 @@
>  #include <linux/srcu.h>
>  #include <linux/rculist.h>
>  #include <linux/rcupdate.h>
> +#include <asm/apic.h>
>  
>  #include <asm/irqdomain.h>
>  
> @@ -814,7 +815,7 @@ static int vmd_enable_domain(struct vmd_dev *vmd, unsigned long features)
>  	 * remapping doesn't become a performance bottleneck.
>  	 */
>  	if (iommu_capable(vmd->dev->dev.bus, IOMMU_CAP_INTR_REMAP) ||
> -	    !(features & VMD_FEAT_CAN_BYPASS_MSI_REMAP) ||
> +	    x2apic_enabled() || !(features & VMD_FEAT_CAN_BYPASS_MSI_REMAP) ||
>  	    offset[0] || offset[1]) {
>  		ret = vmd_alloc_irqs(vmd);
>  		if (ret)

Hello,

Gentle ping. Please let me know if there is a suggestion.

Thanks.




[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux