From: Suravee Suthikulpanit <[email protected]>

AMD IOMMU introduces support for Guest I/O protection where the request
from the I/O device without a PASID are treated as if they have PASID 0.

Co-developed-by: Vasant Hegde <[email protected]>
Signed-off-by: Vasant Hegde <[email protected]>
Signed-off-by: Suravee Suthikulpanit <[email protected]>
---
 drivers/iommu/amd/amd_iommu_types.h | 3 +++
 drivers/iommu/amd/init.c            | 8 ++++++++
 drivers/iommu/amd/iommu.c           | 5 +++++
 3 files changed, 16 insertions(+)

diff --git a/drivers/iommu/amd/amd_iommu_types.h 
b/drivers/iommu/amd/amd_iommu_types.h
index 4062313a2407..a25c24188104 100644
--- a/drivers/iommu/amd/amd_iommu_types.h
+++ b/drivers/iommu/amd/amd_iommu_types.h
@@ -93,6 +93,7 @@
 #define FEATURE_HE             (1ULL<<8)
 #define FEATURE_PC             (1ULL<<9)
 #define FEATURE_GAM_VAPIC      (1ULL<<21)
+#define FEATURE_GIOSUP         (1ULL<<48)
 #define FEATURE_EPHSUP         (1ULL<<50)
 #define FEATURE_SNP            (1ULL<<63)
 
@@ -370,6 +371,7 @@
 #define DTE_FLAG_IW (1ULL << 62)
 
 #define DTE_FLAG_IOTLB (1ULL << 32)
+#define DTE_FLAG_GIOV  (1ULL << 54)
 #define DTE_FLAG_GV    (1ULL << 55)
 #define DTE_FLAG_MASK  (0x3ffULL << 32)
 #define DTE_GLX_SHIFT  (56)
@@ -427,6 +429,7 @@
 #define PD_PASSTHROUGH_MASK    (1UL << 2) /* domain has no page
                                              translation */
 #define PD_IOMMUV2_MASK                (1UL << 3) /* domain has gcr3 table */
+#define PD_GIOV_MASK           (1UL << 4) /* domain enable GIOV support */
 
 extern bool amd_iommu_dump;
 #define DUMP_printk(format, arg...)                            \
diff --git a/drivers/iommu/amd/init.c b/drivers/iommu/amd/init.c
index 453afce7d478..d4d9c812305d 100644
--- a/drivers/iommu/amd/init.c
+++ b/drivers/iommu/amd/init.c
@@ -2024,6 +2024,12 @@ static int __init iommu_init_pci(struct amd_iommu *iommu)
 
        init_iommu_perf_ctr(iommu);
 
+       if (amd_iommu_pgtable == AMD_IOMMU_V2 &&
+           !iommu_feature(iommu, FEATURE_GIOSUP)) {
+               pr_warn("Cannot enable v2 page table for DMA-API. Fallback to 
v1.\n");
+               amd_iommu_pgtable = AMD_IOMMU_V1;
+       }
+
        if (is_rd890_iommu(iommu->dev)) {
                int i, j;
 
@@ -2098,6 +2104,8 @@ static void print_iommu_info(void)
                if (amd_iommu_xt_mode == IRQ_REMAP_X2APIC_MODE)
                        pr_info("X2APIC enabled\n");
        }
+       if (amd_iommu_pgtable == AMD_IOMMU_V2)
+               pr_info("V2 page table enabled\n");
 }
 
 static int __init amd_iommu_init_pci(void)
diff --git a/drivers/iommu/amd/iommu.c b/drivers/iommu/amd/iommu.c
index deb546266d42..f2d939b7cc4d 100644
--- a/drivers/iommu/amd/iommu.c
+++ b/drivers/iommu/amd/iommu.c
@@ -1553,6 +1553,11 @@ static void set_dte_entry(struct amd_iommu *iommu, u16 
devid,
 
        pte_root |= (domain->iop.mode & DEV_ENTRY_MODE_MASK)
                    << DEV_ENTRY_MODE_SHIFT;
+
+       if ((domain->flags & PD_IOMMUV2_MASK) &&
+           (domain->flags & PD_GIOV_MASK))
+               pte_root |= DTE_FLAG_GIOV;
+
        pte_root |= DTE_FLAG_IR | DTE_FLAG_IW | DTE_FLAG_V | DTE_FLAG_TV;
 
        flags = dev_table[devid].data[1];
-- 
2.27.0

_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to