]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
qcom: iommu: Make use of domain_alloc and domain_free
authorNicolas Dechesne <nicolas.dechesne@linaro.org>
Fri, 10 Jul 2015 10:29:35 +0000 (12:29 +0200)
committerSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Mon, 11 Jan 2016 09:54:31 +0000 (09:54 +0000)
Implement domain_alloc and domain_free iommu-ops as a
replacement for domain_init/domain_destroy.

Signed-off-by: Nicolas Dechesne <nicolas.dechesne@linaro.org>
drivers/iommu/qcom/msm_iommu-v1.c
drivers/iommu/qcom/msm_iommu_pagetable.c
drivers/iommu/qcom/msm_iommu_priv.h
drivers/iommu/qcom/msm_iommu_sec.c

index a3559314ef8354def7b9e3996bf5fc1dee8341e8..82c7f2f16658b127d6bd2c2338909adb7debd627 100644 (file)
@@ -311,7 +311,7 @@ static void __sync_tlb(struct msm_iommu_drvdata *iommu_drvdata, int ctx,
 #ifdef CONFIG_MSM_IOMMU_TLBINVAL_ON_MAP
 static int __flush_iotlb_va(struct iommu_domain *domain, unsigned int va)
 {
-       struct msm_iommu_priv *priv = domain->priv;
+       struct msm_iommu_priv *priv = to_msm_priv(domain);
        struct msm_iommu_drvdata *iommu_drvdata;
        struct msm_iommu_ctx_drvdata *ctx_drvdata;
        int ret = 0;
@@ -340,7 +340,7 @@ fail:
 
 static int __flush_iotlb(struct iommu_domain *domain)
 {
-       struct msm_iommu_priv *priv = domain->priv;
+       struct msm_iommu_priv *priv = to_msm_priv(domain);
        struct msm_iommu_drvdata *iommu_drvdata;
        struct msm_iommu_ctx_drvdata *ctx_drvdata;
        int ret = 0;
@@ -711,10 +711,14 @@ static void __program_context(struct msm_iommu_drvdata *iommu_drvdata,
 #define INITIAL_REDIRECT_VAL   0
 #endif
 
-static int msm_iommu_domain_init(struct iommu_domain *domain)
+static struct iommu_domain * msm_iommu_domain_alloc(unsigned type)
 {
        struct msm_iommu_priv *priv;
        int ret = -ENOMEM;
+       struct iommu_domain *domain;
+
+       if (type != IOMMU_DOMAIN_UNMANAGED)
+               return NULL;
 
        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv)
@@ -728,22 +732,21 @@ static int msm_iommu_domain_init(struct iommu_domain *domain)
        if (ret)
                goto fail_nomem;
 
-       domain->priv = priv;
+       domain = &priv->domain;
 
-       return 0;
+       return domain;
 
 fail_nomem:
        kfree(priv);
-       return ret;
+       return 0;
 }
 
-static void msm_iommu_domain_destroy(struct iommu_domain *domain)
+static void msm_iommu_domain_free(struct iommu_domain *domain)
 {
        struct msm_iommu_priv *priv;
 
        mutex_lock(&msm_iommu_lock);
-       priv = domain->priv;
-       domain->priv = NULL;
+       priv = to_msm_priv(domain);
 
        if (priv)
                msm_iommu_pagetable_free(&priv->pt);
@@ -764,7 +767,7 @@ static int msm_iommu_attach_dev(struct iommu_domain *domain, struct device *dev)
 
        mutex_lock(&msm_iommu_lock);
 
-       priv = domain->priv;
+       priv = to_msm_priv(domain);
        if (!priv || !dev) {
                ret = -EINVAL;
                goto unlock;
@@ -873,7 +876,7 @@ static void msm_iommu_detach_dev(struct iommu_domain *domain,
        msm_iommu_detached(dev->parent);
 
        mutex_lock(&msm_iommu_lock);
-       priv = domain->priv;
+       priv = to_msm_priv(domain);
        if (!priv)
                goto unlock;
 
@@ -934,7 +937,7 @@ static int msm_iommu_map(struct iommu_domain *domain, unsigned long va,
 
        mutex_lock(&msm_iommu_lock);
 
-       priv = domain->priv;
+       priv = to_msm_priv(domain);
        if (!priv) {
                ret = -EINVAL;
                goto fail;
@@ -961,7 +964,7 @@ static size_t msm_iommu_unmap(struct iommu_domain *domain, unsigned long va,
 
        mutex_lock(&msm_iommu_lock);
 
-       priv = domain->priv;
+       priv = to_msm_priv(domain);
        if (!priv)
                goto fail;
 
@@ -991,7 +994,7 @@ static size_t msm_iommu_map_sg(struct iommu_domain *domain, unsigned long iova,
 
        mutex_lock(&msm_iommu_lock);
 
-       priv = domain->priv;
+       priv = to_msm_priv(domain);
        if (!priv) {
                ret = -EINVAL;
                goto fail;
@@ -1020,7 +1023,7 @@ static int msm_iommu_unmap_range(struct iommu_domain *domain, unsigned int va,
 
        mutex_lock(&msm_iommu_lock);
 
-       priv = domain->priv;
+       priv = to_msm_priv(domain);
        msm_iommu_pagetable_unmap_range(&priv->pt, va, len);
 
        __flush_iotlb(domain);
@@ -1070,7 +1073,7 @@ static phys_addr_t msm_iommu_iova_to_phys(struct iommu_domain *domain,
 
        mutex_lock(&msm_iommu_lock);
 
-       priv = domain->priv;
+       priv = to_msm_priv(domain);
        if (list_empty(&priv->list_attached))
                goto fail;
 
@@ -1404,7 +1407,7 @@ fail:
 
 static phys_addr_t msm_iommu_get_pt_base_addr(struct iommu_domain *domain)
 {
-       struct msm_iommu_priv *priv = domain->priv;
+       struct msm_iommu_priv *priv = to_msm_priv(domain);
 
        return __pa(priv->pt.fl_table);
 }
@@ -1445,7 +1448,7 @@ static void __do_set_redirect(struct iommu_domain *domain, void *data)
        int *no_redirect = data;
 
        mutex_lock(&msm_iommu_lock);
-       priv = domain->priv;
+       priv = to_msm_priv(domain);
        priv->pt.redirect = !(*no_redirect);
        mutex_unlock(&msm_iommu_lock);
 }
@@ -1456,7 +1459,7 @@ static void __do_get_redirect(struct iommu_domain *domain, void *data)
        int *no_redirect = data;
 
        mutex_lock(&msm_iommu_lock);
-       priv = domain->priv;
+       priv = to_msm_priv(domain);
        *no_redirect = !priv->pt.redirect;
        mutex_unlock(&msm_iommu_lock);
 }
@@ -1499,8 +1502,8 @@ static int msm_iommu_domain_get_attr(struct iommu_domain *domain,
 }
 
 static struct iommu_ops msm_iommu_ops = {
-       .domain_init = msm_iommu_domain_init,
-       .domain_destroy = msm_iommu_domain_destroy,
+       .domain_alloc = msm_iommu_domain_alloc,
+       .domain_free = msm_iommu_domain_free,
        .attach_dev = msm_iommu_attach_dev,
        .detach_dev = msm_iommu_detach_dev,
        .map = msm_iommu_map,
index b4e8c9a5d7773e3bbbb5db675185e812f7b1e7b0..1f11abb9db7bfe08ec6de148f3b47ceb6b692f53 100644 (file)
@@ -563,7 +563,7 @@ void msm_iommu_pagetable_unmap_range(struct msm_iommu_pt *pt, unsigned int va,
 phys_addr_t msm_iommu_iova_to_phys_soft(struct iommu_domain *domain,
                                          phys_addr_t va)
 {
-       struct msm_iommu_priv *priv = domain->priv;
+       struct msm_iommu_priv *priv = to_msm_priv(domain);
        struct msm_iommu_pt *pt = &priv->pt;
        u32 *fl_pte;
        u32 fl_offset;
index 8aeb67fd6544e070dcb428a2d69dd1a6ee5ef087..4de0d7ef19e632dba4447cf37337e916babfbd6d 100644 (file)
@@ -59,7 +59,13 @@ struct msm_iommu_pt {
 struct msm_iommu_priv {
        struct msm_iommu_pt pt;
        struct list_head list_attached;
+       struct iommu_domain domain;
        const char *client_name;
 };
 
+static inline struct msm_iommu_priv *to_msm_priv(struct iommu_domain *dom)
+{
+       return container_of(dom, struct msm_iommu_priv, domain);
+}
+
 #endif
index e83ba970ca2b0601128aacb8b764eebd112c0b7b..33a1e988ae1e174c832580bdad9f228cf0d99b20 100644 (file)
@@ -577,26 +577,29 @@ static int msm_iommu_sec_ptbl_unmap(struct msm_iommu_drvdata *iommu_drvdata,
                                           IOMMU_TLBINVAL_FLAG);
 }
 
-static int msm_iommu_domain_init(struct iommu_domain *domain)
+static struct iommu_domain *  msm_iommu_domain_alloc(unsigned type)
 {
        struct msm_iommu_priv *priv;
+       struct iommu_domain *domain;
+
+       if (type != IOMMU_DOMAIN_UNMANAGED)
+               return NULL;
 
        priv = kzalloc(sizeof(*priv), GFP_KERNEL);
        if (!priv)
-               return -ENOMEM;
+               return NULL;
 
        INIT_LIST_HEAD(&priv->list_attached);
-       domain->priv = priv;
-       return 0;
+       domain = &priv->domain;
+       return domain;
 }
 
-static void msm_iommu_domain_destroy(struct iommu_domain *domain)
+static void msm_iommu_domain_free(struct iommu_domain *domain)
 {
        struct msm_iommu_priv *priv;
 
        iommu_access_ops->iommu_lock_acquire(0);
-       priv = domain->priv;
-       domain->priv = NULL;
+       priv = to_msm_priv(domain);
 
        kfree(priv);
        iommu_access_ops->iommu_lock_release(0);
@@ -612,7 +615,7 @@ static int msm_iommu_attach_dev(struct iommu_domain *domain, struct device *dev)
 
        iommu_access_ops->iommu_lock_acquire(0);
 
-       priv = domain->priv;
+       priv = to_msm_priv(domain);
        if (!priv || !dev) {
                ret = -EINVAL;
                goto fail;
@@ -707,7 +710,7 @@ static int get_drvdata(struct iommu_domain *domain,
                        struct msm_iommu_drvdata **iommu_drvdata,
                        struct msm_iommu_ctx_drvdata **ctx_drvdata)
 {
-       struct msm_iommu_priv *priv = domain->priv;
+       struct msm_iommu_priv *priv = to_msm_priv(domain);
        struct msm_iommu_ctx_drvdata *ctx;
 
        list_for_each_entry(ctx, &priv->list_attached, attached_elm) {
@@ -835,8 +838,8 @@ int msm_iommu_get_scm_call_avail(void)
 }
 
 static struct iommu_ops msm_iommu_ops = {
-       .domain_init = msm_iommu_domain_init,
-       .domain_destroy = msm_iommu_domain_destroy,
+       .domain_alloc = msm_iommu_domain_alloc,
+       .domain_free = msm_iommu_domain_free,
        .attach_dev = msm_iommu_attach_dev,
        .detach_dev = msm_iommu_detach_dev,
        .map = msm_iommu_map,