Based on previous modifications in the patchset, A mtk_iommu_data
structure represent a iommu, we will add mtk_iommu_data to mtk_iommu_domain
to show the iommu which mtk_iommu_domain belongs to, so we can get
mtk_iommu_data by mtk_iommu_domain, don't use to "mtk_iommu_get_m4u_data"
any more.

Besides, there is a small SW adjustment, we will move alloc iommu_group
into "create_iommu_group"

Signed-off-by: Chao Hao <chao....@mediatek.com>
---
 drivers/iommu/mtk_iommu.c | 74 +++++++++++++++++++--------------------
 1 file changed, 37 insertions(+), 37 deletions(-)

diff --git a/drivers/iommu/mtk_iommu.c b/drivers/iommu/mtk_iommu.c
index bfb1831afae9..9a7f2a388e3e 100644
--- a/drivers/iommu/mtk_iommu.c
+++ b/drivers/iommu/mtk_iommu.c
@@ -115,6 +115,7 @@ struct mtk_iommu_domain {
        u32                             id;
        struct iommu_domain             domain;
        struct iommu_group              *group;
+       struct mtk_iommu_data           *data;
        struct list_head                list;
 };
 
@@ -162,23 +163,6 @@ static LIST_HEAD(m4ulist); /* List all the M4U HWs */
 
 #define for_each_m4u(data)     list_for_each_entry(data, &m4ulist, list)
 
-/*
- * There may be 1 or 2 M4U HWs, But we always expect they are in the same 
domain
- * for the performance.
- *
- * Here always return the mtk_iommu_data of the first probed M4U where the
- * iommu domain information is recorded.
- */
-static struct mtk_iommu_data *mtk_iommu_get_m4u_data(void)
-{
-       struct mtk_iommu_data *data;
-
-       for_each_m4u(data)
-               return data;
-
-       return NULL;
-}
-
 static u32 get_domain_id(struct mtk_iommu_data *data, u32 portid)
 {
        u32 dom_id = 0;
@@ -397,6 +381,27 @@ static void mtk_iommu_config(struct mtk_iommu_data *data,
        }
 }
 
