Hi,

On 5/4/19 9:23 PM, Tom Murphy wrote:
static int intel_iommu_add_device(struct device *dev)
  {
+       struct dmar_domain *dmar_domain;
+       struct iommu_domain *domain;
        struct intel_iommu *iommu;
        struct iommu_group *group;
-       struct iommu_domain *domain;
+       dma_addr_t base;
        u8 bus, devfn;
iommu = device_to_iommu(dev, &bus, &devfn);
@@ -4871,9 +4514,12 @@ static int intel_iommu_add_device(struct device *dev)
        if (IS_ERR(group))
                return PTR_ERR(group);
+ base = IOVA_START_PFN << VTD_PAGE_SHIFT;
        domain = iommu_get_domain_for_dev(dev);
+       dmar_domain = to_dmar_domain(domain);
        if (domain->type == IOMMU_DOMAIN_DMA)
-               dev->dma_ops = &intel_dma_ops;
+               iommu_setup_dma_ops(dev, base,
+                               __DOMAIN_MAX_ADDR(dmar_domain->gaw) - base);

I didn't find the implementation of iommu_setup_dma_ops() in this
series. Will the iova resource be initialized in this function?

If so, will this block iommu_group_create_direct_mappings() which
reserves and maps the reserved iova ranges.

iommu_group_put(group);
        return 0;
@@ -5002,19 +4648,6 @@ int intel_iommu_enable_pasid(struct intel_iommu *iommu, 
struct intel_svm_dev *sd
        return ret;
  }
-static void intel_iommu_apply_resv_region(struct device *dev,
-                                         struct iommu_domain *domain,
-                                         struct iommu_resv_region *region)
-{
-       struct dmar_domain *dmar_domain = to_dmar_domain(domain);
-       unsigned long start, end;
-
-       start = IOVA_PFN(region->start);
-       end   = IOVA_PFN(region->start + region->length - 1);
-
-       WARN_ON_ONCE(!reserve_iova(&dmar_domain->iovad, start, end));
-}
-
  struct intel_iommu *intel_svm_device_to_iommu(struct device *dev)
  {
        struct intel_iommu *iommu;
@@ -5050,13 +4683,13 @@ const struct iommu_ops intel_iommu_ops = {
        .detach_dev             = intel_iommu_detach_device,
        .map                    = intel_iommu_map,
        .unmap                  = intel_iommu_unmap,
+       .flush_iotlb_all        = iommu_flush_iova,
        .flush_iotlb_range      = intel_iommu_flush_iotlb_range,
        .iova_to_phys           = intel_iommu_iova_to_phys,
        .add_device             = intel_iommu_add_device,
        .remove_device          = intel_iommu_remove_device,
        .get_resv_regions       = intel_iommu_get_resv_regions,
        .put_resv_regions       = intel_iommu_put_resv_regions,
-       .apply_resv_region      = intel_iommu_apply_resv_region,

With this removed, how will iommu_group_create_direct_mappings() work?

Best regards,
Lu Baolu
_______________________________________________
iommu mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to