]> git.ipfire.org Git - thirdparty/linux.git/blobdiff - drivers/iommu/intel/iommu.c
Merge tag 'iommu-updates-v6.7' of git://git.kernel.org/pub/scm/linux/kernel/git/joro...
[thirdparty/linux.git] / drivers / iommu / intel / iommu.c
index d1037280abf7a2bc4fd51d5e6de5ce0932c66424..3531b956556c7df268ee32a5053a755d5ce0630b 100644 (file)
@@ -4016,9 +4016,9 @@ static int blocking_domain_attach_dev(struct iommu_domain *domain,
 }
 
 static struct iommu_domain blocking_domain = {
+       .type = IOMMU_DOMAIN_BLOCKED,
        .ops = &(const struct iommu_domain_ops) {
                .attach_dev     = blocking_domain_attach_dev,
-               .free           = intel_iommu_domain_free
        }
 };
 
@@ -4028,8 +4028,6 @@ static struct iommu_domain *intel_iommu_domain_alloc(unsigned type)
        struct iommu_domain *domain;
 
        switch (type) {
-       case IOMMU_DOMAIN_BLOCKED:
-               return &blocking_domain;
        case IOMMU_DOMAIN_DMA:
        case IOMMU_DOMAIN_UNMANAGED:
                dmar_domain = alloc_domain(type);
@@ -4111,7 +4109,7 @@ intel_iommu_domain_alloc_user(struct device *dev, u32 flags,
 
 static void intel_iommu_domain_free(struct iommu_domain *domain)
 {
-       if (domain != &si_domain->domain && domain != &blocking_domain)
+       if (domain != &si_domain->domain)
                domain_exit(to_dmar_domain(domain));
 }
 
@@ -4465,6 +4463,8 @@ static struct iommu_device *intel_iommu_probe_device(struct device *dev)
                }
        }
 
+       intel_iommu_debugfs_create_dev(info);
+
        return &iommu->iommu;
 }
 
@@ -4474,6 +4474,7 @@ static void intel_iommu_release_device(struct device *dev)
 
        dmar_remove_one_dev_info(dev);
        intel_pasid_free_table(dev);
+       intel_iommu_debugfs_remove_dev(info);
        dev_iommu_priv_set(dev, NULL);
        kfree(info);
        set_dma_ops(dev, NULL);
@@ -4718,8 +4719,8 @@ static bool risky_device(struct pci_dev *pdev)
        return false;
 }
 
-static void intel_iommu_iotlb_sync_map(struct iommu_domain *domain,
-                                      unsigned long iova, size_t size)
+static int intel_iommu_iotlb_sync_map(struct iommu_domain *domain,
+                                     unsigned long iova, size_t size)
 {
        struct dmar_domain *dmar_domain = to_dmar_domain(domain);
        unsigned long pages = aligned_nrpages(iova, size);
@@ -4729,6 +4730,7 @@ static void intel_iommu_iotlb_sync_map(struct iommu_domain *domain,
 
        xa_for_each(&dmar_domain->iommu_array, i, info)
                __mapping_notify_one(info->iommu, dmar_domain, pfn, pages);
+       return 0;
 }
 
 static void intel_iommu_remove_dev_pasid(struct device *dev, ioasid_t pasid)
@@ -4766,6 +4768,7 @@ static void intel_iommu_remove_dev_pasid(struct device *dev, ioasid_t pasid)
        spin_unlock_irqrestore(&dmar_domain->lock, flags);
 
        domain_detach_iommu(dmar_domain, iommu);
+       intel_iommu_debugfs_remove_dev_pasid(dev_pasid);
        kfree(dev_pasid);
 out_tear_down:
        intel_pasid_tear_down_entry(iommu, dev, pasid, false);
@@ -4821,6 +4824,9 @@ static int intel_iommu_set_dev_pasid(struct iommu_domain *domain,
        list_add(&dev_pasid->link_domain, &dmar_domain->dev_pasids);
        spin_unlock_irqrestore(&dmar_domain->lock, flags);
 
+       if (domain->type & __IOMMU_DOMAIN_PAGING)
+               intel_iommu_debugfs_create_dev_pasid(dev_pasid);
+
        return 0;
 out_detach_iommu:
        domain_detach_iommu(dmar_domain, iommu);
@@ -4925,6 +4931,7 @@ const struct iommu_dirty_ops intel_dirty_ops = {
 };
 
 const struct iommu_ops intel_iommu_ops = {
+       .blocked_domain         = &blocking_domain,
        .capable                = intel_iommu_capable,
        .hw_info                = intel_iommu_hw_info,
        .domain_alloc           = intel_iommu_domain_alloc,