|
@@ -960,6 +960,19 @@ static void __iommu_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void arch_teardown_dma_ops(struct device *dev)
|
|
|
|
|
+{
|
|
|
|
|
+ struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
|
|
|
|
|
+
|
|
|
|
|
+ if (domain) {
|
|
|
|
|
+ iommu_detach_device(domain, dev);
|
|
|
|
|
+ if (domain->type & __IOMMU_DOMAIN_FAKE_DEFAULT)
|
|
|
|
|
+ iommu_domain_free(domain);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ dev->archdata.dma_ops = NULL;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
#else
|
|
#else
|
|
|
|
|
|
|
|
static void __iommu_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
|
|
static void __iommu_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
|
|
@@ -968,3 +981,12 @@ static void __iommu_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
|
|
|
|
|
|
|
|
#endif /* CONFIG_IOMMU_DMA */
|
|
#endif /* CONFIG_IOMMU_DMA */
|
|
|
|
|
|
|
|
|
|
+void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
|
|
|
|
|
+ struct iommu_ops *iommu, bool coherent)
|
|
|
|
|
+{
|
|
|
|
|
+ if (!acpi_disabled && !dev->archdata.dma_ops)
|
|
|
|
|
+ dev->archdata.dma_ops = dma_ops;
|
|
|
|
|
+
|
|
|
|
|
+ dev->archdata.dma_coherent = coherent;
|
|
|
|
|
+ __iommu_setup_dma_ops(dev, dma_base, size, iommu);
|
|
|
|
|
+}
|