This new call-back will be used to check if the domain attach need be
deferred for now. If yes, the domain attach/detach will return directly.

Suggested-by: Joerg Roedel <[email protected]>
Signed-off-by: Baoquan He <[email protected]>
---
 drivers/iommu/iommu.c | 8 ++++++++
 include/linux/iommu.h | 1 +
 2 files changed, 9 insertions(+)

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index dbe7f65..e5cb9b1 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -1096,6 +1096,10 @@ static int __iommu_attach_device(struct iommu_domain 
*domain,
                                 struct device *dev)
 {
        int ret;
+       if ((domain->ops->is_attach_deferred != NULL) &&
+           domain->ops->is_attach_deferred(domain, dev))
+               return 0;
+
        if (unlikely(domain->ops->attach_dev == NULL))
                return -ENODEV;
 
@@ -1137,6 +1141,10 @@ EXPORT_SYMBOL_GPL(iommu_attach_device);
 static void __iommu_detach_device(struct iommu_domain *domain,
                                  struct device *dev)
 {
+       if ((domain->ops->is_attach_deferred != NULL) &&
+           domain->ops->is_attach_deferred(domain, dev))
+               return;
+
        if (unlikely(domain->ops->detach_dev == NULL))
                return;
 
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 0ff5111..5aa3742 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -200,6 +200,7 @@ struct iommu_ops {
        u32 (*domain_get_windows)(struct iommu_domain *domain);
 
        int (*of_xlate)(struct device *dev, struct of_phandle_args *args);
+       bool (*is_attach_deferred)(struct iommu_domain *domain, struct device 
*dev);
 
        unsigned long pgsize_bitmap;
 };
-- 
2.5.5

Reply via email to