iommu/amd: Indicate whether DMA remap support is enabled
authorMario Limonciello <mario.limonciello@amd.com>
Mon, 25 Apr 2022 12:42:05 +0000 (13:42 +0100)
committerJoerg Roedel <jroedel@suse.de>
Thu, 28 Apr 2022 08:30:25 +0000 (10:30 +0200)
Bit 1 of the IVFS IVInfo field indicates that IOMMU has been used for
pre-boot DMA protection.

Export this capability to allow other places in the kernel to be able to
check for it on AMD systems.

Link: https://www.amd.com/system/files/TechDocs/48882_IOMMU.pdf
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/ce7627fa1c596878ca6515dd9d4381a45b6ee38c.1650878781.git.robin.murphy@arm.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/amd/amd_iommu_types.h
drivers/iommu/amd/init.c
drivers/iommu/amd/iommu.c

index 47108ed..72d0f5e 100644 (file)
 /* IOMMU IVINFO */
 #define IOMMU_IVINFO_OFFSET     36
 #define IOMMU_IVINFO_EFRSUP     BIT(0)
+#define IOMMU_IVINFO_DMA_REMAP  BIT(1)
 
 /* IOMMU Feature Reporting Field (for IVHD type 10h */
 #define IOMMU_FEAT_GASUP_SHIFT 6
@@ -449,6 +450,9 @@ extern struct irq_remap_table **irq_lookup_table;
 /* Interrupt remapping feature used? */
 extern bool amd_iommu_irq_remap;
 
+/* IVRS indicates that pre-boot remapping was enabled */
+extern bool amdr_ivrs_remap_support;
+
 /* kmem_cache to get tables with 128 byte alignement */
 extern struct kmem_cache *amd_iommu_irq_cache;
 
index b4a798c..0467918 100644 (file)
@@ -182,6 +182,7 @@ u32 amd_iommu_max_pasid __read_mostly = ~0;
 
 bool amd_iommu_v2_present __read_mostly;
 static bool amd_iommu_pc_present __read_mostly;
+bool amdr_ivrs_remap_support __read_mostly;
 
 bool amd_iommu_force_isolation __read_mostly;
 
@@ -326,6 +327,8 @@ static void __init early_iommu_features_init(struct amd_iommu *iommu,
 {
        if (amd_iommu_ivinfo & IOMMU_IVINFO_EFRSUP)
                iommu->features = h->efr_reg;
+       if (amd_iommu_ivinfo & IOMMU_IVINFO_DMA_REMAP)
+               amdr_ivrs_remap_support = true;
 }
 
 /* Access to l1 and l2 indexed register spaces */
index 079694f..038e104 100644 (file)
@@ -2155,6 +2155,8 @@ static bool amd_iommu_capable(enum iommu_cap cap)
                return (irq_remapping_enabled == 1);
        case IOMMU_CAP_NOEXEC:
                return false;
+       case IOMMU_CAP_PRE_BOOT_PROTECTION:
+               return amdr_ivrs_remap_support;
        default:
                break;
        }