iommu/amd: Enable PCI/IMS
authorThomas Gleixner <tglx@linutronix.de>
Thu, 24 Nov 2022 23:26:36 +0000 (00:26 +0100)
committerThomas Gleixner <tglx@linutronix.de>
Mon, 5 Dec 2022 21:22:35 +0000 (22:22 +0100)
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
drivers/iommu/amd/iommu.c

index 7caccd8996f93cdf931119834e4eeec0895f980c..4d28967f910d96d40236c0d76f7e658d9146e2ca 100644 (file)
@@ -3649,11 +3649,20 @@ static struct irq_chip amd_ir_chip = {
 };
 
 static const struct msi_parent_ops amdvi_msi_parent_ops = {
-       .supported_flags        = X86_VECTOR_MSI_FLAGS_SUPPORTED | MSI_FLAG_MULTI_PCI_MSI,
+       .supported_flags        = X86_VECTOR_MSI_FLAGS_SUPPORTED |
+                                 MSI_FLAG_MULTI_PCI_MSI |
+                                 MSI_FLAG_PCI_IMS,
        .prefix                 = "IR-",
        .init_dev_msi_info      = msi_parent_init_dev_msi_info,
 };
 
+static const struct msi_parent_ops virt_amdvi_msi_parent_ops = {
+       .supported_flags        = X86_VECTOR_MSI_FLAGS_SUPPORTED |
+                                 MSI_FLAG_MULTI_PCI_MSI,
+       .prefix                 = "vIR-",
+       .init_dev_msi_info      = msi_parent_init_dev_msi_info,
+};
+
 int amd_iommu_create_irq_domain(struct amd_iommu *iommu)
 {
        struct fwnode_handle *fn;
@@ -3670,7 +3679,11 @@ int amd_iommu_create_irq_domain(struct amd_iommu *iommu)
 
        irq_domain_update_bus_token(iommu->ir_domain,  DOMAIN_BUS_AMDVI);
        iommu->ir_domain->flags |= IRQ_DOMAIN_FLAG_MSI_PARENT;
-       iommu->ir_domain->msi_parent_ops = &amdvi_msi_parent_ops;
+
+       if (amd_iommu_np_cache)
+               iommu->ir_domain->msi_parent_ops = &virt_amdvi_msi_parent_ops;
+       else
+               iommu->ir_domain->msi_parent_ops = &amdvi_msi_parent_ops;
 
        return 0;
 }