]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu/amd: Introduce per device DTE update function
authorVasant Hegde <vasant.hegde@amd.com>
Thu, 18 Apr 2024 10:33:47 +0000 (10:33 +0000)
committerJoerg Roedel <jroedel@suse.de>
Fri, 26 Apr 2024 10:15:56 +0000 (12:15 +0200)
Consolidate per device update and flush logic into separate function.
Also make it as global function as it will be used in subsequent series
to update the DTE.

Signed-off-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Link: https://lore.kernel.org/r/20240418103400.6229-3-vasant.hegde@amd.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/amd/amd_iommu.h
drivers/iommu/amd/iommu.c

index d77660551f2a6e7487259961371377cd757974ac..98aa3ce8473f8119e5cedb9666e5139608de34d7 100644 (file)
@@ -56,6 +56,7 @@ int amd_iommu_clear_gcr3(struct iommu_dev_data *dev_data, ioasid_t pasid);
 void amd_iommu_flush_all_caches(struct amd_iommu *iommu);
 void amd_iommu_update_and_flush_device_table(struct protection_domain *domain);
 void amd_iommu_domain_update(struct protection_domain *domain);
+void amd_iommu_dev_update_dte(struct iommu_dev_data *dev_data, bool set);
 void amd_iommu_domain_flush_complete(struct protection_domain *domain);
 void amd_iommu_domain_flush_pages(struct protection_domain *domain,
                                  u64 address, size_t size);
index e692217fcb28011478139d7dc146d74dcd9456e8..394623abbaa487368f61b7709a955f7bde2c01c3 100644 (file)
@@ -2002,6 +2002,21 @@ static void clear_dte_entry(struct amd_iommu *iommu, u16 devid)
        amd_iommu_apply_erratum_63(iommu, devid);
 }
 
+/* Update and flush DTE for the given device */
+void amd_iommu_dev_update_dte(struct iommu_dev_data *dev_data, bool set)
+{
+       struct amd_iommu *iommu = get_amd_iommu_from_dev(dev_data->dev);
+
+       if (set)
+               set_dte_entry(iommu, dev_data);
+       else
+               clear_dte_entry(iommu, dev_data->devid);
+
+       clone_aliases(iommu, dev_data->dev);
+       device_flush_dte(dev_data);
+       iommu_completion_wait(iommu);
+}
+
 static int do_attach(struct iommu_dev_data *dev_data,
                     struct protection_domain *domain)
 {
@@ -2036,10 +2051,7 @@ static int do_attach(struct iommu_dev_data *dev_data,
        }
 
        /* Update device table */
-       set_dte_entry(iommu, dev_data);
-       clone_aliases(iommu, dev_data->dev);
-
-       device_flush_dte(dev_data);
+       amd_iommu_dev_update_dte(dev_data, true);
 
        return ret;
 }
@@ -2058,11 +2070,9 @@ static void do_detach(struct iommu_dev_data *dev_data)
        /* Update data structures */
        dev_data->domain = NULL;
        list_del(&dev_data->list);
-       clear_dte_entry(iommu, dev_data->devid);
-       clone_aliases(iommu, dev_data->dev);
 
-       /* Flush the DTE entry */
-       device_flush_dte(dev_data);
+       /* Clear DTE and flush the entry */
+       amd_iommu_dev_update_dte(dev_data, false);
 
        /* Flush IOTLB and wait for the flushes to finish */
        amd_iommu_domain_flush_all(domain);