]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu/amd: Refactor persistent DTE bits programming into amd_iommu_make_clear_dte()
authorSuravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Thu, 15 Jan 2026 06:08:12 +0000 (06:08 +0000)
committerJoerg Roedel <joerg.roedel@amd.com>
Sun, 18 Jan 2026 09:56:14 +0000 (10:56 +0100)
To help avoid duplicate logic when programing DTE for nested translation.

Note that this commit changes behavior of when the IOMMU driver is
switching domain during attach and the blocking domain, where DTE bit
fields for interrupt pass-through (i.e. Lint0, Lint1, NMI, INIT, ExtInt)
and System management message could be affected. These DTE bits are
specified in the IVRS table for specific devices, and should be persistent.

Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Nicolin Chen <nicolinc@nvidia.com>
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
drivers/iommu/amd/amd_iommu.h
drivers/iommu/amd/iommu.c

index aa29afe96e90e1310e2b8f31e0ceca90203c8e0e..00fc9c6073de27fd66e9a9834d378badc87eddca 100644 (file)
@@ -197,9 +197,22 @@ void amd_iommu_update_dte(struct amd_iommu *iommu,
 static inline void
 amd_iommu_make_clear_dte(struct iommu_dev_data *dev_data, struct dev_table_entry *new)
 {
+       struct dev_table_entry *initial_dte;
+       struct amd_iommu *iommu = get_amd_iommu_from_dev(dev_data->dev);
+
        /* All existing DTE must have V bit set */
        new->data128[0] = DTE_FLAG_V;
        new->data128[1] = 0;
+
+       /*
+        * Restore cached persistent DTE bits, which can be set by information
+        * in IVRS table. See set_dev_entry_from_acpi().
+        */
+       initial_dte = amd_iommu_get_ivhd_dte_flags(iommu->pci_seg->id, dev_data->devid);
+       if (initial_dte) {
+               new->data128[0] |= initial_dte->data128[0];
+               new->data128[1] |= initial_dte->data128[1];
+       }
 }
 
 /* NESTED */
index 9d2c88aa5c5f6342ac73d36ac4978c92e75fef44..debc33cd4bea05ea18612544afc135aa15546ffc 100644 (file)
@@ -2110,7 +2110,6 @@ static void set_dte_entry(struct amd_iommu *iommu,
 {
        u16 domid;
        u32 old_domid;
-       struct dev_table_entry *initial_dte;
        struct dev_table_entry new = {};
        struct protection_domain *domain = dev_data->domain;
        struct gcr3_tbl_info *gcr3_info = &dev_data->gcr3_info;
@@ -2168,16 +2167,6 @@ static void set_dte_entry(struct amd_iommu *iommu,
        old_domid = READ_ONCE(dte->data[1]) & DTE_DOMID_MASK;
        new.data[1] |= domid;
 
-       /*
-        * Restore cached persistent DTE bits, which can be set by information
-        * in IVRS table. See set_dev_entry_from_acpi().
-        */
-       initial_dte = amd_iommu_get_ivhd_dte_flags(iommu->pci_seg->id, dev_data->devid);
-       if (initial_dte) {
-               new.data128[0] |= initial_dte->data128[0];
-               new.data128[1] |= initial_dte->data128[1];
-       }
-
        set_dte_gcr3_table(iommu, dev_data, &new);
 
        amd_iommu_update_dte(iommu, dev_data, &new);