Lines Matching +full:iommu +full:- +full:map

1 // SPDX-License-Identifier: GPL-2.0-only
7 #include <linux/adreno-smmu-priv.h>
8 #include <linux/io-pgtable.h>
36 struct io_pgtable_ops *ops = pagetable->pgtbl_ops; in msm_iommu_pagetable_unmap()
41 unmapped += ops->unmap(ops, iova, 4096, NULL); in msm_iommu_pagetable_unmap()
43 size -= 4096; in msm_iommu_pagetable_unmap()
46 iommu_flush_iotlb_all(to_msm_iommu(pagetable->parent)->domain); in msm_iommu_pagetable_unmap()
48 return (unmapped == size) ? 0 : -EINVAL; in msm_iommu_pagetable_unmap()
55 struct io_pgtable_ops *ops = pagetable->pgtbl_ops; in msm_iommu_pagetable_map()
61 for_each_sg(sgt->sgl, sg, sgt->nents, i) { in msm_iommu_pagetable_map()
62 size_t size = sg->length; in msm_iommu_pagetable_map()
65 /* Map the block one page at a time */ in msm_iommu_pagetable_map()
67 if (ops->map(ops, addr, phys, 4096, prot, GFP_KERNEL)) { in msm_iommu_pagetable_map()
69 return -EINVAL; in msm_iommu_pagetable_map()
74 size -= 4096; in msm_iommu_pagetable_map()
85 struct msm_iommu *iommu = to_msm_iommu(pagetable->parent); in msm_iommu_pagetable_destroy() local
87 dev_get_drvdata(pagetable->parent->dev); in msm_iommu_pagetable_destroy()
91 * disable TTBR0 in the arm-smmu driver in msm_iommu_pagetable_destroy()
93 if (atomic_dec_return(&iommu->pagetables) == 0) in msm_iommu_pagetable_destroy()
94 adreno_smmu->set_ttbr0_cfg(adreno_smmu->cookie, NULL); in msm_iommu_pagetable_destroy()
96 free_io_pgtable_ops(pagetable->pgtbl_ops); in msm_iommu_pagetable_destroy()
105 if (mmu->type != MSM_MMU_IOMMU_PAGETABLE) in msm_iommu_pagetable_params()
106 return -EINVAL; in msm_iommu_pagetable_params()
111 *ttbr = pagetable->ttbr; in msm_iommu_pagetable_params()
114 *asid = pagetable->asid; in msm_iommu_pagetable_params()
120 .map = msm_iommu_pagetable_map,
148 struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(parent->dev); in msm_iommu_pagetable_create()
149 struct msm_iommu *iommu = to_msm_iommu(parent); in msm_iommu_pagetable_create() local
156 if (adreno_smmu->cookie) in msm_iommu_pagetable_create()
157 ttbr1_cfg = adreno_smmu->get_ttbr1_cfg(adreno_smmu->cookie); in msm_iommu_pagetable_create()
159 return ERR_PTR(-ENODEV); in msm_iommu_pagetable_create()
163 return ERR_PTR(-ENOMEM); in msm_iommu_pagetable_create()
165 msm_mmu_init(&pagetable->base, parent->dev, &pagetable_funcs, in msm_iommu_pagetable_create()
175 pagetable->pgtbl_ops = alloc_io_pgtable_ops(ARM_64_LPAE_S1, in msm_iommu_pagetable_create()
176 &ttbr0_cfg, iommu->domain); in msm_iommu_pagetable_create()
178 if (!pagetable->pgtbl_ops) { in msm_iommu_pagetable_create()
180 return ERR_PTR(-ENOMEM); in msm_iommu_pagetable_create()
185 * the arm-smmu driver as a trigger to set up TTBR0 in msm_iommu_pagetable_create()
187 if (atomic_inc_return(&iommu->pagetables) == 1) { in msm_iommu_pagetable_create()
188 ret = adreno_smmu->set_ttbr0_cfg(adreno_smmu->cookie, &ttbr0_cfg); in msm_iommu_pagetable_create()
190 free_io_pgtable_ops(pagetable->pgtbl_ops); in msm_iommu_pagetable_create()
197 pagetable->parent = parent; in msm_iommu_pagetable_create()
198 pagetable->ttbr = ttbr0_cfg.arm_lpae_s1_cfg.ttbr; in msm_iommu_pagetable_create()
206 pagetable->asid = 0; in msm_iommu_pagetable_create()
208 return &pagetable->base; in msm_iommu_pagetable_create()
214 struct msm_iommu *iommu = arg; in msm_fault_handler() local
215 if (iommu->base.handler) in msm_fault_handler()
216 return iommu->base.handler(iommu->base.arg, iova, flags); in msm_fault_handler()
223 struct msm_iommu *iommu = to_msm_iommu(mmu); in msm_iommu_detach() local
225 iommu_detach_device(iommu->domain, mmu->dev); in msm_iommu_detach()
231 struct msm_iommu *iommu = to_msm_iommu(mmu); in msm_iommu_map() local
234 /* The arm-smmu driver expects the addresses to be sign extended */ in msm_iommu_map()
238 ret = iommu_map_sgtable(iommu->domain, iova, sgt, prot); in msm_iommu_map()
241 return (ret == len) ? 0 : -EINVAL; in msm_iommu_map()
246 struct msm_iommu *iommu = to_msm_iommu(mmu); in msm_iommu_unmap() local
251 iommu_unmap(iommu->domain, iova, len); in msm_iommu_unmap()
258 struct msm_iommu *iommu = to_msm_iommu(mmu); in msm_iommu_destroy() local
259 iommu_domain_free(iommu->domain); in msm_iommu_destroy()
260 kfree(iommu); in msm_iommu_destroy()
265 .map = msm_iommu_map,
272 struct msm_iommu *iommu; in msm_iommu_new() local
276 return ERR_PTR(-ENODEV); in msm_iommu_new()
278 iommu = kzalloc(sizeof(*iommu), GFP_KERNEL); in msm_iommu_new()
279 if (!iommu) in msm_iommu_new()
280 return ERR_PTR(-ENOMEM); in msm_iommu_new()
282 iommu->domain = domain; in msm_iommu_new()
283 msm_mmu_init(&iommu->base, dev, &funcs, MSM_MMU_IOMMU); in msm_iommu_new()
284 iommu_set_fault_handler(domain, msm_fault_handler, iommu); in msm_iommu_new()
286 atomic_set(&iommu->pagetables, 0); in msm_iommu_new()
288 ret = iommu_attach_device(iommu->domain, dev); in msm_iommu_new()
290 kfree(iommu); in msm_iommu_new()
294 return &iommu->base; in msm_iommu_new()