+static struct iommu_group *create_iommu_group(struct mtk_iommu_data *data,
+                                             struct device *dev)
+{
+       struct mtk_iommu_pgtable *pgtable = mtk_iommu_get_pgtable();
+
+       /* Prepare for allocate mtk_iommu_domain */
+       data->m4u_group = mtk_iommu_get_group(dev);
+       if (!data->m4u_group) {
+               data->m4u_group = iommu_group_alloc();
+               if (IS_ERR(data->m4u_group))
+                       dev_err(dev, "Failed to allocate M4U IOMMU group\n");
+       } else {
+               iommu_group_ref_get(data->m4u_group);
+       }
+
+       /* save the latest init device */
+       pgtable->init_dev = dev;
+
+       return data->m4u_group;
+}
+
 static struct mtk_iommu_pgtable *create_pgtable(struct mtk_iommu_data *data)
 {
        struct mtk_iommu_pgtable *pgtable;
@@ -462,7 +467,7 @@ static int mtk_iommu_attach_pgtable(struct mtk_iommu_data 
*data,
 static struct iommu_domain *mtk_iommu_domain_alloc(unsigned type)
 {
        struct mtk_iommu_pgtable *pgtable = mtk_iommu_get_pgtable();
-       struct mtk_iommu_data *data = mtk_iommu_get_m4u_data();
+       struct mtk_iommu_data *data;
        struct mtk_iommu_domain *dom;
        struct device *dev;
 
@@ -471,6 +476,7 @@ static struct iommu_domain *mtk_iommu_domain_alloc(unsigned 
type)
 
        if (pgtable) {
                dev = pgtable->init_dev;
+               data = dev_iommu_fwspec_get(dev)->iommu_priv;
                if (!data->m4u_group) {
                        pr_err("%s, find m4u_group failed\n", __func__);
                        return NULL;
@@ -491,6 +497,7 @@ static struct iommu_domain *mtk_iommu_domain_alloc(unsigned 
type)
        if (dom->id >= data->plat_data->dom_cnt)
                goto  put_dma_cookie;
 
+       dom->data = data;
        dom->group = data->m4u_group;
        /* Update our support page sizes bitmap */
        dom->domain.pgsize_bitmap = pgtable->cfg.pgsize_bitmap;
@@ -548,7 +555,8 @@ static int mtk_iommu_map(struct iommu_domain *domain, 
unsigned long iova,
                         phys_addr_t paddr, size_t size, int prot, gfp_t gfp)
 {
        struct mtk_iommu_pgtable *pgtable = mtk_iommu_get_pgtable();
-       struct mtk_iommu_data *data = mtk_iommu_get_m4u_data();
+       struct mtk_iommu_domain *dom = to_mtk_domain(domain);
+       struct mtk_iommu_data *data = dom->data;
 
        /* The "4GB mode" M4U physically can not use the lower remap of Dram. */
        if (data->enable_4GB)
@@ -569,27 +577,30 @@ static size_t mtk_iommu_unmap(struct iommu_domain *domain,
 
 static void mtk_iommu_flush_iotlb_all(struct iommu_domain *domain)
 {
-       mtk_iommu_tlb_flush_all(mtk_iommu_get_m4u_data());
+       struct mtk_iommu_domain *dom = to_mtk_domain(domain);
+
+       mtk_iommu_tlb_flush_all(dom->data);
 }
 
 static void mtk_iommu_iotlb_sync(struct iommu_domain *domain,
                                 struct iommu_iotlb_gather *gather)
 {
-       struct mtk_iommu_data *data = mtk_iommu_get_m4u_data();
+       struct mtk_iommu_domain *dom = to_mtk_domain(domain);
        size_t length = gather->end - gather->start;
 
        if (gather->start == ULONG_MAX)
                return;
 
        mtk_iommu_tlb_flush_range_sync(gather->start, length, gather->pgsize,
-                                      data);
+                                      dom->data);
 }
 
 static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain,
                                          dma_addr_t iova)
 {
        struct mtk_iommu_pgtable *pgtable = mtk_iommu_get_pgtable();
-       struct mtk_iommu_data *data = mtk_iommu_get_m4u_data();
+       struct mtk_iommu_domain *dom = to_mtk_domain(domain);
+       struct mtk_iommu_data *data = dom->data;
        phys_addr_t pa;
 
        pa = pgtable->iop->iova_to_phys(pgtable->iop, iova);
@@ -636,7 +647,7 @@ static void mtk_iommu_remove_device(struct device *dev)
 
 static struct iommu_group *mtk_iommu_device_group(struct device *dev)
 {
-       struct mtk_iommu_data *data = mtk_iommu_get_m4u_data();
+       struct mtk_iommu_data *data = dev->iommu_fwspec->iommu_priv;
        struct mtk_iommu_pgtable *pgtable;
        int ret = 0;
 
@@ -652,20 +663,9 @@ static struct iommu_group *mtk_iommu_device_group(struct 
device *dev)
                }
        }
 
-       /* All the client devices are in the same m4u iommu-group */
-       data->m4u_group = mtk_iommu_get_group(dev);
-       if (!data->m4u_group) {
-               data->m4u_group = iommu_group_alloc();
-               if (IS_ERR(data->m4u_group))
-                       dev_err(dev, "Failed to allocate M4U IOMMU group\n");
-       } else {
-               iommu_group_ref_get(data->m4u_group);
-       }
+       dev_info(data->dev, "%s, init data:%d\n", __func__, data->m4u_id);
 
-       /* save the latest init device */
-       pgtable->init_dev = dev;
-
-       return data->m4u_group;
+       return create_iommu_group(data, dev);
 }
 
 static int mtk_iommu_of_xlate(struct device *dev, struct of_phandle_args *args)
-- 
2.18.0
_______________________________________________
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

Reply via email to