Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iommu/amd: Enable PCI/IMS

PCI/IMS works like PCI/MSI-X in the remapping. Just add the feature flag,
but only when on real hardware.

Virtualized IOMMUs need additional support.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Acked-by: Marc Zyngier <maz@kernel.org>
Link: https://lore.kernel.org/r/20221124232327.140571546@linutronix.de

+15 -2
+15 -2
drivers/iommu/amd/iommu.c
··· 3649 3649 }; 3650 3650 3651 3651 static const struct msi_parent_ops amdvi_msi_parent_ops = { 3652 - .supported_flags = X86_VECTOR_MSI_FLAGS_SUPPORTED | MSI_FLAG_MULTI_PCI_MSI, 3652 + .supported_flags = X86_VECTOR_MSI_FLAGS_SUPPORTED | 3653 + MSI_FLAG_MULTI_PCI_MSI | 3654 + MSI_FLAG_PCI_IMS, 3653 3655 .prefix = "IR-", 3656 + .init_dev_msi_info = msi_parent_init_dev_msi_info, 3657 + }; 3658 + 3659 + static const struct msi_parent_ops virt_amdvi_msi_parent_ops = { 3660 + .supported_flags = X86_VECTOR_MSI_FLAGS_SUPPORTED | 3661 + MSI_FLAG_MULTI_PCI_MSI, 3662 + .prefix = "vIR-", 3654 3663 .init_dev_msi_info = msi_parent_init_dev_msi_info, 3655 3664 }; 3656 3665 ··· 3679 3670 3680 3671 irq_domain_update_bus_token(iommu->ir_domain, DOMAIN_BUS_AMDVI); 3681 3672 iommu->ir_domain->flags |= IRQ_DOMAIN_FLAG_MSI_PARENT; 3682 - iommu->ir_domain->msi_parent_ops = &amdvi_msi_parent_ops; 3673 + 3674 + if (amd_iommu_np_cache) 3675 + iommu->ir_domain->msi_parent_ops = &virt_amdvi_msi_parent_ops; 3676 + else 3677 + iommu->ir_domain->msi_parent_ops = &amdvi_msi_parent_ops; 3683 3678 3684 3679 return 0; 3685 3680 }