]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
iommu/amd: Make the blocked domain support PASID
authorYi Liu <yi.l.liu@intel.com>
Wed, 4 Dec 2024 12:29:27 +0000 (04:29 -0800)
committerJoerg Roedel <jroedel@suse.de>
Wed, 18 Dec 2024 08:39:37 +0000 (09:39 +0100)
The blocked domain can be extended to park PASID of a device to be the
DMA blocking state. By this the remove_dev_pasid() op is dropped.

Remove PASID from old domain and device GCR3 table. No need to attach
PASID to the blocked domain as clearing PASID from GCR3 table will make
sure all DMAs for that PASID are blocked.

Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Vasant Hegde <vasant.hegde@amd.com>
Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Link: https://lore.kernel.org/r/20241204122928.11987-7-yi.l.liu@intel.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/amd/iommu.c

index 16f40b8000d7981a8a9ed066386084593576f267..d6590cdd6d15e2d00bb918e2572c8563e0ba1517 100644 (file)
@@ -2475,10 +2475,19 @@ static int blocked_domain_attach_device(struct iommu_domain *domain,
        return 0;
 }
 
+static int blocked_domain_set_dev_pasid(struct iommu_domain *domain,
+                                       struct device *dev, ioasid_t pasid,
+                                       struct iommu_domain *old)
+{
+       amd_iommu_remove_dev_pasid(dev, pasid, old);
+       return 0;
+}
+
 static struct iommu_domain blocked_domain = {
        .type = IOMMU_DOMAIN_BLOCKED,
        .ops = &(const struct iommu_domain_ops) {
                .attach_dev     = blocked_domain_attach_device,
+               .set_dev_pasid  = blocked_domain_set_dev_pasid,
        }
 };
 
@@ -2901,7 +2910,6 @@ const struct iommu_ops amd_iommu_ops = {
        .def_domain_type = amd_iommu_def_domain_type,
        .dev_enable_feat = amd_iommu_dev_enable_feature,
        .dev_disable_feat = amd_iommu_dev_disable_feature,
-       .remove_dev_pasid = amd_iommu_remove_dev_pasid,
        .page_response = amd_iommu_page_response,
        .default_domain_ops = &(const struct iommu_domain_ops) {
                .attach_dev     = amd_iommu_attach_device,