On 7/28/21 11:58 PM, Robin Murphy wrote:
Now that everyone has converged on iommu-dma for IOMMU_DOMAIN_DMA
support, we can abandon the notion of drivers being responsible for the
cookie type, and consolidate all the management into the core code.

CC: Marek Szyprowski <[email protected]>
CC: Yoshihiro Shimoda <[email protected]>
CC: Geert Uytterhoeven <[email protected]>
CC: Yong Wu <[email protected]>
CC: Heiko Stuebner <[email protected]>
CC: Chunyan Zhang <[email protected]>
CC: Chunyan Zhang <[email protected]>
CC: Maxime Ripard <[email protected]>
CC: Jean-Philippe Brucker <[email protected]>
Signed-off-by: Robin Murphy <[email protected]>
---
  drivers/iommu/iommu.c | 7 +++++++
  include/linux/iommu.h | 3 ++-
  2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/drivers/iommu/iommu.c b/drivers/iommu/iommu.c
index f2cda9950bd5..ea5a9ea8d431 100644
--- a/drivers/iommu/iommu.c
+++ b/drivers/iommu/iommu.c
@@ -7,6 +7,7 @@
  #define pr_fmt(fmt)    "iommu: " fmt
#include <linux/device.h>
+#include <linux/dma-iommu.h>
  #include <linux/kernel.h>
  #include <linux/bits.h>
  #include <linux/bug.h>
@@ -1946,6 +1947,11 @@ static struct iommu_domain *__iommu_domain_alloc(struct 
bus_type *bus,
        /* Assume all sizes by default; the driver may override this later */
        domain->pgsize_bitmap  = bus->iommu_ops->pgsize_bitmap;
+ /* Temporarily ignore -EEXIST while drivers still get their own cookies */
+       if (type == IOMMU_DOMAIN_DMA && iommu_get_dma_cookie(domain) == 
-ENOMEM) {
+               iommu_domain_free(domain);
+               domain = NULL;
+       }
        return domain;
  }
@@ -1957,6 +1963,7 @@ EXPORT_SYMBOL_GPL(iommu_domain_alloc); void iommu_domain_free(struct iommu_domain *domain)
  {
+       iommu_put_dma_cookie(domain);
        domain->ops->domain_free(domain);
  }
  EXPORT_SYMBOL_GPL(iommu_domain_free);
diff --git a/include/linux/iommu.h b/include/linux/iommu.h
index 4997c78e2670..141779d76035 100644
--- a/include/linux/iommu.h
+++ b/include/linux/iommu.h
@@ -40,6 +40,7 @@ struct iommu_domain;
  struct notifier_block;
  struct iommu_sva;
  struct iommu_fault_event;
+struct iommu_dma_cookie;
/* iommu fault flags */
  #define IOMMU_FAULT_READ      0x0
@@ -86,7 +87,7 @@ struct iommu_domain {
        iommu_fault_handler_t handler;
        void *handler_token;
        struct iommu_domain_geometry geometry;
-       void *iova_cookie;
+       struct iommu_dma_cookie *iova_cookie;
  };
enum iommu_cap {


Reviewed-by: Lu Baolu <[email protected]>

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

Reply via email to