Lines Matching full:vde

17 #include "vde.h"
19 int tegra_vde_iommu_map(struct tegra_vde *vde, in tegra_vde_iommu_map() argument
29 end = vde->domain->geometry.aperture_end; in tegra_vde_iommu_map()
30 size = iova_align(&vde->iova, size); in tegra_vde_iommu_map()
31 shift = iova_shift(&vde->iova); in tegra_vde_iommu_map()
33 iova = alloc_iova(&vde->iova, size >> shift, end >> shift, true); in tegra_vde_iommu_map()
37 addr = iova_dma_addr(&vde->iova, iova); in tegra_vde_iommu_map()
39 size = iommu_map_sgtable(vde->domain, addr, sgt, in tegra_vde_iommu_map()
42 __free_iova(&vde->iova, iova); in tegra_vde_iommu_map()
51 void tegra_vde_iommu_unmap(struct tegra_vde *vde, struct iova *iova) in tegra_vde_iommu_unmap() argument
53 unsigned long shift = iova_shift(&vde->iova); in tegra_vde_iommu_unmap()
55 dma_addr_t addr = iova_dma_addr(&vde->iova, iova); in tegra_vde_iommu_unmap()
57 iommu_unmap(vde->domain, addr, size); in tegra_vde_iommu_unmap()
58 __free_iova(&vde->iova, iova); in tegra_vde_iommu_unmap()
61 int tegra_vde_iommu_init(struct tegra_vde *vde) in tegra_vde_iommu_init() argument
63 struct device *dev = vde->dev; in tegra_vde_iommu_init()
69 vde->group = iommu_group_get(dev); in tegra_vde_iommu_init()
70 if (!vde->group) in tegra_vde_iommu_init()
81 vde->domain = iommu_paging_domain_alloc(dev); in tegra_vde_iommu_init()
82 if (IS_ERR(vde->domain)) { in tegra_vde_iommu_init()
83 err = PTR_ERR(vde->domain); in tegra_vde_iommu_init()
84 vde->domain = NULL; in tegra_vde_iommu_init()
92 order = __ffs(vde->domain->pgsize_bitmap); in tegra_vde_iommu_init()
93 init_iova_domain(&vde->iova, 1UL << order, 0); in tegra_vde_iommu_init()
95 err = iommu_attach_group(vde->domain, vde->group); in tegra_vde_iommu_init()
100 * We're using some static addresses that are not accessible by VDE in tegra_vde_iommu_init()
103 shift = iova_shift(&vde->iova); in tegra_vde_iommu_init()
104 iova = reserve_iova(&vde->iova, 0x60000000 >> shift, in tegra_vde_iommu_init()
111 vde->iova_resv_static_addresses = iova; in tegra_vde_iommu_init()
116 * of address space and VDE can't handle that. Hence simply reserve in tegra_vde_iommu_init()
119 iova = reserve_iova(&vde->iova, 0xffffffff >> shift, in tegra_vde_iommu_init()
126 vde->iova_resv_last_page = iova; in tegra_vde_iommu_init()
131 __free_iova(&vde->iova, vde->iova_resv_static_addresses); in tegra_vde_iommu_init()
133 iommu_detach_group(vde->domain, vde->group); in tegra_vde_iommu_init()
135 put_iova_domain(&vde->iova); in tegra_vde_iommu_init()
138 iommu_domain_free(vde->domain); in tegra_vde_iommu_init()
140 iommu_group_put(vde->group); in tegra_vde_iommu_init()
145 void tegra_vde_iommu_deinit(struct tegra_vde *vde) in tegra_vde_iommu_deinit() argument
147 if (vde->domain) { in tegra_vde_iommu_deinit()
148 __free_iova(&vde->iova, vde->iova_resv_last_page); in tegra_vde_iommu_deinit()
149 __free_iova(&vde->iova, vde->iova_resv_static_addresses); in tegra_vde_iommu_deinit()
150 iommu_detach_group(vde->domain, vde->group); in tegra_vde_iommu_deinit()
151 put_iova_domain(&vde->iova); in tegra_vde_iommu_deinit()
153 iommu_domain_free(vde->domain); in tegra_vde_iommu_deinit()
154 iommu_group_put(vde->group); in tegra_vde_iommu_deinit()
156 vde->domain = NULL; in tegra_vde_iommu_deinit()