2 * Copyright (C) 2013 Red Hat
3 * Author: Rob Clark <robdclark@gmail.com>
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 as published by
7 * the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program. If not, see <http://www.gnu.org/licenses/>.
23 struct iommu_domain
*domain
;
25 #define to_msm_iommu(x) container_of(x, struct msm_iommu, base)
27 static int msm_fault_handler(struct iommu_domain
*domain
, struct device
*dev
,
28 unsigned long iova
, int flags
, void *arg
)
30 struct msm_iommu
*iommu
= arg
;
31 if (iommu
->base
.handler
)
32 return iommu
->base
.handler(iommu
->base
.arg
, iova
, flags
);
33 pr_warn_ratelimited("*** fault: iova=%08lx, flags=%d\n", iova
, flags
);
37 static int msm_iommu_attach(struct msm_mmu
*mmu
, const char * const *names
,
40 struct msm_iommu
*iommu
= to_msm_iommu(mmu
);
43 pm_runtime_get_sync(mmu
->dev
);
44 ret
= iommu_attach_device(iommu
->domain
, mmu
->dev
);
45 pm_runtime_put_sync(mmu
->dev
);
50 static void msm_iommu_detach(struct msm_mmu
*mmu
, const char * const *names
,
53 struct msm_iommu
*iommu
= to_msm_iommu(mmu
);
55 pm_runtime_get_sync(mmu
->dev
);
56 iommu_detach_device(iommu
->domain
, mmu
->dev
);
57 pm_runtime_put_sync(mmu
->dev
);
60 static int msm_iommu_map(struct msm_mmu
*mmu
, uint64_t iova
,
61 struct sg_table
*sgt
, unsigned len
, int prot
)
63 struct msm_iommu
*iommu
= to_msm_iommu(mmu
);
66 // pm_runtime_get_sync(mmu->dev);
67 ret
= iommu_map_sg(iommu
->domain
, iova
, sgt
->sgl
, sgt
->nents
, prot
);
68 // pm_runtime_put_sync(mmu->dev);
71 return (ret
== len
) ? 0 : -EINVAL
;
74 static int msm_iommu_unmap(struct msm_mmu
*mmu
, uint64_t iova
,
75 struct sg_table
*sgt
, unsigned len
)
77 struct msm_iommu
*iommu
= to_msm_iommu(mmu
);
79 pm_runtime_get_sync(mmu
->dev
);
80 iommu_unmap(iommu
->domain
, iova
, len
);
81 pm_runtime_put_sync(mmu
->dev
);
86 static void msm_iommu_destroy(struct msm_mmu
*mmu
)
88 struct msm_iommu
*iommu
= to_msm_iommu(mmu
);
89 iommu_domain_free(iommu
->domain
);
93 static const struct msm_mmu_funcs funcs
= {
94 .attach
= msm_iommu_attach
,
95 .detach
= msm_iommu_detach
,
97 .unmap
= msm_iommu_unmap
,
98 .destroy
= msm_iommu_destroy
,
101 struct msm_mmu
*msm_iommu_new(struct device
*dev
, struct iommu_domain
*domain
)
103 struct msm_iommu
*iommu
;
105 iommu
= kzalloc(sizeof(*iommu
), GFP_KERNEL
);
107 return ERR_PTR(-ENOMEM
);
109 iommu
->domain
= domain
;
110 msm_mmu_init(&iommu
->base
, dev
, &funcs
);
111 iommu_set_fault_handler(domain
, msm_fault_handler
, iommu
);